我在 Android 中开发了一个简单的音频播放器,其中包括播放 .mp3 文件。要解码我使用 Android MediaExtractor 和 Android MediaCodec 的文件。示例代码如下所示:
int inIndex = mDecoder.dequeueInputBuffer(TIMEOUT_US);
if (inIndex >= 0) {
ByteBuffer buffer = inputBuffers[inIndex];
int sampleSize = mExtractor.readSampleData(buffer, 0);
if (sampleSize < 0) {
// We shouldn't stop the playback at this point, just pass the EOS
// flag to mDecoder, we will get it again from the
// dequeueOutputBuffer
Log.d(TAG, "InputBuffer BUFFER_FLAG_END_OF_STREAM");
mDecoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
}
else {
mDecoder.queueInputBuffer(inIndex, 0, sampleSize, mExtractor.getSampleTime(), 0);
mExtractor.advance();
}
在我所有的测试设备上,代码运行没有任何问题。然而,在 Google Play 上发布该应用程序后,我发现一些用户在通话过程中遇到了原生崩溃
int sampleSize = mExtractor.readSampleData(buffer, 0);
从谷歌游戏控制台我并没有真正得到很多信息,但似乎它是在(本机)memcpy 操作期间发生的 SIGSEGV 错误(SEGV_MAPERR),其中数据存储在 ByteBuffer 中。我强烈假设这些用户在他们的设备上根本没有足够的内存。然而,似乎崩溃并不取决于可用的总内存。该应用程序可能会在具有 4GB RAM 的设备上崩溃,但在只有 2GB RAM 的设备上运行流畅。
似乎这主要发生在播放网络广播流时。
你们中有人知道如何解决这个问题吗?在运行 readSampleData() 之前检查 ByteBuffer 的容量是否足够?或者有没有办法捕捉到这个错误?对我来说最重要的是确保应用程序不再崩溃。任何帮助是极大的赞赏!