我在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);
在Google Play控制台中,我并没有真正获得大量信息,但似乎是在(本机)memcpy操作期间发生的SIGSEGV错误(SEGV_MAPERR),其中数据存储在ByteBuffer中。我强烈认为这些用户的设备上没有足够的内存。然而,似乎崩溃并不依赖于可用的总内存。该应用程序可能会在具有4GB RAM的设备上崩溃,但在只有2GB RAM的设备上运行顺畅。
这似乎主要发生在播放网络广播流时。
你们有没有想过如何解决这个问题?在运行readSampleData()之前检查ByteBuffer的容量是否足够?或者有没有办法捕捉到这个错误?对我来说最重要的是确保应用程序不再崩溃。非常感谢任何帮助!