Mac OS X下FFmpeg录屏YUV420p格式问题及实时转换咨询
一、先拆解你看到的FFmpeg日志
那个看起来吓人的警告:
[avfoundation @ 0x7fdba2003a00] Selected pixel format (yuv420p) is not supported by the input device.
其实本质是在说:你的Mac屏幕捕获设备(avfoundation模块)本身没法直接输出yuv420p格式,它只能生成日志里列的uyvy422、yuyv422、nv12这些格式。
但你命令里写的-pix_fmt yuv420p是给输出文件的编码器设置的参数——FFmpeg会自动在编码环节,把avfoundation提供的原始像素格式(比如nv12)转换成编码器需要的yuv420p,所以最终生成的MP4文件确实是yuv420p的,这也是为什么你用ffmpeg -i和mplayer查看都能确认格式正确的原因。这个警告只是个“提示”,不会影响最终输出结果,只是告诉你输入源不支持你指定的格式,但FFmpeg已经默默帮你做了兜底转换。
二、如何通过单次命令实现avfoundation流实时转成yuv420p(消除警告)
如果想彻底消除这个警告,同时明确指定在处理过程中实时转换到yuv420p,可以用FFmpeg的format滤镜来强制转换像素格式,把转换逻辑提前到滤镜环节,而不是让编码器自动处理。修改后的命令如下:
/usr/local/bin/ffmpeg -y -v error -f avfoundation -threads 0 -hide_banner -i 1:none -f mp4 -vcodec h264 -vf "scale=-1:1080,format=yuv420p" -r 25/1 -qscale:v 1 target.mp4
核心改动是把原来单独的-pix_fmt yuv420p替换成滤镜链里的format=yuv420p,这样FFmpeg会先把avfoundation输入的视频流转换为yuv420p,再进行缩放和编码,就不会再触发输入设备不支持yuv420p的警告了。
另外补充:如果你不想用滤镜,也可以在输入之后、编码之前添加-pix_fmt yuv420p作为全局参数,但用滤镜的方式更直观,还能和你的缩放操作整合到一个滤镜链里,处理效率更高。
内容的提问来源于stack exchange,提问作者Андрей Щеглов

