Intereting Posts

Усечение видео с помощью MediaCodec

Я использовал библиотеку Android MediaCodec для перекодировки видеофайлов (в основном, сменил здесь пример кода примера )

Еще одна вещь, которую я хочу достичь, – усечь видео – только начинать 15 секунд. Логика состоит в том, чтобы проверить videoExtractor.getSampleTime() если она больше 15 секунд, я просто напишу EOS в буфер декодера.

Но я получаю исключение, Caused by: android.media.MediaCodec$CodecException: Error 0xfffffff3

Вот мой код:

  while ((!videoEncoderDone) || (!audioEncoderDone)) { while (!videoExtractorDone && (encoderOutputVideoFormat == null || muxing)) { int decoderInputBufferIndex = videoDecoder.dequeueInputBuffer(TIMEOUT_USEC); if (decoderInputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) break; ByteBuffer decoderInputBuffer = videoDecoderInputBuffers[decoderInputBufferIndex]; int size = videoExtractor.readSampleData(decoderInputBuffer, 0); long presentationTime = videoExtractor.getSampleTime(); if (size >= 0) { videoDecoder.queueInputBuffer( decoderInputBufferIndex, 0, size, presentationTime, videoExtractor.getSampleFlags()); } videoExtractorDone = !videoExtractor.advance(); if (!videoExtractorDone && videoExtractor.getSampleTime() > mVideoDurationLimit * 1000000) { videoExtractorDone = true; } if (videoExtractorDone) videoDecoder.queueInputBuffer(decoderInputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); break; } 

Полный исходный код можно найти здесь .

Solutions Collecting From Web of "Усечение видео с помощью MediaCodec"

Я не уверен, что это источник ошибки или нет, но я думаю, что безопасно писать EOS в буфер декодера в произвольной точке.

Причина в том, что входное видео использует основной профиль H264 или выше, точки могут не быть в порядке возрастания (потому что существует B-кадр), поэтому вы можете пропустить несколько кадров в конце видео. Кроме того, когда последний кадр, который вы отправляете в декодер, является B-кадром, декодер может ожидать следующий пакет, но вы отправляете флаг EOS и создаете ошибку (не совсем уверен).

Однако вы можете отправить флаг EOS в кодировщик, используя videoEncoder.signalEndOfInputStream() после того, как вы достигнете нужного фрейма, (pts вывода декодера гарантируется в порядке возрастания, по крайней мере после версии android> = 4.3 ?)