如何在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中连接两个或多个具有相同宽度和不同高度的视频并保持相同的纵横比?的主要内容,如果未能解决你的问题,请参考以下文章