使用FFmpeg生成竖版视频却得到横版视频的技术问询
问题:竖版图片生成视频后显示为横版
竖版图片信息
~/Dropbox/mix/promo $ identify /tmp/mix/promo/cache/handled_img_20861026d9064d972dad09764ac15a8f.jpg /tmp/mix/promo/cache/handled_img_20861026d9064d972dad09764ac15a8f.jpg JPEG 720x1279 720x1279+0+0 8-bit sRGB 202KB 0.000u 0:00.000
使用的FFmpeg命令
ffmpeg -t 2 -i /tmp/mix/promo/cache/handled_img_20861026d9064d972dad09764ac15a8f.jpg -t 2 -i /tmp/mix/promo/cache/handled_img_20861026d9064d972dad09764ac15a8f.jpg -filter_complex "[0:v]zoompan=z=1:d=60,fade=t=out:st=1.8:d=0.2[v0]; [1:v]zoompan=z=1:d=60,fade=t=in:st=0:d=0.2,fade=t=out:st=1.8:d=0.2[v1]; [v0][v1]concat=n=2[v]" -map "[v]" -s 720x1280 -t 4 -y /tmp/t.mp4
问题现象
生成的视频播放时显示为横版,ffprobe检测结果如下:
~/Dropbox/mix/promo $ ffprobe /tmp/t.mp4 ffprobe version 3.4.4-0ubuntu0.18.04.1 Copyright (c) 2007-2018 the FFmpeg developers built with gcc 7 (Ubuntu 7.3.0-16ubuntu3) configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared libavutil 55. 78.100 / 55. 78.100 libavcodec 57.107.100 / 57.107.100 libavformat 57. 83.100 / 57. 83.100 libavdevice 57. 10.100 / 57. 10.100 libavfilter 6.107.100 / 6.107.100 libavresample 3. 7. 0 / 3. 7. 0 libswscale 4. 8.100 / 4. 8.100 libswresample 2. 9.100 / 2. 9.100 libpostproc 54. 7.100 / 54. 7.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/t.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf57.83.100 Duration: 00:00:04.00, start: 0.000000, bitrate: 713 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1280x720 [SAR 1:1 DAR 16:9], 709 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) Metadata: handler_name : VideoHandler
预期生成竖版视频,实际显示为横版,原因是什么?
原因分析与解决方法
核心原因
问题出在zoompan滤镜和concat滤镜的交互逻辑:
- zoompan滤镜未显式指定输出分辨率时,会沿用内部默认参数处理,导致输出的视频流分辨率被翻转;
- 命令末尾的
-s 720x1280只是对最终画面做拉伸,并没有修正concat滤镜输出的实际帧尺寸,从ffprobe结果能看到最终视频的实际分辨率是1280x720,播放器会按这个横版比例渲染。
修正后的FFmpeg命令
在每个zoompan滤镜中显式指定竖版输出分辨率,确保concat处理的是正确比例的视频流:
ffmpeg -t 2 -i /tmp/mix/promo/cache/handled_img_20861026d9064d972dad09764ac15a8f.jpg -t 2 -i /tmp/mix/promo/cache/handled_img_20861026d9064d972dad09764ac15a8f.jpg \ -filter_complex "[0:v]zoompan=z=1:d=60:s=720x1280,fade=t=out:st=1.8:d=0.2[v0]; \ [1:v]zoompan=z=1:d=60:s=720x1280,fade=t=in:st=0:d=0.2,fade=t=out:st=1.8:d=0.2[v1]; \ [v0][v1]concat=n=2:v=1:a=0[v]" \ -map "[v]" -t 4 -y /tmp/t.mp4
关键修改点
- 给每个
zoompan滤镜添加s=720x1280,强制输出竖版分辨率; - concat滤镜中添加
v=1:a=0明确只合并视频流,避免音频相关潜在问题; - 移除末尾的
-s 720x1280,因为zoompan已经输出正确分辨率,无需二次拉伸。
验证标准
重新执行命令后,用ffprobe检查视频流信息,若分辨率显示为720x1280、DAR为9:16,则播放器会正确显示竖版画面。
内容的提问来源于stack exchange,提问作者chikadance
相关产品推荐
相关产品推荐

