Użyłem biblioteki Android MediaCodec transkodowanie plików wideo (głównie zmiany rozdzielczości Sample code here)Obetnij wideo z MediaCodec
Inną rzeczą, którą chcemy osiągnąć jest obciąć film - tylko brać początek 15 sekund. Logika polega na sprawdzeniu, czy jest ona większa niż 15 sekund, po prostu napiszę EOS
do bufora dekodera.
Ale otrzymuję wyjątek Caused by: android.media.MediaCodec$CodecException: Error 0xfffffff3
Oto mój kod:
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;
}
pełny kod źródłowy można znaleźć here.
jeśli chcesz, zajrzyj do [Google's ExoPlayer] (https://github.com/google/ExoPlayer). ma prostsze API – Crocodilys
Czy możesz opublikować swój pełny wynik logcat? – Willis
@crocodilys Czy exoplayer jest tylko graczem? Nie sądzę, że może transkodować wideo. Czy się mylę? – Qylin