我根據使用 生成的音訊檔案sox
並結合圖像檔案生成了 200 個視訊檔案。大多數剪輯都短於 1 秒,沒有一個長於 6 秒。
我相信這可能是由於音訊和視訊軌道是獨立連接的。
我可以使用 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中的編輯清單並使用可以保證支援的播放器。
我不知道是否有現成的工具可以完成這些事情。