【问题标题】:FFmpeg Automatically Synchronize Audio and VideoFFmpeg 自动同步音视频
【发布时间】:2023-03-05 07:50:01
【问题描述】:

我有两个独立的流,音频(line-in,pulseaudio)和视频(ip-camera,rtsp),我想自动同步。

到目前为止我想出的最好的是ffmpeg-itsoffset,但偏移量实际上是不同的。

有什么方法可以在命令行上可靠地自动执行此操作(不一定需要是 ffmpeg)?

相机和电脑运行ntp客户端,pulseaudio的输入延迟可以忽略不计,应该可以解决。

【问题讨论】:

    标签: linux video ffmpeg synchronization video-processing


    【解决方案1】:

    我发现openRTSP(Debian 上的livemedia-utils,Arch 上的live-media)获取参数o ...(使用任意RTSP 示例源)

    $ openRTSP -r rtsp://109.98.78.106
    Created new TCP socket 3 for connection
    Connecting to 109.98.78.106, port 554 on socket 3...
    ...remote connection opened
    [...]
    o=- 1604163122724055 1 IN IP4 109.98.78.106
    [...]
    

    ...这似乎是从底层 RTC 流中提取的相机 UTC 系统时间(以微秒为单位)。

    例如:

    $ date -d@$( echo $(openRTSP -r rtsp://109.98.78.106 2>&1 | grep -Po '(?<=o=-\s)\d+' | head -n1 ) / 1000000 | bc )
    Sat Oct 31 05:55:45 PM CET 2020
    

    我们使用的摄像机具有 NTP 功能。因此,我在录制计算机上设置了一个本地 NTP 服务器,作为摄像机的时间源。

    从延迟...

    time_camera () {
      # Returns cameras system time as embedded in the RTC stream in nanoseconds after UNIX 0
      echo $(($(openRTSP -r ${STREAM_CAMERA} 2>&1 | grep -Po '(?<=o=-\s)\d+' | head -n1)000))
      }
    time_local () {
      # Returns local system time in nanoseconds after UNIX 0
      date +%s%N
    }
    vdelay=$(($(time_local) - $(time_camera)))
    

    ...我可以估计帧到达需要多长时间。 您可以根据自己的需要对其进行微调。

    对我来说,它大约是 (900 +- 200) 毫秒,并且非常匹配音频-视频偏移量。

    如上所述,我使用 Pulseaudio,因此可以(定期)直接设置输入延迟偏移量,而不必与 ffmpeg 的 -itsoffset 通过:

    # See: pacmd list-cards
    pacmd set-port-latency-offset <card> <port> $((vdelay/1000))
    

    【讨论】:

      猜你喜欢
      • 2012-03-16
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2012-10-02
      • 2016-05-25
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多