如何合并不同比特率的 MP4 文件?

如何合并不同比特率的 MP4 文件?

我想用 MPEG-4 AVC 视频编解码器和 MP3(有时是 MP3 Surround)音频编解码器合并两个或三个 MP4 视频。音频和视频可以有不同的比特率。如果可能的话,无需转码。我已经尝试使用 FFmpeg、MP4Box 和 AviDemux,但没有成功。我正在寻找一种可以仅使用命令行执行的解决方案。

每部电影均由具有 Two-Pass 选项的 AviDemux 编码。

以下是我尝试使用 AviDemux 的方法:

avidemux --force-alt-h264 --load video1.mp4 --append video2.mp4 --output-format MP4 --save output.mp4 --quit

如何使用 FFmpeg:

ffmpeg -y -f concat -i list.txt -c copy output.mp4

如何使用 MP4Box:

MP4Box -cat video1.mp4 -cat video2.mp4 -new output.mp4

有时它完全失败,但有时它给我的视频中第一个文件播放良好,但第二个文件已损坏。

avprobe这两个文件的命令返回以下内容:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ad.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    title           : ad.mp4
    encoder         : Lavf52.78.3
  Duration: 00:00:03.28, start: 0.000000, bitrate: 446 kb/s
    Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 312 kb/s, 25 fps, 25 tbr, 25025 tbn, 50 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: mp3, 48000 Hz, 2 channels, s16p, 126 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00

 

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ad-chipmunkove.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    title           : ad-chipmunkove.mp4
    encoder         : Lavf52.78.3
  Duration: 00:00:29.96, start: 0.000000, bitrate: 2946 kb/s
    Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 2813 kb/s, 25 fps, 25 tbr, 25025 tbn, 50 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: mp3, 48000 Hz, 2 channels, s16p, 127 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00

FFmpeg 合并这个:

[concat @ 0xb03ae40] Estimating duration from bitrate, this may be inaccurate
Input #0, concat, from 'list.txt':
  Duration: 00:00:00.00, start: 0.000000, bitrate: 440 kb/s
    Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 312 kb/s, 25 fps, 25 tbr, 25025 tbn, 50 tbc
    Stream #0:1: Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 126 kb/s
Output #0, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf55.41.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 312 kb/s, 25 fps, 25025 tbn, 25025 tbc
    Stream #0:1: Audio: mp3 (i[0][0][0] / 0x0069), 48000 Hz, stereo, 126 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=  831 fps=0.0 q=-1.0 Lsize=   10961kB time=00:00:33.23 bitrate=2702.0kbits/s
video:10414kB audio:518kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.266208%

结果视频的第二部分看起来这边走,但音频工作正常。

答案1

连接 MP4 文件(即使比特率不同)应该可以正常工作。这是使用 MPEG-DASH 进行 HTTP 自适应流式传输的基本假设。如果解码器配置完全相同,则保持原样。如果不完全相同(但兼容),则样本描述框stsd将有多个条目。

对于 MP4Box,这看起来像是一个错误。我建议你提交一个问题这里包含一些示例文件的链接。

相关内容