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

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参数,避免格式或时序错误
  • 硬编码特殊注意:如果使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:14:50