Android MediaMuxer readSampleData IllegalStateException

Я использую следующий код для создания видео. Однако одна из каждых 5 попыток readSampleData вызывает либо IllegalArgumentException, либо IllegalStateException. Что я могу сделать, чтобы остановить исключения. Могу ли я проверить состояние экстрактора перед вызовом readSampleData. Если да, то как?

MediaExtractor videoExtractor = new MediaExtractor();
videoExtractor.setDataSource(SOURCE);

Log.d(TAG, "Video Extractor Track Count " + videoExtractor.getTrackCount() );

MediaMuxer muxer = new MediaMuxer(outputFile, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

videoExtractor.selectTrack(0);
MediaFormat videoFormat = videoExtractor.getTrackFormat(0);
int videoTrack = muxer.addTrack(videoFormat);

Log.d(TAG, "Video Format " + videoFormat.toString() );

boolean videoEnded = false;
long videoTimeStamp = 0;
int frameCount = 0;
int offset = 100;
ByteBuffer videoBuf = ByteBuffer.allocate(MAX_SAMPLE_SIZE);
BufferInfo videoBufferInfo = new BufferInfo();

muxer.start();

while (!videoEnded) 
{
    videoBufferInfo.offset = offset;
    videoBufferInfo.size = videoExtractor.readSampleData(videoBuf, offset);

    if (videoBufferInfo.size < 0) 
    {
        Log.d(TAG, "video ended " + videoBufferInfo.size);
        videoEnded = true;
        videoBufferInfo.size = 0;
    } 
    else 
    {
        videoTimeStamp = videoBufferInfo.presentationTimeUs = videoExtractor.getSampleTime();
        videoBufferInfo.flags = videoExtractor.getSampleFlags();
        muxer.writeSampleData(videoTrack, videoBuf, videoBufferInfo);
        videoExtractor.advance();
        frameCount++;
        Log.d(TAG, "Frame (" + frameCount + ") Video PresentationTimeUs:" + (videoBufferInfo.presentationTimeUs/1000000.0f)  +" Flags:" + videoBufferInfo.flags +" Size " + videoBufferInfo.size);
    }
}

muxer.stop();
muxer.release();

Фактический код добавляет звук к видео после цикла извлечения видео.


comment
В документации указано, что MediaMuxer.setLocation выбрасывает IllegalStateException и IllegalArgumentException, но ничего не говорит о MediaExtractor.readSampleData. Я так потерян.   -  person user346443    schedule 21.10.2014
comment
readSampleData может генерировать исключение IllegalArgumentException, если ByteBuffer не соответствует размеру, который я нашел.   -  person Scrooch    schedule 08.07.2015
comment
@Scrooch Какой размер подойдет? Я сталкиваюсь с этой ошибкой и не могу найти размер, который не представляет проблемы.   -  person Taiko    schedule 15.10.2015