Muxer停止问题

时间:2017-10-28 10:27:46

标签: android mediacodec mediamuxer

我使用以下代码合并音频和视频(仅限视频)。 并收到错误 java.lang.IllegalStateException:无法停止复用器

输入音频文件格式为aac
输入视频文件格式为mp4

输出文件格式为mp4

代码执行正常,直到muxer.stop();然后抛出异常 java.lang.IllegalStateException:无法停止复用器

我已经检查了与类似问题相关的答案,并尝试了给出的补救措施,但它仍然引发了异常。

public void muxing() {

        String outputFile = "";

        try {


            outputFile = dabsolutePath;

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

            AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.audio);

            MediaExtractor audioExtractor = new MediaExtractor();
            audioExtractor.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());

            Log.d(TAG, "Video Extractor Track Count " + videoExtractor.getTrackCount());
            Log.d(TAG, "Audio Extractor Track Count " + audioExtractor.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);

            audioExtractor.selectTrack(0);
            MediaFormat audioFormat = audioExtractor.getTrackFormat(0);
            int audioTrack = muxer.addTrack(audioFormat);

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

            boolean sawEOS = false;
            int frameCount = 0;
            int offset = 100;
            int sampleSize = 256 * 1024;
            ByteBuffer videoBuf = ByteBuffer.allocate(sampleSize);
            ByteBuffer audioBuf = ByteBuffer.allocate(sampleSize);
            MediaCodec.BufferInfo videoBufferInfo = new MediaCodec.BufferInfo();
            MediaCodec.BufferInfo audioBufferInfo = new MediaCodec.BufferInfo();


            videoExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC);
            audioExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC);

            muxer.start();

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


                if (videoBufferInfo.size == 0 || audioBufferInfo.size == 0) {
                    Log.d(TAG, "saw input EOS.");
                    sawEOS = true;
                    videoBufferInfo.size = 0;

                } else {
                    videoBufferInfo.presentationTimeUs = videoExtractor.getSampleTime();
                    videoBufferInfo.flags = MediaCodec.BUFFER_FLAG_KEY_FRAME;
                    muxer.writeSampleData(videoTrack, videoBuf, videoBufferInfo);
                    videoExtractor.advance();


                    frameCount++;
                    Log.d(TAG, "Frame (" + frameCount + ") Video PresentationTimeUs:" + videoBufferInfo.presentationTimeUs + " Flags:" + videoBufferInfo.flags + " Size(KB) " + videoBufferInfo.size / 1024);
                    Log.d(TAG, "Frame (" + frameCount + ") Audio PresentationTimeUs:" + audioBufferInfo.presentationTimeUs + " Flags:" + audioBufferInfo.flags + " Size(KB) " + audioBufferInfo.size / 1024);

                }
            }

            Toast.makeText(getApplicationContext(), "frame:" + frameCount, Toast.LENGTH_SHORT).show();


            boolean sawEOS2 = false;
            int frameCount2 = 0;
            while (!sawEOS2) {
                frameCount2++;

                audioBufferInfo.offset = offset;
                audioBufferInfo.size = audioExtractor.readSampleData(audioBuf, offset);

                if (videoBufferInfo.size == 0 || audioBufferInfo.size == 0) {
                    Log.d(TAG, "saw input EOS.");
                    sawEOS2 = true;
                    audioBufferInfo.size = 0;
                } else {
                    audioBufferInfo.presentationTimeUs = audioExtractor.getSampleTime();
                    audioBufferInfo.flags = MediaCodec.BUFFER_FLAG_KEY_FRAME;
                    muxer.writeSampleData(audioTrack, audioBuf, audioBufferInfo);
                    audioExtractor.advance();


                    Log.d(TAG, "Frame (" + frameCount + ") Video PresentationTimeUs:" + videoBufferInfo.presentationTimeUs + " Flags:" + videoBufferInfo.flags + " Size(KB) " + videoBufferInfo.size / 1024);
                    Log.d(TAG, "Frame (" + frameCount + ") Audio PresentationTimeUs:" + audioBufferInfo.presentationTimeUs + " Flags:" + audioBufferInfo.flags + " Size(KB) " + audioBufferInfo.size / 1024);

                }
            }

            Toast.makeText(getApplicationContext(), "frame:" + frameCount2, Toast.LENGTH_SHORT).show();

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


        } catch (IOException e) {
            Log.d(TAG, "Mixer Error 1 " + e.getMessage());
        } catch (Exception e) {
            Log.d(TAG, "Mixer Error 2 " + e.getMessage());
        }


    }}

登录

D/Message: Video Format {csd-1=java.nio.HeapByteBuffer[pos=0 lim=10 cap=10], mime=video/avc, frame-rate=30, track-id=1, profile=8, width=512, height=536, max-input-size=22475, durationUs=3067643, csd-0=java.nio.HeapByteBuffer[pos=0 lim=30 cap=30], level=256}
D/Message: Audio Format {profile=2, mime=audio/mp4a-latm, durationUs=2965426, csd-0=java.nio.HeapByteBuffer[pos=0 lim=2 cap=2], channel-count=1, sample-rate=48000, track-id=1}
I/MPEG4Writer: limits: 4294967295/0 bytes/us, bit rate: -1 bps and the estimated moov size 3193 bytes
D/Message: saw input EOS.
D/Message: saw input EOS.
D/MPEG4Writer: Video track stopping
D/MPEG4Writer: Video track source stopping
D/MPEG4Writer: Video track source stopped
E/MPEG4Writer: The number of recorded samples is 0
W/MPEG4Writer: 0-duration samples found: 1
W/MPEG4Writer: 0-duration samples found: 1
I/MPEG4Writer: Received total/0-length (0/0) buffers and encoded 0 frames. - Audio
I/MPEG4Writer: Audio track drift time: 0 us
E/MPEG4Writer: The number of recorded samples is 0
W/MPEG4Writer: 0-duration samples found: 1
W/MPEG4Writer: 0-duration samples found: 1
I/MPEG4Writer: Received total/0-length (0/0) buffers and encoded 0 frames. - Video
D/MPEG4Writer: Video track stopped
D/MPEG4Writer: Audio track stopping
D/MPEG4Writer: Audio track source stopping
D/MPEG4Writer: Audio track source stopped
D/MPEG4Writer: Audio track stopped
D/MPEG4Writer: Duration from tracks range is [0, 0] us
D/MPEG4Writer: Stopping writer thread
D/MPEG4Writer: 0 chunks are written in the last batch
D/MPEG4Writer: Writer thread stopped
D/Message: Mixer Error 2 Failed to stop the muxer
E/EGL_emulation: tid 4390: eglSurfaceAttrib(1146): error 0x3009 (EGL_BAD_MATCH)
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x8c84e420, error=EGL_BAD_MATCH

1 个答案:

答案 0 :(得分:0)

您应该等待几秒钟,然后再调用

muxer.stop();

muxer.release();