使用libmpeg2解码视频出现31c、301错误,输出视频损坏求助
解决libmpeg2解码301/31c错误及输出YUV损坏问题
一、定位错误码含义
Android平台的libmpeg2错误码定义在libmpeg2/src/mpeg2_internal.h中,你遇到的301(0x301)和31c(0x31C)对应:
0x301:序列头解析失败,大概率是视频流格式不兼容或解码初始化参数错误0x31C:宏块解码错误,多因流数据损坏、分辨率不匹配或解码上下文配置错误
二、排查编译与配置问题
1. 修正编译参数
Android源码中的libmpeg2默认配置未适配x86通用平台,编译时需手动指定优化选项:
cmake .. -DCMAKE_C_FLAGS="-m32 -msse2" -DCMAKE_BUILD_TYPE=Release make clean && make
添加-msse2启用x86平台SIMD优化,避免指令集不兼容导致的解码异常。
2. 调整解码配置文件
修改x86_test.cfg,修正核心参数:
--input sample.mpeg --output out.yuv --save_output 1 --num_frames -1 --chroma_format YUV_420P --share_display_buf 0 --max_wd 1920 # 扩大最大宽度,避免序列头分辨率超出限制 --max_ht 1080 # 扩大最大高度 --num_cores 1 --loopback 0 --display 0 --fps 0 # 设置为0自动从视频流读取帧率,避免强制30fps不匹配 --arch X86_GENERIC --soc GENERIC
关键修改点:
- 扩大
max_wd和max_ht,确保视频实际分辨率不超过解码上限 - 将
fps设为0,让解码器自动从流中获取帧率,避免强制设置导致的时序错误
三、验证视频流兼容性
- 先确认测试视频的实际格式:
ffmpeg -i sample_1280x720.mpeg
若输出显示为MPEG-1而非MPEG-2,Android的libmpeg2仅支持MPEG-2解码,需更换标准MPEG-2测试视频。
- 若视频是MPEG-2,用ffmpeg重新封装为纯MPEG-2流:
ffmpeg -i sample_1280x720.mpeg -vcodec copy -f mpeg2video pure_mpeg2.mpeg
使用重新封装后的pure_mpeg2.mpeg作为输入测试解码。
四、修复解码后YUV播放问题
若解码完成后YUV仍损坏,先获取视频实际分辨率:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 sample.mpeg
用实际分辨率替换ffplay命令中的参数:
ffplay -video_size [实际宽度]x[实际高度] -pixel_format yuv420p -f rawvideo out.yuv
内容的提问来源于stack exchange,提问作者Nemanja Matic
相关产品推荐
相关产品推荐

