MediaExtractor在getTrackFormat()上导致SIGABRT

时间:2015-12-03 13:16:15

标签: android android-ndk

在我的音频播放器应用程序中,我需要在播放之前提取音频文件的元信息。使用Java中的MediaCodecMediaExtractor处理回放。目标级别为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操作系统版本不是一个选项。

0 个答案:

没有答案