在HarmonyOS 6 Native音视频开发中,当你满心期待地启动OH_VideoEncoder,却突然在OH_AVCodecOnError回调中收到错误码10 (AV_ERR_INPUT_DATA_ERROR),这通常意味着编码器对你喂给它的数据“消化不良”。这个错误看似笼统,实则是编码器对输入数据格式的严格抗议。本文将结合官方文档与实战经验,帮你快速定位并修复这一“输入数据错误”。
一、错误本质:编码器收到了“无法理解”的数据
触发场景与错误定义
触发时机:在视频编码器(
OH_VideoEncoder)运行过程中,当OH_AVCodecOnError回调被触发,且errorCode参数为10。官方定义:
AV_ERR_INPUT_DATA_ERROR直译为“输入数据错误”。它属于OH_AVErrCode枚举类,表明编码器在解析或处理输入数据时遇到了无法逾越的障碍。
为什么会出现这个错误?
编码器就像一个严格的质检员,它要求输入数据必须与Configure阶段的承诺完全一致。任何“货不对板”都会导致它抛出此错误。核心矛盾在于:配置信息与输入数据的实际属性不匹配。
二、三大常见原因与“避坑”修复方案
根据官方架构指南与常见案例,该错误通常源于以下三个维度的问题:
1. 尺寸越界:SurfaceBuffer宽高与配置不符
这是最隐蔽且常见的坑。你配置了width=1920, height=1080,但实际喂给编码器的SurfaceBuffer尺寸却是1080x1920(旋转未处理)或1280x720(缩放未处理)。
根因:
OH_VideoEncoder_Configure中设置的宽高是编码器内部期待的“契约”。输入帧的宽高严禁超过此契约范围。修复:
检查摄像头采集、屏幕录制或解码器输出的原始宽高,确保与编码器配置一致。
如果源数据存在旋转(如手机竖屏采集),必须在送入编码器前进行旋转或裁剪,或者通过
OH_AVFormat设置正确的旋转参数,而不是直接颠倒宽高传参。
2. 格式冲突:配置与输入数据比特不一致
编码器配置了YUV420P,但你送入了NV21;或者配置了H.264,却试图送入H.265的码流。
根因:
pixelFormat、colorFormat或profile等关键格式信息不匹配。修复:
核对
OH_VideoEncoder_Configure中的OH_MD_KEY_VIDEO_PIXEL_FORMAT值。确保上游数据源(如
OHImage、Surface)的像素格式与编码器期望的格式完全对齐。必要时,使用librawfile或OH_Image接口进行格式转换。
3. 参数无效:配置了不支持的PixelFormat
你设置了一个当前设备或系统版本根本不支持的像素格式。
根因:使用了枚举值
OH_AVPixelFormat范围外的值,或该设备硬编芯片不支持该格式(如某些设备不支持YUV444)。修复:
在调用
Configure前,使用OH_AVCapability查询设备支持的编码格式列表。回退到最通用的格式(如
NV12或YUV420SP)进行测试。
三、实战排查清单(Checklist)
遇到此错误时,请按以下顺序逐项核对你的代码:
检查项 | 代码位置 | 预期标准 |
|---|---|---|
1. 宽高一致性 |
| 输入帧的 |
2. 像素格式 |
|
|
3. 数据生命周期 |
| 确保送入编码器的内存块在编码完成前未被释放或篡改 |
4. 时间戳连续性 |
| 输入数据的时间戳 |
5. 状态机 |
| 确保在 |
四、总结
AV_ERR_INPUT_DATA_ERROR = 10是一个防御性错误。它提醒开发者:Native层的视频编码器对数据的“纯洁性”要求极高。修复的关键不在于处理错误本身,而在于确保“配置”与“输入”的像素级一致。
核心口诀:
先查尺寸(宽高),再对格式(PixelFormat),最后验数据(内存/时间戳)。
通过严格遵循配置契约,并利用OH_AVCapability进行能力查询,可以彻底避免此类错误,让你的视频编码流程稳定运行。
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任。