ffmpeg concat丢弃音频帧

Sha*_*aun 2 audio video mp4 concat ffmpeg

我有一个mp4文件,我想把视频的两个连续部分输出并将它们渲染为单独的文件,然后将它们重新组合回原始视频.例如,通过我的视频video.mp4,我可以运行

ffmpeg -i video.mp4 -ss 56 -t 4 out1.mp4
ffmpeg -i video.mp4 -ss 60 -t 4 out2.mp4
Run Code Online (Sandbox Code Playgroud)

创建out1.mp4包含00:00:56到00:01:00 video.mp4,out2.mp4其中包含00:01:00到00:01:04.但是,后来我希望能够快速重新组合它们(即没有重新编码),所以我使用了concat demuxer,

ffmpeg -f concat -safe 0 -i files.txt -c copy concat.mp4
Run Code Online (Sandbox Code Playgroud)

哪里files.txt包含

file out1.mp4
file out2.mp4
Run Code Online (Sandbox Code Playgroud)

理论上应该给我回到00:00:56到00:01:04 video.mp4,但是在连续发生时总会丢失音频帧,如果你愿意的话,会产生非常不愉快的声音效果,音频短片.

丢失音频帧

我已经尝试过使用async-af apad最初创建视频的两个部分,但我仍面临同样的问题,并没有在其他地方找到解决方案.我在多个不同的用例中遇到过这个问题,所以希望这个简单的例子可以解释真正的问题.

Gya*_*yan 7

我建议您使用PCM音频将片段导出到MOV,然后将这些片段连接到重新编码音频.

ffmpeg -i video.mp4 -c:a pcm_s16le -ss 56 -t 4 out1.mov
...
Run Code Online (Sandbox Code Playgroud)

然后

ffmpeg -f concat -safe 0 -i files.txt -c:v copy concat.mp4
Run Code Online (Sandbox Code Playgroud)

  • 基于DCT的音频编解码器(如MP3,AAC)依赖于相邻的音频帧进行解码.在流的开始处,有一个用于此目的的启动框架.它有一个负时间戳,所以在concat期间,它的TS与前一个文件的最后一个数据包冲突,它被concat删除.PCM是独立的,用于解码,因此不会受此影响. (2认同)