![](/img/trans.png)
[英]Android MediaCodec releaseOutputBuffer throws MediaCodec.CodecException when decoding H264 video
[英]Why the "MediaCodec CodecException" in "queueInputBuffer" only happen on Android API 29?
基礎信息
目標SDK版本28
目標:該課程的目標是在發送到我的服務器之前調整視頻大小。
問題:該應用程序僅在 API 29 上崩潰,無論是使用真實設備還是使用 AVD。 例如,代碼在Pixel 2 API 28上運行良好,但在Pixel 2 API 29上不起作用
源代碼:我主要使用來自bigflake.com的示例代碼。
錯誤信息(詳細日志見下文):
E/AndroidRuntime: FATAL EXCEPTION: Thread-20
Process: com.myapp.myapp, PID: 9189
android.media.MediaCodec$CodecException: Error 0xfffffff3
at android.media.MediaCodec.native_queueInputBuffer(Native Method)
at android.media.MediaCodec.queueInputBuffer(MediaCodec.java:2450)
我曾嘗試由於有限的日志信息MediaCodec$CodecException
,我嘗試沒有成功改變從MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface
到MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible
。
日志將顯示最后兩個緩沖周期。 我希望你能看到有價值的東西。
D/VideoResolutionChanger: no audio encoder output buffer
D/VideoResolutionChanger: loop: V(true){extracted:49(done:false) decoded:45(done:false) encoded:43(done:false)} A(true){extracted:45(done:false) decoded:44(done:false) encoded:1(done:false) pending:-1} muxing:true(V:0,A:1)
D/VideoResolutionChanger: video decoder: returned input buffer: 3
video extractor: returned buffer of size 31007
video extractor: returned buffer for time 4448177
D/VideoResolutionChanger: audio decoder: returned input buffer: 1
audio extractor: returned buffer of size 32
audio extractor: returned buffer for time 900000
D/VideoResolutionChanger: video decoder: returned output buffer: 5
video decoder: returned buffer of size 1382400
video decoder: returned buffer for time 4132500
D/VideoResolutionChanger: output surface: await new image
D/VideoResolutionChanger: output surface: draw image
D/VideoResolutionChanger: input surface: swap buffers
D/VideoResolutionChanger: video encoder: notified of new frame
audio decoder: returned output buffer: 0
audio decoder: returned buffer of size 320
D/VideoResolutionChanger: audio decoder: returned buffer for time 880000
audio decoder: output buffer is now pending: -1
audio decoder: attempting to process pending buffer: 0
D/VideoResolutionChanger: audio encoder: returned input buffer: 0
audio decoder: processing pending buffer: 0
audio decoder: pending buffer of size 320
audio decoder: pending buffer for time 880000
D/VideoResolutionChanger: should have added track before processing output true
video encoder: returned output buffer: 0
video encoder: returned buffer of size 8234
video encoder: returned buffer for time 3954177
D/VideoResolutionChanger: no audio encoder output buffer
D/VideoResolutionChanger: loop: V(true){extracted:50(done:false) decoded:46(done:false) encoded:44(done:false)} A(true){extracted:46(done:false) decoded:45(done:false) encoded:1(done:false) pending:-1} muxing:true(V:0,A:1)
D/VideoResolutionChanger: video decoder: returned input buffer: 4
video extractor: returned buffer of size 30897
video extractor: returned buffer for time 4519077
D/VideoResolutionChanger: video extractor: EOS
D/VideoResolutionChanger: releasing extractor, decoder, encoder, and muxer
D/SurfaceUtils: disconnecting from surface 0xc94d8008, reason disconnectFromSurface
D/MPEG4Writer: Video track stopping. Stop source
Video track source stopping
Video track source stopped
I/MPEG4Writer: Received total/0-length (44/0) buffers and encoded 44 frames. - Video
W/MPEG4Writer: 0-duration samples found: 1
I/MPEG4Writer: Received total/0-length (1/0) buffers and encoded 1 frames. - Audio
Audio track drift time: 0 us
D/MPEG4Writer: Video track stopped. Stop source
D/MPEG4Writer: Audio track stopping. Stop source
Audio track source stopping
Audio track source stopped
Audio track stopped. Stop source
Duration from tracks range is [241451, 3994621] us
Stopping writer thread
D/MPEG4Writer: 0 chunks are written in the last batch
D/MPEG4Writer: Writer thread stopped
I/MPEG4Writer: Ajust the moov start time from 0 us -> 0 us
D/MPEG4Writer: Video track stopping. Stop source
D/MPEG4Writer: Audio track stopping. Stop source
E/AndroidRuntime: FATAL EXCEPTION: Thread-20
Process: com.myapp.myname, PID: 9189
android.media.MediaCodec$CodecException: Error 0xfffffff3
at android.media.MediaCodec.native_queueInputBuffer(Native Method)
at android.media.MediaCodec.queueInputBuffer(MediaCodec.java:2450)
at com.myapp.myname.utils.VideoResolutionChanger.doExtractDecodeEditEncodeMux(VideoResolutionChanger.java:543)
D/VideoResolutionChanger: no audio encoder output buffer
loop: V(true){extracted:39(done:true) decoded:39(done:true) encoded:39(done:true)} A(true){extracted:147(done:false) decoded:146(done:false) encoded:5(done:false) pending:-1} muxing:true(V:0,A:1)
audio decoder: returned input buffer: 3
audio extractor: returned buffer of size 32
audio extractor: returned buffer for time 2940000
D/VideoResolutionChanger: audio decoder: returned output buffer: 2
audio decoder: returned buffer of size 320
audio decoder: returned buffer for time 2920000
audio decoder: output buffer is now pending: -1
audio decoder: attempting to process pending buffer: 2
audio encoder: returned input buffer: 2
audio decoder: processing pending buffer: 2
audio decoder: pending buffer of size 320
audio decoder: pending buffer for time 2920000
D/VideoResolutionChanger: no audio encoder output buffer
D/VideoResolutionChanger: loop: V(true){extracted:39(done:true) decoded:39(done:true) encoded:39(done:true)} A(true){extracted:148(done:false) decoded:147(done:false) encoded:5(done:false) pending:-1} muxing:true(V:0,A:1)
D/VideoResolutionChanger: audio decoder: returned input buffer: 0
audio extractor: returned buffer of size -1
audio extractor: returned buffer for time -1
audio extractor: EOS
D/VideoResolutionChanger: audio decoder: returned output buffer: 3
audio decoder: returned buffer of size 320
audio decoder: returned buffer for time 2940000
audio decoder: output buffer is now pending: -1
audio decoder: attempting to process pending buffer: 3
D/VideoResolutionChanger: audio encoder: returned input buffer: 3
audio decoder: processing pending buffer: 3
audio decoder: pending buffer of size 320
audio decoder: pending buffer for time 2940000
D/VideoResolutionChanger: no audio encoder output buffer
D/VideoResolutionChanger: loop: V(true){extracted:39(done:true) decoded:39(done:true) encoded:39(done:true)} A(true){extracted:149(done:true) decoded:148(done:false) encoded:5(done:false) pending:-1} muxing:true(V:0,A:1)
audio decoder: returned output buffer: 0
audio decoder: returned buffer of size 0
audio decoder: returned buffer for time 2880000
audio decoder: output buffer is now pending: -1
audio decoder: attempting to process pending buffer: 0
D/VideoResolutionChanger: audio encoder: returned input buffer: 0
audio decoder: processing pending buffer: 0
audio decoder: pending buffer of size 0
audio decoder: pending buffer for time 2880000
D/VideoResolutionChanger: audio decoder: EOS
D/VideoResolutionChanger: should have added track before processing outputtrue
audio encoder: returned output buffer: 0
audio encoder: returned buffer of size 761
audio encoder: returned buffer for time 2801451
audio encoder: EOS
encoded and decoded video frame counts should match39 39
decoded frame count should be less than extracted frame count39 39
D/VideoResolutionChanger: no frame should be pending -1 -1
releasing extractor, decoder, encoder, and muxer
D/SurfaceUtils: disconnecting from surface 0xd8b50808, reason disconnectFromSurface
D/MPEG4Writer: Video track stopping. Stop source
I/MPEG4Writer: Received total/0-length (6/0) buffers and encoded 6 frames. - Audio
D/MPEG4Writer: Video track source stopping
I/MPEG4Writer: Audio track drift time: 0 us
D/MPEG4Writer: Video track source stopped
I/MPEG4Writer: Received total/0-length (38/0) buffers and encoded 38 frames. - Video
D/MPEG4Writer: Video track stopped. Stop source
D/MPEG4Writer: Audio track stopping. Stop source
Audio track source stopping
Audio track source stopped
Audio track stopped. Stop source
Duration from tracks range is [3060067, 3302540] us
Stopping writer thread
D/MPEG4Writer: 0 chunks are written in the last batch
D/MPEG4Writer: Writer thread stopped
I/MPEG4Writer: Ajust the moov start time from 0 us -> 0 us
D/MPEG4Writer: Video track stopping. Stop source
D/MPEG4Writer: Audio track stopping. Stop source
我認為解決它的正確方法是在xxxxExtractor.advance()
返回 false 后xxxxExtractor.advance()
。
我修改了我的代碼,只在xxxxExtractor.readSampleData
返回的大小返回-1
之后才標記一個提取器完成這樣你就知道你發送到 queueInputBuffer 的緩沖區是空的。
所以: xxxxExtractorDone = !xxxxExtractor.advance();
-> xxxxExtractorDone = !xxxxExtractor.advance() && size == -1;
我還使用了 Bigflake 代碼並在 Android 10 (API 29) 中遇到了這個問題。
其他鏈接問題很有幫助,但不要直接回答有關如何修改 Bigflake 代碼的問題。 花了幾個小時后,這就是我想出的。
對於視頻和音頻,在doExtractDecodeEditEncodeMux
,在 where 之前
xxxxxDecoder.queueInputBuffer(
decoderInputBufferIndex,
0,
0,
0,
MediaCodec.BUFFER_FLAG_END_OF_STREAM);
被調用時,您要添加以下代碼行,以確保您使用空緩沖區來發送 EOS。
// wait forever for a new buffer
decoderInputBufferIndex = xxxxxDecoder.dequeueInputBuffer(-1);
有兩個這樣的實例,視頻的結果代碼如下所示,給出了大部分上下文:
videoExtractorDone = !videoExtractor.advance();
if (videoExtractorDone) {
if (VERBOSE) {
final String log = "Video extractor: EOS";
Log.d(TAG, log);
emitLog(log);
}
Log.i(TAG, "WAITING indefinitely until an input video buffer for EOS is available");
// wait forever for a new buffer
decoderInputBufferIndex = videoDecoder.dequeueInputBuffer(-1); // this is the actually important line
videoDecoder.queueInputBuffer(
decoderInputBufferIndex,
0,
0,
0,
MediaCodec.BUFFER_FLAG_END_OF_STREAM);
Log.i(TAG, "Successfully sent video EOS");
}
希望這可以幫助其他人絆倒這一點。
我遇到了同樣的問題,終於解決了。 我使用了asynctaskMode
和編解碼器回調。
while (!mAudioExtractorDone) {
int size = mAudioExtractor.readSampleData(decoderInputBuffer, 0);
long presentationTime = mAudioExtractor.getSampleTime();
MLog.i(TAG, "audio extractor: ronInputBufferAvailable() presentationTime = " + presentationTime);
if (size >= 0) {
codec.queueInputBuffer(index, 0, size, presentationTime, mAudioExtractor.getSampleFlags());
}else {
Log.e(TAG, "onInputBufferAvailable: " + "size < 0 = " + size);
codec.queueInputBuffer(index, 0, 0, 0L, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
mAudioExtractorDone = true;
}
mAudioExtractor.advance();
mAudioExtractedFrameCount++;
logState();
當大小小於零時發送BUFFER_FLAG_END_OF_STREAM
。 請注意循環的標記位 ( mAudioExtractorDone
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.