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

如何让Mac端Safari/QuickTime正常播放FFmpeg转换的MP4文件

解决GIF转MP4的Safari/QuickTime兼容性问题

错误原因

你添加的-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"参数中多余的双引号导致滤镜初始化失败。ffmpeg-static的outputOptions数组要求每个参数是独立字符串,不需要额外包裹引号。

修正后的完整代码

await new Promise<void>((resolve, reject) => {
    ffmpeg
        .input(`/tmp/input_${name}.gif`)
        .outputOptions([
            '-c:v libx264',
            '-pix_fmt yuv420p',
            '-vf scale=trunc(iw/2)*2:trunc(ih/2)*2',
            '-movflags +faststart+frag_keyframe+empty_moov',
            '-crf 23', // 可选:平衡画质与文件大小
        ])
        .noAudio()
        .output(`/tmp/output_${name}.mp4`)
        .on('end', () => {
            console.log('MP4 video generated')
            resolve()
        })
        .on('error', (e) => {
            console.log(e)
            reject()
        })
        .run()
})

关键参数说明

  • -pix_fmt yuv420p:Safari和QuickTime仅支持标准的YUV420P像素格式,这是兼容性的核心要求。
  • -vf scale=trunc(iw/2)*2:trunc(ih/2)*2:H.264编码强制要求视频宽高为偶数,该滤镜自动将GIF分辨率调整为最近的偶数尺寸,避免解码失败。
  • 合并-movflags参数:原代码分两次设置-movflags会导致参数覆盖,合并后确保流媒体播放所需的所有flag生效,同时避免冲突。
  • -crf 23:可选参数,控制视频质量,数值范围0-51,23为默认平衡值,可根据需求调整。

验证步骤

转换完成后,可通过以下命令检查输出文件的兼容性:

ffmpeg -i /tmp/output_${name}.mp4

查看输出中Video段的pix_fmt是否为yuv420p,且宽高均为偶数。同时确保使用的ffmpeg-static为较新版本,避免旧版本的编码bug。

内容的提问来源于stack exchange,提问作者János

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:10:19