【问题标题】:MP4Box: Concatenating track ID 1 even though sample descriptions do not matchMP4Box:即使示例描述不匹配,也会连接轨道 ID 1
【发布时间】:2021-04-29 21:04:50
【问题描述】:

基本上,我希望使用 MP4Box 连接一系列视频。当我尝试这样做时,我收到以下错误:

No suitable destination track found - creating new one (type soun)
0.500 secs Interleaving 

我可以通过在MP4Box 命令中添加一个-force-cat 参数来绕过这个问题,至少是暂时的。但是,这会导致音频和视频的对齐问题,并产生以下警告:

Concatenating track ID 1 even though sample descriptions do not match

现在,据我所知,这与视频类型之间的不同参数有关。我将在下面显示每种视频类型的ffprobe 输出,希望能对这个问题有所了解。

视频类型 1 FFPROBE 输出:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '0.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:02.25, start: 0.000000, bitrate: 851 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 816 kb/s, 4 fps, 4 tbr, 16384 tbn, 8 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: mp3 (mp4a / 0x6134706D), 24000 Hz, mono, fltp, 32 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

视频类型 2 FFPROBE 输出:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'static.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.78.100
  Duration: 00:00:01.00, start: 0.000000, bitrate: 662 kb/s
    Stream #0:0(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 654 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler

谁能确定视频类型之间的不协调是什么以及如何解决它?谢谢。

【问题讨论】:

  • 这些文件不同:H.​​264 配置文件(High vs Constrained Baseline)、时基(16384 tbn vs 30k tbn),还有一个缺少音频。重新编码一个以匹配另一个然后连接,或参见How to concatenate videos in ffmpeg with different attributes?
  • 我会使用什么软件/程序/库来重新编码?

标签: video ffmpeg mp4 codec mp4box


【解决方案1】:

问题

文件属性必须匹配,但它们是不同的。见list of attributes that must match for proper concatenation

重要的不一致:

  • H.264 配置文件(高与受限基线)
  • 时基(16384 tbn 与 30k tbn)
  • 一个有音频,另一个没有

解决方案 1:重新编码一个以匹配另一个

如果您需要在长视频中添加短片段,此方法很好。它不会影响长视频,因此会保持质量并且速度会很快。缺点是您必须确保 all of the attributes 匹配,如果您不熟悉此主题,这可能会很困难。

示例使static.mp40.mp4,使用anullsrc 过滤器生成空白/静音/虚拟/填充音频。

  1. 重新编码:

    ffmpeg -i static.mp4 -f lavfi -i anullsrc=channel_layout=mono:sample_rate=24000 -c:v libx264 -c:a libmp3lame -video_track_timescale 16384 -shortest 1.mp4
    
  2. 使input.txt 包含:

    file '0.mp4'
    file '1.mp4'
    
  3. 使用 concat demuxer 连接:

    ffmpeg -f concat -i input.txt -c copy output.mp4
    

解决方案 2:重新编码所有内容

此方法使用多个过滤器使所有输入符合一组通用参数(帧速率、宽度、高度等)。如果您的输入总是变化的或任意的,这是最有用的。它在一个命令中完成所有操作。缺点是它会重新编码所有内容并且可能会很慢。

有关许多示例,请参见 How to concatenate videos in ffmpeg with different attributes?

【讨论】:

    【解决方案2】:

    如果您知道两种介质都适合,您可以使用-force-cat。请参阅https://github.com/gpac/gpac/wiki/mp4box-import-opts 的文档。

    在您的情况下,如 ffprobe 所示,媒体来自具有不同设置/配置文件/等的两种不同编码。所以他们不适合。

    当媒体不适合时,如果您的播放器支持这种模式,您还可以告诉 GPAC 复用器将描述符放在流 ("avc3") 中,而不是放在标头 ("avc1") 中(avc1 的组合和 3 是可能的,请参阅 https://github.com/gpac/gpac/wiki/mp4box-import-opts 中的 xps_inband)。

    最后,如果这不起作用,您需要重新编码。 GPAC 也可以使用其flist 过滤器来实现这一点(请参阅https://github.com/gpac/testsuite/blob/65498a2b8f569b37c1be4bfdc34b95ba9011a9ff/scripts/filelist.sh 以了解显示使用情况的回归测试)。从 v0.9 开始,GPAC 可以利用 Ffmpeg 库重新编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      相关资源
      最近更新 更多