感觉程序开发的状态,大约是这样的,昨天,横看成岭侧成峰,远近高低各不同;今天,山重水复疑无路,柳暗花明又一村;明天,正入万山圈子里,一山放过一山拦。尤其是搞一些自己并不熟悉的领域,最开始,绞尽脑汁,不知道问题是怎么出现的,又该怎么解决;就在接近放弃之时,忽然通过查找资料、或者提问,找到了答案,豁然开朗;解决完问题之后再次试运行,咔,又崩了,又不知道是哪里又出了什么问题,又该怎么解决了。就这样循环往复。最近做 Android 平台音视频硬件编解码就是如此。

此文主要记录在实现 NDK MediaCodec 编码中遇到的几个大坑。

虽报错,但无关紧要的报错

NDK MediaCodec 编码的实现过程中,遇到的坑之所以难填,主要是因为它存在 N 多报错,有些报错其实并不影响整体流程的跑通和功能实现。比如以下这个 OMX-VENC 报错 unsupported index,直到能正常编码,这个报错依然存在。

sf error code: -2147479551 error -1000

configureCodec returning error -38 -61 分别如何处理


AMediaCodec_configure 返回 -38 比较难弄,但是当你知道以后却想直呼“卧槽”。原因很简单,设置的 AMediaFormat 不完整。

MediaCodec 硬编码比 FFmpeg 死板些,缺少相关参数,就报错 -38,而且没有任何其他提示告诉你说,你的某个参数没有设置。这让人很头疼。

一般来说,这几个参数缺失,都会导致报这个错:(省略AMEDIAFORMAT_KEY_ 字符)FRAME_RATE BIT_RATE I_FRAME_INTERVAL。至于宽高、颜色格式、编码器名称,我想,应该没人缺失这几个参数吧?


再说这个返回 -61 的错误,其实这个错误相对容易些,不要盯着最后面的报错看。往前捯几下,就看到 does not support color format 19 这条报错了。很简单,貌似 MediaCodec 只支持 colorformat 21,也就是 NV12。

AMediaCodec_start 成功,代码却崩溃退出,报错 SIGILL ILL_ILLOPC

好不容易过了 AMediaCodec_configure 这一关,甚至连 AMediaCodec_start 都成功返回 NO_ERROR 了,但在程序继续执行的过程中,却又崩溃,查看崩溃 log 显示 SIGILL ILL_ILLOPC,原文如下

2021-07-27 10:17:19.825 1150-2518/? E/OMX-VENC: ERROR: unsupported index 1870659589
2021-07-27 10:17:19.825 1150-2518/? E/OMXNodeInstance: getConfig(0xf2744204:qcom.encoder.avc, ConfigLatency(0x6f800005)) ERROR: UnsupportedIndex(0x8000101a)
2021-07-27 10:17:19.852 13106-13106/com.enoch.firsttry A/libc: Fatal signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xbe2a00f6 in tid 13106 (.enoch.firsttry), pid 13106 (.enoch.firsttry)

正如上一节提到的,这个 unsupported index 错误出现的恰如其分,让我一直去纠结这个错误该如何解决,让我一直以为是这个错误导致了下面的 Fatal signal 4。然而,翻遍了 百度、谷歌、Stack Overflow、Android NDK Development Document,却仍然找不到答案。直到有个微信群的大神在结束了一天的忙碌之后瞟了一眼我的问题,然后神戳戳地冒了一句,“是不是返回值不对?”,这才忽然发现我的代码中存在问题!

原来,我的代码是这么写的:

int PAVMCEncoder::InitVideoEncoder(const PAVVideoInfo *videoinfo) {AMediaFormat *format = AMediaFormat_new();// ....// 此处省略 n 行,具体代码见我的另一篇文章《FFmpeg + NDK MediaCodec 实现安卓视频硬编码》// ....media_status_t status = AMediaCodec_configure(codec_, format, nullptr, nullptr, AMEDIACODEC_CONFIGURE_FLAG_ENCODE);if (status != 0) {AVLOGE("Error when config mediacodec encoder %d", status);return -1;}status = AMediaCodec_start(codec_);if (status != 0) {AVLOGE("Error when start mediacodec encoder %d", status);return -1;}
}

断点调试时也很纳闷,明明 status = 0,正常,也没报 Error when start... 这个我写的错误 log,为什么在执行完第二次的 if 语句之后就崩了呢!?

原来如此!我定义的是个 int 函数,结果却只在出错时返回了表示错误的 -1,而在执行成功时,却没返回表示正确的 0!

所以,在最后一个 if 之外,再加上一个 return 0,这个问题就解决了。这个问题也提醒我们,Android 开发远比 Linux、Windows 开发更严格,返回值类型不正确都会崩溃的。当然,无论在什么开发当中,都应该返回正确的类型值!

undefined symbol:AMEDIAFORMAT_KEY_BITRATE_MODE

这个错误莫名其妙,明明这个 AMEDIAFORMAT_KEY_BITRATE_MODE 是 Android Studio IDE 自动提示出来的变量,但是在编码时却被认为是 undefined symbol

不知道原因的,可能要搜索半天都不一定能找到答案,但是知道原因的话,那就是非常简单:把 app 的 build.gradle 中的 minSdkVersion 提高到 28 即可。因为,这个接口是从 SDK version 28 才开始提供的。

嗯,这样倒是解决问题了,只是,这个 28 的 SDK level 将一大半用户挡在了门外。。。

error: use of undeclared identifier ‘AMediaFormat_new’

这个错误很简单,minSdkVersion 调到 21 以上即可。

结语

啪!醒木一拍,这正是,正入万山圈子里,一山放过一山拦~~

【AVD】NDK MediaCodec 编码中的坑 configure: err(-2147479551) error -38 Fatal signal 4 (SIGILL) ILL_ILLOPC相关推荐

  1. 详谈字符编码[一]字符编码中的坑

    说起字符编码首先可能想到的词汇有Unicode,UTF,UCS,内码,区位码,跨平台等词汇,甚至还有输入法,乱码,emoji,微软雅黑,URL encode等相关的词汇也会冒出来,足以说明字符编码在计 ...

  2. java专业编码_java编码中的坑(记一次解决编码BUG的经历) - 贪吃蛇学院-专业IT技术平台...

    1.2016年11月15日(周二),我被经理外派出差渝北金开大道,任务:解决那边的一个数据库乱码异常 2.那边的负责人描述:数据库原是utf8编码,他为了兼容emoji表情,改为utf8mb4,之后出 ...

  3. Android NDK MediaCodec在ijkplayer中的实践

    https://www.jianshu.com/p/41d3147a5e07 从API 21(Android 5.0)开始Android提供C层的NDK MediaCodec的接口. Java Med ...

  4. 从原理到实践:使用Mediacodec编码H265并实现解码H265码流

    H265 H265,也称为HEVC(High Efficiency Video Coding),是一种高效视频编码格式.它是H264(AVC)的后继者,也是ITU-T和ISO/IEC联合开发的标准.相 ...

  5. java中常用的坑_Java技术开发中的坑

    1.(2014/05/28)struts2中使用eclipse自动获取getter和setter方法的坑 今天着实被eclipse坑了一把,平时遇到get和set方法时,我都是通过eclipse自动生 ...

  6. 笔记3 · C++在编码中带来哪些改变

    一.C++输入输出 cout .cin cout.cin均为C++内置对象.可以看作是一连串的数据流而不是关键字.C++库提供了大量的类(class),程序员可以使用他们来创建对象,cout和cin就 ...

  7. (二)音视频:MediaCodec编码桌面信息 完整Demo 进一步理解H264

    (一)音视频:解码H264文件流程 渲染和拿到解码后源数据YUV 完整Demo] (二)音视频:MediaCodec编码桌面信息 完整Demo 进一步理解H264 (三)音视频:解析H264 SPS ...

  8. (四)Asp.net web api中的坑-【api的返回值】

    (四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...

  9. 编码中统一更该变量的快捷键_更多项目想法,以提高您的编码技能

    编码中统一更该变量的快捷键 Two weeks ago I published an article containing 15 project ideas that you can build to ...

  10. 编码中统一更该变量的快捷键_流媒体的7种方式使您成为更好的编码器

    编码中统一更该变量的快捷键 by freeCodeCamp 通过freeCodeCamp 流媒体的7种方式使您成为更好的编码器 (7 Ways Streaming Makes you a Better ...

最新文章

  1. Python库全部整理出来了,非常全面
  2. 今晚8点直播 | 深入浅出理解A3C强化学习
  3. Python基础知识4--数据结构(树)
  4. Kafka发送超过broker限定大小的消息时Client和Broker端各自会有什么异常?
  5. SQL Server定时执行SQL语句
  6. C++socket编程(三)3.2 创建TCPServer设置服务信息并讲解网络字节序
  7. Julia : Array !, [1,2] !=[1 2]'
  8. springboot session超时设置_Spring Boot+Spring Security:获取用户信息和session并发控制...
  9. 【matlab2014B安装教程及下载】
  10. ICode竞赛学习资料内容礼包
  11. 纯屏和液晶显示器有什么区别
  12. 历史记录具体时间linux,查看命令历史记录及其操作时间
  13. 罗永浩写给俞敏洪的信
  14. matlab图例显示均值方差,MATLAB中均值、方差、均方差的计算方法
  15. 股票大作手操盘术---到手的利润
  16. 一个SparkSQL作业的一生
  17. 悲催呀,辞职后,竟然找不到工作了
  18. GNSS说第(七)讲---自适应动态导航定位(六)---导航解算中的误差探测、诊断与修复
  19. 2.4g语音遥控器小结
  20. c语言如何读出字符串中的数据,如何把数据存在字符串中

热门文章

  1. Sci-Hub桌面版 告别网站被封的尴尬
  2. java项目-第91期基于ssm的蛋糕商城系统
  3. C/C++实现的游戏角色名称名字随机生成代码
  4. 计算机网络共享打不开,电脑系统网络和共享中心打不开怎么办
  5. Linux日文教程,Ubuntu日语、法语输入法的设置
  6. 什么是外包公司?要不要去外包公司?
  7. 观察者模式(行为型)
  8. HearthBuddy炉石兄弟 格雷迈恩
  9. cox回归模型python实现_生存分析Cox回归模型(比例风险模型)的spss操作实例
  10. 如何用手机远程控制电脑