【问题标题】:How to concat multiple video files which have different stream order with FFmpeg?如何使用 FFmpeg 连接具有不同流顺序的多个视频文件?
【发布时间】:2019-06-26 07:10:22
【问题描述】:

我有 3 个包含以下信息的视频文件:

Input #0, mpegts, from '01.ts':
  Duration: 00:00:06.08, start: 0.000000, bitrate: 931 kb/s
  Program 1
    Stream #0:0[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 65 kb/s
    Stream #0:1[0x102]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 852x480 [SAR 640:639 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc


Input #0, mpegts, from '02.ts':
  Duration: 00:00:06.06, start: 6.016000, bitrate: 872 kb/s
    Stream #0:0[0x102]: Video: h264 (High), yuv420p(progressive), 852x480 [SAR 640:639 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x101]: Audio: aac (LC), 48000 Hz, stereo, fltp, 66 kb/s


Input #0, mpegts, from '03.ts':
  Duration: 00:00:06.07, start: 12.010667, bitrate: 822 kb/s
    Stream #0:0[0x102]: Video: h264 (High), yuv420p(progressive), 852x480 [SAR 640:639 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x101]: Audio: aac (LC), 48000 Hz, stereo, fltp, 69 kb/s

它们中的大多数是相同的,但不知何故 01.ts 与其他两个具有不同的流顺序。我的问题是,如何连接它们?我试图把它们放在一个 txt 文件中并 concat:

-f concat -safe 0 -i video_file.txt -c copy -bsf:a aac_adtstoasc output.mp4

但它不起作用。错误信息是:

Error parsing ADTS frame header!
Error applying bitstream filters to an output packet for stream #0:1.

如果我有数百个视频文件可能有不同的流顺序怎么办?

编辑

aergistal's answer是正确的,但我还有一个问题:在另一个视频集合中,流ID不同,如下:

Input #0, mpegts, from 'another1.ts':
  Duration: 00:00:08.04, start: 17.401333, bitrate: 284 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x288 [SAR 16:11 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 124 kb/s


Input #0, mpegts, from 'another2.ts':
  Duration: 00:00:08.04, start: 33.401333, bitrate: 300 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x288 [SAR 16:11 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 145 kb/s

有没有办法自动设置exact_stream_id 而不是每次都检查它?

【问题讨论】:

    标签: audio video ffmpeg concatenation


    【解决方案1】:

    concat demuxer 有一个 exact_stream_id 可能会有所帮助。为您的连接列表 (video_file.txt) 使用 PID 和以下格式:

    file 01.ts
    stream
    exact_stream_id 0x102
    stream
    exact_stream_id 0x101
    
    file 02.ts
    stream
    exact_stream_id 0x102
    stream
    exact_stream_id 0x101
    
    file 03.ts
    stream
    exact_stream_id 0x102
    stream
    exact_stream_id 0x101
    
    

    【讨论】:

    • 谢谢,这行得通。但是我遇到了另一个关于不同流 id 的问题。我在问题编辑部分添加了详细信息,你能帮帮我吗?
    • 您可以使用ffprobe 打印有关流的信息,包括ID:ffprobe -show_streamsffprobe -show_entries stream=id。它还可以输出 CSV、JSON 等。查看文档。
    猜你喜欢
    • 1970-01-01
    • 2019-12-13
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2019-01-04
    相关资源
    最近更新 更多