如何在FFMpeg中连接两个或多个具有相同宽度和不同高度的视频并保持相同的纵横比?

Posted

技术标签:

【中文标题】如何在FFMpeg中连接两个或多个具有相同宽度和不同高度的视频并保持相同的纵横比?【英文标题】:How to concatenate two or more videos with same width and different height in FFMpeg and to maintain the same aspect ratio? 【发布时间】:2020-02-19 15:27:27 【问题描述】:

我有五个视频部分要合并。每五个视频的宽度和高度相同。第二部分是另外2个视频的hstack,第三部分是另外3个视频的hstack和vstack。虽然连接所有五个视频部分,但最终视频中的纵横比并未保持不变。由于我是ffmpeg的新手,请帮助我解决问题

我已经尝试在最后使用过滤器复杂的命令并减少我每秒使用的帧大小。

"ffmpeg -i final.mp4 -vf scale=1280:480 -filter:v fps=fps=30 finalNew.mp4"

但没有任何效果。 还帮助我使用 hstack 进行缩放,以保持以下命令第二部分的纵横比

命令:ffmpeg -i vid1.mkv -i vid2.mkv -filter_complex "[0:v]scale=-1:480[v0];[0:v][1:v]hstack=inputs=2" vid3.mkv

图片

second part

third part

videochunks

我已经控制了我的视频信息

ffmpeg -i part1.mkv -i part2.mkv -i part3.mkv -i part4.mkv -i part5.mkv ffmpeg version N-94911-g197985c5bf Copyright (c) 2000-2019 the FFmpeg developers built with gcc 9.1.1 (GCC) 20190807 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-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-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf libavutil 56. 35.100 / 56. 35.100 libavcodec 58. 56.101 / 58. 56.101 libavformat 58. 32.104 / 58. 32.104 libavdevice 58. 9.100 / 58. 9.100 libavfilter 7. 58.102 / 7. 58.102 libswscale 5. 6.100 / 5. 6.100 libswresample 3. 6.100 / 3. 6.100 libpostproc 55. 6.100 / 55. 6.100 Input #0, matroska,webm, from 'part1.mkv': Metadata: ENCODER : Lavf58.32.104 Duration: 00:00:44.00, start: 0.000000, bitrate: 189 kb/s Stream #0:0(eng): Video: h264 (High), yuv420p(progressive), 640x480 [SAR 9:16 DAR 3:4], 30 fps, 30 tbr, 1k tbn, 60 tbc (default) Metadata: title : Video ENCODER : Lavc58.56.101 libx264 DURATION : 00:00:44.000000000 Input #1, matroska,webm, from 'part2.mkv': Metadata: ENCODER : Lavf58.32.104 Duration: 00:01:22.07, start: 0.000000, bitrate: 113 kb/s Stream #1:0: Video: h264 (High), yuv420p(progressive), 640x240 [SAR 9:16 DAR 3:2], 30 fps, 30 tbr, 1k tbn, 60 tbc (default) Metadata: ENCODER : Lavc58.56.101 libx264 DURATION : 00:01:22.066000000 Input #2, matroska,webm, from 'part3.mkv': Metadata: ENCODER : Lavf58.32.104 Duration: 00:00:42.03, start: 0.000000, bitrate: 405 kb/s Stream #2:0: Video: h264 (High), yuv420p(progressive), 640x720 [SAR 9:16 DAR 1:2], 30 fps, 30 tbr, 1k tbn, 60 tbc (default) Metadata: ENCODER : Lavc58.56.101 libx264 DURATION : 00:00:42.033000000 Input #3, matroska,webm, from 'part4.mkv': Metadata: ENCODER : Lavf58.32.104 Duration: 00:00:21.00, start: 0.000000, bitrate: 298 kb/s Stream #3:0: Video: h264 (High), yuv420p(progressive), 640x240 [SAR 9:16 DAR 3:2], 30 fps, 30 tbr, 1k tbn, 60 tbc (default) Metadata: ENCODER : Lavc58.56.101 libx264 DURATION : 00:00:21.000000000 Input #4, matroska,webm, from 'part5.mkv': Metadata: ENCODER : Lavf58.32.104 Duration: 00:00:16.00, start: 0.000000, bitrate: 169 kb/s Stream #4:0(eng): Video: h264 (High), yuv420p(progressive), 640x480 [SAR 9:16 DAR 3:4], 30 fps, 30 tbr, 1k tbn, 60 tbc (default) Metadata: title : Video ENCODER : Lavc58.56.101 libx264 DURATION : 00:00:16.000000000

【问题讨论】:

@Ilogan 由于您需要我输入的信息,我已经对上面的数据进行了控制台。 【参考方案1】:

如果您想保持输入的 9:16 SAR:

ffmpeg -i part1.mkv -i part2.mkv -i part3.mkv -i part4.mkv -i part5.mkv -filter_complex "[0]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=9/16[0v];[1]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=9/16[1v];[2]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=9/16[2v];[3]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=9/16[3v];[4]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=9/16[4v];[0v][1v][2v][3v][4v]concat=n=5:v=1:a=0[v]" -map "[v]" output.mp4

但是您的输入看起来很紧张,所以我假设您想要一个 1:1 的 SAR:

ffmpeg -i part1.mkv -i part2.mkv -i part3.mkv -i part4.mkv -i part5.mkv -filter_complex "[0]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=1[0v];[1]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=1[1v];[2]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=1[2v];[3]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=1[3v];[4]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=1[4v];[0v][1v][2v][3v][4v]concat=n=5:v=1:a=0[v]" -map "[v]" output.mp4

【讨论】:

首先感谢您帮助我解决问题。我有一个视频数组,可能有 5 个或更多,我无法预测哪个数组有水平堆栈或垂直堆栈。但我可以分别设置水平和垂直堆栈的 sar 和比例。所以我正在使用这些命令.. 命令 :(for %i in (*.wav) do @echo file '%i') > mylist.txt 命令:ffmpeg -f concat -i mylist.txt -c copy output.mkv用于连接。但它不起作用。我在视频中使用您的第一个答案 9:16 sar。请帮助我,再次感谢您。 我正在使用你的第一个答案 9:16 sar 作为视频部分。命令:“ffmpeg -i part2_pre.mkv -filter_complex”scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=9/16” part2.mkv”,我不知道我在这里犯了什么错误我无法获得所需的输出。 @Aarwil 我不明白您为什么要对视频进行预处理。您应该能够在一个命令中完成所有操作。在 concat 之前使用 scale、pad、setsar 过滤每个视频输入。查看更新的答案。 @llogan 你能显示完整的命令来保持音频流吗?谢谢 @Ilogan 谢谢我已经动态地制作了数组并且它有效。再次感谢您。

以上是关于如何在FFMpeg中连接两个或多个具有相同宽度和不同高度的视频并保持相同的纵横比?的主要内容,如果未能解决你的问题,请参考以下文章

如何使多个视图具有相同的宽度?

添加/叠加两个wav文件

如何连接具有不同属性的ffmpeg中的视频?

当两个或多个连续行具有相同状态时如何选择一行

如何使用FFmpeg连接两个MP4文件? concat视频过滤器concat demuxer concat协议

使具有不同纵横比的响应式图像具有相同的高度