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

FFmpeg渲染的MOV视频无法导入Unity的问题排查与解决方案咨询

FFmpeg渲染的MOV视频无法导入Unity的问题排查与解决方案咨询

看起来你遇到了挺头疼的问题:用Unity里的FFmpegCaptureCommand生成的MOV视频,在Windows Media Player和VLC里都能正常播放,但一导入Unity就报错WindowsVideoMedia error 0xc00d36e6,提示获取时长时找不到请求的属性。而用ffmpeg -i input.mov output.mov重新封装一遍后,视频就能正常导入Unity了。咱们来梳理下问题所在和解决思路:

关键差异排查

你用ffprobe对比了原视频和重新封装后的视频,已经抓到了两个非常重要的不同点:

  • 原视频的start_time是0.066667,而重新封装后的视频start_time是0.000000
  • 原视频的文件属性里缺少“Length”(时长)属性,重新封装后的视频则有这个属性

推测问题根源

结合Unity的视频导入逻辑来看,大概率是这两个点导致的:

  1. 起始时间偏移:Unity的视频解析器可能默认期望视频流的起始时间是0,原视频的起始时间不为0,导致它无法正确计算或读取时长信息
  2. 元数据不完整:你原命令里用了-movflags frag_keyframe+empty_moov,其中empty_moov会把MOV容器里的关键元数据(moov atom)放在文件末尾,而Unity的导入器可能在读取时没有完整读取到这部分元数据,从而找不到时长相关的属性;另外setpts=2*PTS滤镜修改了时间戳,也可能导致起始时间偏移,而重新封装时FFmpeg自动修正了这个偏移。

解决方案尝试

你可以调整原FFmpeg命令,针对这两个问题进行修复,试试下面这几个方向:

1. 调整MOV容器的元数据位置

把empty_moov换成faststart,这个参数会把moov atom移到文件开头,让Unity能更快更完整地读取元数据:

-movflags frag_keyframe+faststart

2. 重置视频流的起始时间

修改setpts滤镜,在缩放时间戳的同时把起始时间重置为0,这样输出的视频流起始时间就会是0:

-vf setpts=2*PTS - STARTPTS

3. 手动指定起始时间元数据

直接给视频流添加元数据,强制指定起始时间为0:

-metadata:s:v start_time=0

4. 尝试切换容器格式(可选)

如果MOV容器还是有兼容性问题,可以试试输出MP4格式,Unity对MP4的兼容性通常也很不错,只需要把-f mov改成-f mp4即可。

调整后的完整命令示例

把上面的修改整合起来,你的输出参数可以改成这样:

-g 24 -c:v h264 -preset medium -crf 32 -pix_fmt yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range pc -f mov -movflags frag_keyframe+faststart -vf setpts=2*PTS - STARTPTS -metadata:s:v start_time=0

生成视频后,记得再用ffprobe检查下start_time是否为0,以及文件属性里是否有“Length”属性,然后再尝试导入Unity,应该就能解决问题了。

备注:内容来源于stack exchange,提问作者Maximiliano Bezmalinovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:18:01