在我的音频播放器应用程序中,我需要在播放之前提取音频文件的元信息。使用Java中的MediaCodec
和MediaExtractor
处理回放。目标级别为API 16,NDK也用于某些自定义C代码。
在某些平台上(特别是使用Android 4.x的三星),在某些特殊文件类型上使用MediaFormat
尝试获取MediaFormat.getTrackFormat()
时,应用会崩溃 - 例如它发生在带有ALAC音频轨道的.m4a容器上(我知道这是Android不支持的文件类型但我仍然希望我的应用程序在尝试读出{{1}时崩溃即使它是一个非感觉/伪造文件)
根本原因是输入格式MediaFormat
窒息,因为它无法从文件中读取元信息,从而导致libstagefright
并且应用程序崩溃。
我的第一个想法是,这很可能是一个断言失败,但它更微妙,因为它最终与记录有关。
深入挖掘我发现最初的"断言失败"由于缺少频道计数信息,由Utils.cpp
内的SIGABRT
宏触发。最终导致LOG_ALWAYS_FATAL_IF最终导致应用程序崩溃。
由于我的应用程序还使用了一些本机C代码和NDK,我已经尝试设置CHECK
等。人。但后来意识到这只会影响我的代码,但不会影响目标上部署的任何预编译代码。
另外,我尝试在主UI线程产生的后台线程中运行NDEBUG
,但MediaFormat.getTrackFormat()
使用我的应用程序进程,而不仅仅是调用后台的后台线程起源于。
顺便说一下,这在调试和发布版本中都会发生。
有没有办法解决被引发的SIGABRT
所以它不会杀死我的应用程序?
PS:植入设备或更新Android操作系统版本不是一个选项。