更换FFmpeg的h264_v4l2m2m编码器后画面比例异常求助
解决h264_v4l2m2m编码器输出1:1画面比例的问题
你的问题出在硬件编码器h264_v4l2m2m对视频元数据(SAR/DAR)的处理逻辑和libx264不同——libx264会自动继承输入的宽高比元数据,而h264_v4l2m2m可能默认强制样本宽高比(SAR)为1:1,导致YouTube错误解析画面为正方形。以下是可行的解决方法:
方法1:编码前强制设置正确的宽高比元数据
在滤镜链中明确设置SAR(样本宽高比)为1:1、DAR(显示宽高比)为16:9,确保编码器输出正确的元数据:
-f v4l2 \ -input_format yuyv422 \ -video_size 1280x720 \ -framerate 30 \ -i /dev/video0 \ -f lavfi \ -i anullsrc=r=44100:cl=stereo \ -vf "setsar=1,setdar=16/9" \ -c:v h264_v4l2m2m \ -b:v 2500k \ -c:a aac \ -b:a 128k \ -ar 44100 \ -f flv rtmp://a.rtmp.youtube.com/live2/[STREAM-KEY]
方法2:用比特流滤镜修正编码后的元数据
如果编码器仍强制修改元数据,可在编码后通过比特流滤镜直接修正H.264流的SAR和DAR:
-f v4l2 \ -input_format yuyv422 \ -video_size 1280x720 \ -framerate 30 \ -i /dev/video0 \ -f lavfi \ -i anullsrc=r=44100:cl=stereo \ -c:v h264_v4l2m2m \ -b:v 2500k \ -bsf:v h264_metadata=sar=1/1,dar=16/9 \ -c:a aac \ -b:a 128k \ -ar 44100 \ -f flv rtmp://a.rtmp.youtube.com/live2/[STREAM-KEY]
方法3:确保编码器使用正确的输入分辨率
部分情况下,硬件编码器可能未正确识别输入分辨率,可在编码器参数中再次指定-video_size(注意放在-c:v之后):
-f v4l2 \ -input_format yuyv422 \ -video_size 1280x720 \ -framerate 30 \ -i /dev/video0 \ -f lavfi \ -i anullsrc=r=44100:cl=stereo \ -c:v h264_v4l2m2m \ -video_size 1280x720 \ -b:v 2500k \ -vf "setsar=1" \ -c:a aac \ -b:a 128k \ -ar 44100 \ -f flv rtmp://a.rtmp.youtube.com/live2/[STREAM-KEY]
补充说明
这不是h264_v4l2m2m的“已知限制”,而是硬件编码器对元数据的处理更严格,需要明确指定宽高比参数,避免自动覆盖。你之前尝试的滤镜未生效,可能是因为滤镜顺序错误,或者编码器在滤镜之后修改了元数据——上述方法通过提前设置元数据或事后修正,确保YouTube能正确识别16:9比例。
内容的提问来源于stack exchange,提问作者LycoReco2007
相关产品推荐
相关产品推荐

