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的视频导入逻辑来看,大概率是这两个点导致的:
- 起始时间偏移:Unity的视频解析器可能默认期望视频流的起始时间是0,原视频的起始时间不为0,导致它无法正确计算或读取时长信息
- 元数据不完整:你原命令里用了
-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
相关产品推荐
相关产品推荐

