我正在开发具有录制功能的1-1视频通话的平台。为了我的目的,我使用以下堆栈:WebRTC,Kurento Media Server,FFmpeg。
它可以在理想的环境中完美运行,但是如果我的用户的连接质量很差,那么在录制后,我会发现音频和视频轨道不同步存在很多问题。
据我了解,问题是由于时间戳不正确而引起的,所以我正在做一些后期处理,生成新的时间戳,这很有帮助!
这是命令示例:
ffmpeg -fflags +genpts -acodec libopus -vcodec libvpx \
-i in.webm \
-filter_complex "fps=30, setpts=PTS-STARTPTS" \
-acodec libvorbis -vcodec libvpx \
-vsync 1 -async 1 -r 30 -threads 4 out.webm
在那之后,我又遇到了一个问题。如果用户连接状况不佳,WebRTC可以动态更改视频分辨率。对此类视频(在视频中具有不同的分辨率)进行后处理之后,我看到了冻结的图像,直到视频结束为止,并且从动态更改分辨率的那一刻开始。 FFmpeg日志中没有错误,只有有关更改分辨率的信息:
[libvpx @ 0x559335713440] dimension change! 480x270 -> 320x180
-async is forwarded to lavfi similarly to -af aresample=async=1:min_hard_comp=0.100000.
分析日志后,我意识到问题是由于STARTPTS参数引起的,该参数在自动更改扩展名后变得非常大(等于之前的帧数)。我试图删除STARTPTS并仅保留PTS。
此后,视频开始运行良好,但是直到动态更改视频分辨率,然后音频和视频轨道才再次不同步。
在修复时间戳之前,我尝试将视频缩放到静态分辨率,这很有帮助。但这是额外的工作。命令示例:
ffmpeg -acodec libopus -vcodec libvpx \
-i in.webm \
-vf scale=640:480 \
-acodec libvorbis -vcodec libvpx \
-threads 4 out.webm
我也尝试使用filter_complex组合这两个命令,但是没有用。
到目前为止,我与FFmpeg的合作时间不多,所以,也许我做错了什么?也许有一些更简单的方法可以做到这一点?
既然Kurento使用GStreamer进行视频记录,那么也许重新配置Kurento来修复视频记录中的时间戳是一个更好的选择?
我可以提供我使用的任何视频和命令。
我正在使用: Kurento Media Server 6.9.0, FFmpeg 4.1