如何让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
相关产品推荐
相关产品推荐

