FFMPEG 的 Concat 解复用器是否需要相同的流结构?

FFMPEG 的 Concat 解复用器是否需要相同的流结构?

我在尝试连接三个 mp4 视频文件时遇到了问题。第一个和最后一个视频是我在 FFMPEG 中创建的,包含一系列标题和片尾幻灯片。中间的视频是从 BlackMagic HyperDeck 拍摄的录像。

但是,连接后中心视频总是被压缩,就好像它被更改为错误的帧速率一样。我尽可能尝试使用与源相同的设置来创建标题和结尾视频;这是连接解复用的要求 - 目前我能看到的唯一大区别是主视频有三个流;视频、时间码数据流和音频。但是标题幻灯片有两个流。

时间码是否是导致我出现问题的根源?FFMPEG 以某种方式尝试将标题流的音频与主视频的数据流连接起来?

用于创建标题视频的命令

注意:目前我只使用空音频;我想进入此文件中有音频的阶段。您还可以看到,我已尝试创建一个具有与源完全相同的帧速率、时间尺度和音频速率的视频文件。

ffmpeg.exe -loop 1 -r 59.94 -t 5 -i intro0.png
           -loop 1 -r 59.94 -t 5 -i intro1.png 
           -f lavfi -i anullsrc
           -s 1920x1080 -filter_complex 
           "[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0];
            [0][f0]overlay[bg1],format=yuv420p[v]"
            -map "[v]" -map 2:a -c:v libx264 
            -b:v 1000k -pix_fmt yuv420p -video_track_timescale 60000 
            -c:a aac -ar 48000 -ac 2 -sample_fmt fltp -t 8 intro.mp4

FFProbe 输出来自简介

ffprobe.exe intro.mp4
ffprobe version git-2020-08-31-4a11a6f Copyright (c) 2007-2020 the FFmpeg developers
  built with gcc 10.2.1 (GCC) 20200805
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass
--enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --enable-librav1e --enable-libsvtav1 --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
  libavutil      56. 58.100 / 56. 58.100
  libavcodec     58.101.101 / 58.101.101
  libavformat    58. 51.101 / 58. 51.101
  libavdevice    58. 11.101 / 58. 11.101
  libavfilter     7. 87.100 /  7. 87.100
  libswscale      5.  8.100 /  5.  8.100
  libswresample   3.  8.100 /  3.  8.100
  libpostproc    55.  8.100 / 55.  8.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'intro.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.51.101
  Duration: 00:00:10.02, start: 0.000000, bitrate: 1061 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 1167 kb/s, 59.94 fps, 59.94
tbr, 60k tbn, 119.88 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 2 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

HyperDeck Recording 的 FFProbe 输出

ffprobe.exe test1.mp4
ffprobe version git-2020-08-31-4a11a6f Copyright (c) 2007-2020 the FFmpeg developers
  built with gcc 10.2.1 (GCC) 20200805
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass
--enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --enable-librav1e --enable-libsvtav1 --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
  libavutil      56. 58.100 / 56. 58.100
  libavcodec     58.101.101 / 58.101.101
  libavformat    58. 51.101 / 58. 51.101
  libavdevice    58. 11.101 / 58. 11.101
  libavfilter     7. 87.100 /  7. 87.100
  libswscale      5.  8.100 /  5.  8.100
  libswresample   3.  8.100 /  3.  8.100
  libpostproc    55.  8.100 / 55.  8.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: iso4avc1isom
    creation_time   : 2020-12-22T02:16:32.000000Z
    com.apple.proapps.reel: 1
    com.apple.proapps.scene: 1
    com.apple.proapps.shot: 176
    com.blackmagic-design.camera.environment: interior
    com.blackmagic-design.camera.dayNight: day
    com.apple.proapps.cameraName: A
    com.blackmagic-design.camera.dateRecorded: 20201222
  Duration: 00:00:43.04, start: 0.000000, bitrate: 21402 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080, 21265 kb/s, SAR 1:1 DAR 16:9, 59.94 fps, 59.94 tbr, 60k tbn, 120k tbc (default)
    Metadata:
      creation_time   : 2020-12-22T02:16:32.000000Z
      handler_name    : ?Apple Video Media Handler
      encoder         : H264/AVC
      timecode        : 01:24:19;30
    Stream #0:1(eng): Data: none (tmcd / 0x64636D74) (default)
    Metadata:
      creation_time   : 2020-12-22T02:16:32.000000Z
      handler_name    : ?Time Code Media Handler
      timecode        : 01:24:19;30
    Stream #0:2(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2020-12-22T02:16:32.000000Z
      handler_name    : ?Apple Sound Media Handler
      timecode        : 01:24:19;30
Unsupported codec with id 0 for input stream 1

使用 Concat 命令

test.concat 包含视频文件的绝对路径

ffmpeg.exe -f concat -safe 0 -i test.concat -c copy -metadata title="Fri Test 12 Feb 2021" -metadata copyright="Me © 2021" -metadata year="2021" concatinated.mp4

背景情况 我从一个 C# 应用程序控制 FFMPEG,该应用程序从单个控制界面管理 BMD HyperDeck、BMD 电视切换器和其他几个应用程序/设备。目标是在活动结束时制作一个打包的录制内容,以便将其复制到多个设备上。我选择使用 concat 解复用器,因为它不需要重新编码任何视频;活动最长可达两个小时,我希望能够尽快将书挡贴在视频上,以便人们能够尽快获得 SD 卡。这有点妥协,因为我很想能够淡入/淡出主视频的标题,但我的理解是,这需要重新编码,而我没有时间,所以只能凑合一下。我不是 FFMPEG 专家,我通过搜索和阅读整理了我所拥有的信息。

更新 1 正如我在对 @llogan 的评论中提到的,我已确认流 1 中嵌入的时间码数据会弄乱连接。我使用以下命令将其从源中删除:

ffmpeg.exe -i test1.mp4 -c copy -map v -map :2 out.mp4

并且使用@llogan 更新的标题命令,它们可以毫无问题地连接。但是,是否可以在连接期间执行此映射,这样我就不必在该过程中添加额外的步骤了?

答案1

每个段必须具有(大部分)相同的属性才能正确连接

您已经接近了,您只需要匹配 H.264 配置文件-profile:v main

ffmpeg -loop 1 -framerate 60000/1001 -t 5 -i intro0.png
       -loop 1 -framerate 60000/1001 -t 5 -i intro1.png 
       -f lavfi -i anullsrc=r=48000:cl=stereo
       -filter_complex 
       "[0][1]xfade=transition=fade:duration=1:offset=4,scale=1920:1080,format=yuv420p[v]"
        -map "[v]" -map 2:a -c:v libx264 -profile:v main
        -c:a aac -t 8 intro.mp4

请参阅需要匹配哪些属性才能正确连接

对您的命令的更改:

  • 使用输入选项-framerate代替-r图像分离器
  • 来自 blackmagic 的视频实际上是 60000/1001,而不是 59.94。令人困惑的是,ffmpeg报告的是缩短的帧速率。ffprobe -show_streams input.mp4将显示实际速率。
  • 使用比例过滤器代替-s并将其放置在过滤器图中。
  • 直接在 anullsrc 中设置采样率和通道布局,而不是使用-ar-ac,但如果您愿意,可以保留这些选项。
  • 用过的淡入淡出而不是格式+淡入淡出+设置点+覆盖。
  • 已删除-b:v 1000k。无需手动声明比特率。编码器 libx264 将自动提供适当的值。请-crf参阅FFmpeg 维基:H.264
  • 已被删除,-pix_fmt yuv420p因为它已经通过 被应用format=yuv420p-pix_fmt yuv420p只是 的别名format=yuv420p
  • 删除是-video_track_timescale 60000因为使用-framerate 60000/1001应该提供适当的时间表,但如果您愿意,可以保留它。
  • -sample_fmt fltp由于-c:a aac仅支持 fltp而被删除。请Supported sample formats参阅ffmpeg -h encoder=aac

相关内容