基于墙钟时间合并独立录制的webm音视频文件的方案咨询
问题根因
ffmpeg 参数遵循输入参数放在 -i 之前、输出参数放在 -i 之后的生效规则,你当前将-use_wallclock_as_timestamps、-timestamps mono2abs这类作用于输入流的时间参数放在了-i pipe:0之后,完全没有生效,因此输出文件的pts始终从0开始计算。
解决方法
方案1:调整录制参数,直接写入绝对时间戳
将输入侧的时间参数移到 -i pipe:0 之前,同时关闭输出侧自动修正负时间戳的逻辑,修正后的完整参数如下:
'-loglevel', 'debug', '-reorder_queue_size', '0', '-protocol_whitelist', 'pipe,udp,rtp', '-fflags', '+genpts+igndts', '-use_wallclock_as_timestamps', '1', '-timestamps', 'mono2abs', '-f', 'sdp', '-i', 'pipe:0', '-map', '0:v:0', '-c:v', 'copy', '-avoid_negative_ts', 'disabled', '-flags', '+global_header', './recordings/video_1627600996166.webm'
音频录制参数也按照相同逻辑调整,将时间相关参数移到输入参数前即可。
录制完成后可用ffprobe -show_packets <文件路径>验证,此时pts_time字段会显示对应帧的Unix时间戳(秒级),不再从0开始。
合并音视频时直接拷贝流即可,ffmpeg会自动根据绝对时间戳对齐音画,无需额外调整。
方案2:不改录制参数,用文件名时间戳对齐
你当前的文件名已经携带了ffmpeg进程启动的毫秒级Unix时间戳,合并时可直接用该时间计算偏移量对齐:
- 提取音视频文件的启动时间戳,比如
video_1627600996166.webm的启动时间为1627600996166ms,audio_1627600996200.webm的启动时间为1627600996200ms - 计算偏移量:
(晚启动的文件时间 - 早启动的文件时间)/1000,上述例子中音频比视频晚启动34ms,偏移量为0.034 - 合并时使用
-itsoffset参数给晚启动的流加偏移,命令示例:
ffmpeg -i video_1627600996166.webm -itsoffset 0.034 -i audio_1627600996200.webm -c:v copy -c:a copy output.webm
分段录制的多文件合并也可使用相同逻辑,每个分段的偏移量为该分段文件名时间戳与首个分段时间戳的差值换算的秒数。
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

