繁体   English   中英

FFmpeg 自动同步音视频

[英]FFmpeg Automatically Synchronize Audio and Video

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

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

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

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

我发现openRTSPlivemedia-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 stream 中提取的相机 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM