Composer导出卡顿主因是帧率三者未对齐:项目时间线、素材实际帧率(需ffprobe验证,如30000/1001=29.97)、容器r_frame_rate;VFR素材须先转CFR,导出时推荐-vsync vfr -r 30,并设-g 75提升关键帧密度。

Composer导出时帧率不匹配,本质是没接管时间基控制
Composer本身不直接暴露帧率设置入口——它依赖底层渲染引擎(如FFmpeg或系统MediaCodec)的默认行为。如果你导出视频卡顿、快进或慢动作,大概率是项目时间线帧率、素材帧率和导出容器的r_frame_rate三者未对齐。别在Composer UI里找“FPS设置”按钮,那不存在。
用ffprobe先确认原始素材帧率,再反推Composer项目配置
Composer会按导入时识别的帧率初始化时间线,但手机录的视频常带动态帧率(VFR),ffprobe看到的r_frame_rate可能是“30/1”,实际播放却是29.97或跳变的。必须验证:
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=nw=1:nokey=1 input.mp4
输出类似 30000/1001 就是 29.97 fps;24/1 才是真24 fps。若结果含斜杠,说明不是整数帧率,Composer很可能按整数向下取整处理,导致丢帧。此时应在导入前用FFmpeg转成恒定帧率(CFR):
ffmpeg -i input.mp4 -vf "fps=30" -c:a copy fixed.mp4
再把 fixed.mp4 导入Composer,项目帧率才可靠。
导出后卡顿?检查-vsync和-r是否冲突
Composer导出调用FFmpeg时若未显式指定同步策略,容易触发vsync=1(复制/丢弃帧以匹配音频时钟),这是卡顿主因。你无法改Composer源码,但可干预其生成的FFmpeg命令(如有CLI导出模式)或重导出:
-
-vsync 0:禁用帧同步,严格按输入帧输出(适合纯视频分析) -
-r 30:强制封装层声明帧率为30,但不改变实际帧数 - 二者不能共存——
-r会覆盖-vsync行为,导致重复帧或跳帧
推荐组合:-vsync vfr -r 30,让FFmpeg保留原始帧时间戳,同时在容器头写明目标帧率,兼顾播放器兼容性与时间精度。
关键帧间隔(GOP)影响首帧加载和拖动流畅度
即使帧率正确,移动端播放仍卡顿,大概率是关键帧太稀疏。Composer默认不控制-g参数,导出视频可能每10秒才一个I帧。用以下命令检查现有视频的关键帧间隔:
ffprobe -v quiet -show_entries frame=pict_type,pts_time -of csv input.mp4 | awk -F', ' '$2 ~ /I/ {print $3}' | awk 'NR==1{t=$1;next} {print $1-t; t=$1}'
若输出中出现大于3的数字(单位:秒),就该重导出。加参数:-c:v libx264 -g 75 -keyint_min 75(假设25 fps,则75帧=3秒一个I帧)。这个值比默认更激进,但对网页和App内嵌播放更友好。


















