You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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滤镜的交互逻辑:

  1. zoompan滤镜未显式指定输出分辨率时,会沿用内部默认参数处理,导致输出的视频流分辨率被翻转;
  2. 命令末尾的-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:19:52