FFmpeg6.1 Android环境avcodec_send_frame外部库错误排查求助
排查Android端FFmpeg6.1 avcodec_send_frame报错的关键点
一、编译配置层面的常见坑
- 确认FFmpeg编译时是否开启了目标编码器:如果用软编码(如libx264),需添加
--enable-encoder=h264 --enable-libx264;如果用Android硬编码,需添加--enable-mediacodec,同时确保没有用--disable-all后遗漏开启必要组件。 - 检查交叉编译的架构匹配性:编译时指定的架构(如
--arch=arm64-v8a)必须和测试设备的CPU架构完全一致,避免混编导致的兼容性问题。 - 验证NDK版本:FFmpeg6.1要求Android NDK版本不低于r25,编译时需指定正确的
--sysroot路径,确保链接的系统库版本兼容。 - 确认编译模式:如果用动态库编译,需添加
--enable-shared,并将所有生成的.so文件放入APK对应架构的lib/目录;静态编译则需确保所有依赖库(如libz、libm)都被正确链接。
二、代码适配与参数检查
- 编码器初始化验证:在调用
avcodec_open2后,必须检查返回值是否为0。如果失败,用av_strerror打印具体错误信息,排查是否存在参数不支持、编码器未找到等问题。 - 参数一致性对比:严格对齐Win11端的编码器上下文参数:
codec_ctx->bit_rate、width、height、time_base、gop_size必须完全一致codec_ctx->pix_fmt需匹配编码器要求(如H.264编码器通常要求AV_PIX_FMT_YUV420P)
- AVFrame有效性检查:
- 确保AVFrame的
data指针是通过av_image_alloc分配的有效内存,而非直接复用JNI传递的未对齐内存 - 正确设置
frame->pts、frame->format、frame->linesize参数,避免格式或时序错误
- 确保AVFrame的
- 硬编码特殊注意:如果使用MediaCodec硬编码(
h264_mediacodec),需确保:- 未设置
codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER(硬编码不支持全局头) - 输入的YUV数据格式与MediaCodec要求的一致,避免出现格式不兼容
- 未设置
三、日志排查手段
- 开启FFmpeg调试日志:调用
av_log_set_level(AV_LOG_DEBUG),在报错前查看编码器初始化、参数设置的详细日志,重点关注是否有参数被强制修改或不支持的提示。 - 解析错误码:将
avcodec_send_frame返回的错误码传入av_strerror,转换为可读字符串,定位具体错误类型(如内存不足、参数无效、编码器未就绪等)。
四、其他排查方向
- 检查内存权限:Android端需确保应用拥有存储或相机权限(如果是采集推流),避免内存分配失败。
- 对比官方预编译库:尝试使用FFmpeg官方提供的Android预编译库替换自行编译的库,验证是否为编译过程中的问题。
内容的提问来源于stack exchange,提问作者MMingY
相关产品推荐
相关产品推荐

