Android MediaExtractor / MediaCodec Native Crash

时间:2018-03-07 11:29:59

标签: android memory mediacodec bytebuffer mediaextractor

我在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的容量是否足够?或者有没有办法捕捉到这个错误?对我来说最重要的是确保应用程序不再崩溃。非常感谢任何帮助!

0 个答案:

没有答案