我在尝试连接三个 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
。