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

使用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,让解码器自动从流中获取帧率,避免强制设置导致的时序错误

三、验证视频流兼容性

  1. 先确认测试视频的实际格式:
ffmpeg -i sample_1280x720.mpeg

若输出显示为MPEG-1而非MPEG-2,Android的libmpeg2仅支持MPEG-2解码,需更换标准MPEG-2测试视频。

  1. 若视频是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:37:20