我根据使用 生成的音频文件sox
和图像文件生成了 200 个视频文件。大多数剪辑短于一秒,没有一个超过 6 秒。然后我将这些文件连接起来,最终结果的总延迟约为 2 秒。
我相信这可能是由于音频和视频轨道被独立连接所致。
我可以使用 ffprobe 找出视频和音频轨道(流)的确切持续时间。仅在其中一个短文件中,我就可以看到持续时间不同:
ffprobe file001.webm
Input #0, matroska,webm, from 'file001.webm':
Metadata:
ENCODER : Lavf58.20.100
Duration: 00:00:00.92, start: 0.000000, bitrate: 211 kb/s
Stream #0:0: Video: vp8, yuv420p, 1100x140, SAR 1:1 DAR 55:7, 25 fps, 25 tbr, 1k tbn, 1k tbc (default)
Metadata:
ENCODER : Lavc58.35.100 libvpx
DURATION : 00:00:00.923000000
Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
Metadata:
ENCODER : Lavc58.35.100 libvorbis
DURATION : 00:00:00.908000000
如何才能使一个视频文件中的视频和音轨的时长完全相同?
我正在使用 vpx/vorbix/webm(因为无法理解 mpeg2ts 问题的原因)但我会使用任何格式来完成它。
我还可以给音频添加静音填充以使它们的持续时间相匹配。
答案1
这基本上不值得付出努力。音频帧的持续时间是固定的,取决于编解码器和采样率。例如,aac 是 1024/采样率。例如 1024/48000 ~ 21.333 毫秒。因此,如果您将视频重新采样为其完美倍数,理论上它将是精确的。假设容器根本不修改它。否则,您可以修改音频编码器以控制使用的启动样本数量,这将使您能够获得部分第一音频帧。但同样,每个编解码器都不同。否则,您可以使用 VFR,并手动设置最终帧持续时间(如果容器支持)。最后,您可以更改 mp4 中的编辑列表并使用可以保证支持的播放器。
我不知道是否有现成的工具可以完成这些事情。