【问题标题】:ffmpeg concat drops audio framesffmpeg concat 丢弃音频帧
【发布时间】:2018-03-16 14:08:57
【问题描述】:

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

ffmpeg -i video.mp4 -ss 56 -t 4 out1.mp4
ffmpeg -i video.mp4 -ss 60 -t 4 out2.mp4

创建包含 video.mp4 的 00:00:56 到 00:01:00 的 out1.mp4 和包含 00:01:00 到 00:01:04 的 out2.mp4。但是,稍后我希望能够再次快速重新组合它们(即,无需重新编码),所以我使用concat demuxer

ffmpeg -f concat -safe 0 -i files.txt -c copy concat.mp4

files.txt 包含在哪里

file out1.mp4
file out2.mp4

理论上应该让我返回 video.mp4 的 00:00:56 到 00:01:04,但是在发生连接时总是会丢失音频帧,从而产生非常令人不快的声音伪像,即音频 blip ,如果你愿意的话。

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

【问题讨论】:

    标签: audio video ffmpeg mp4 concat


    【解决方案1】:

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

    ffmpeg -i video.mp4 -c:a pcm_s16le -ss 56 -t 4 out1.mov
    ...
    

    然后

    ffmpeg -f concat -safe 0 -i files.txt -c:v copy concat.mp4
    

    【讨论】:

    • 对不起,我使用的是 -c copy .. 我编辑包括在内。但是您的解决方案有效!您能否解释原因或提供任何可以提供更多详细信息的来源。我的假设是,最初我将音频编码为 AAC,并且压缩可能会在边界处产生明显的(连接时)效果。这是正确的吗?
    • MP3、AAC 等基于 DCT 的音频编解码器依赖相邻的音频帧进行解码。在流的开始,有一个启动帧用于此目的。它有一个负时间戳,因此在 concat 期间,它的 TS 与前一个文件的最终数据包发生冲突,并被 concat 丢弃。 PCM 是独立解码的,所以不会受此影响。
    • @Gyan MP4 容器是否不支持任何“非 DCT-Based”编解码器,所以我们不需要为此更改容器?
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2019-03-13
    • 2017-04-13
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多