首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么"MediaCodec CodecException“中的"queueInputBuffer”只发生在Android 29上?

为什么"MediaCodec CodecException“中的"queueInputBuffer”只发生在Android 29上?
EN

Stack Overflow用户
提问于 2020-02-19 18:39:45
回答 2查看 2.9K关注 0票数 3

基本信息

targetSdkVersion 28

目标:类的目标是在发送到我的服务器之前调整视频的大小。

Problem:该应用程序只在API 29上崩溃,无论是使用实际设备还是使用AVD。例如,代码在Pixel 2 API 28上运行得很好,但在Pixel 2 API 29上却不起作用。

源代码:我主要使用来自bigflake.com的示例代码。

错误消息(详细日志见下文):

代码语言:javascript
运行
复制
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)

由于的日志信息有限,我尝试了,但没有成功地从MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface更改为MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible

日志将显示最后两个缓冲区周期。我希望你能看到有价值的东西。

不使用*Pixel 2 API 29*的日志

代码语言:javascript
运行
复制
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)

使用*Pixel 2 API 28*的日志

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

发布于 2020-03-06 21:27:22

我还使用了Bigflake代码,并在Android 10 (API 29)中遇到了这个问题。

其他链接的问题是有帮助的,但是不要直接回答关于如何修改Bigflake代码的问题。花了几个小时之后,这就是我想出来的。

用于视频和音频,在doExtractDecodeEditEncodeMux中,在

代码语言:javascript
运行
复制
                 xxxxxDecoder.queueInputBuffer(
                            decoderInputBufferIndex,
                            0,
                            0,
                            0,
                            MediaCodec.BUFFER_FLAG_END_OF_STREAM);

调用时,需要添加以下代码行,以确保使用空缓冲区发送EOS。

代码语言:javascript
运行
复制
                    // wait forever for a new buffer
                    decoderInputBufferIndex = xxxxxDecoder.dequeueInputBuffer(-1);

有两个这样的实例,生成的视频代码如下所示,并给出了大部分上下文:

代码语言:javascript
运行
复制
                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");
                }

希望这能帮到其他人。

票数 2
EN

Stack Overflow用户

发布于 2020-06-11 01:24:12

我遇到了同样的问题,并最终解决了。我使用了asynctaskMode和编解码器回调。

代码语言:javascript
运行
复制
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)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60307164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档