将音频混合到视频中,当停止MediaMuxer时,得到一个问题

问题描述 投票:0回答:1

[当我使用媒体编解码器音频合并到视频中时,我只想在调用android时从音频的10 s中捕获一个片段。媒体。 MediaExtractor#seekTo,引入10 s参数后,MediaMuxer的最终停止将是一个错误,示例代码:

 private void startAudioCodec(MediaCodec decoder, MediaCodec encoder, MediaExtractor extractor, long firstSampleTime, long startPosition, long duration) {
    MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
    MediaCodec.BufferInfo outputInfo = new MediaCodec.BufferInfo();
    boolean done = false;
    boolean inputDone = false;
    boolean decodeDone = false;
    extractor.seekTo(firstSampleTime + startPosition, SEEK_TO_PREVIOUS_SYNC);
    int decodeinput = 0;
    int encodeinput = 0;
    int encodeoutput = 0;
    long lastEncodeOutputTimeStamp = -1;
    int channelCount = 1;
    info.presentationTimeUs = 0;


    while (!done) {
        if (!inputDone) {
            int inputIndex = decoder.dequeueInputBuffer(TIMEOUT_USEC);
            if (inputIndex >= 0) {
                ByteBuffer inputBuffer = decoder.getInputBuffer(inputIndex);
                inputBuffer.clear();
                int readSampleData = extractor.readSampleData(inputBuffer, 0);
                long dur = extractor.getSampleTime() - firstSampleTime - startPosition;
                if ((dur < duration) && readSampleData > 0) {
                    decoder.queueInputBuffer(inputIndex, 0, readSampleData, extractor.getSampleTime()-startPosition, 0);//pts need to subtract the value of startPosition
                    decodeinput++;
                    // System.out.println("videoCliper audio decodeinput" + decodeinput + " dataSize" + readSampleData + " sampeTime" + extractor.getSampleTime());
                    extractor.advance();
                } else {
                    decoder.queueInputBuffer(inputIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
                    System.out.println("videoCliper audio decodeInput end");
                    inputDone = true;
                }
            }
        }

错误日志:2020-03-28 14:49:22.549 32612-2052/com.srwl.mytx E/MPEG4Writer: The number of recorded samples is 0 2020-03-28 14:49:22.550 32612-2053/com.srwl.mytx I/MPEG4Writer: Received total/0-length (999/0) buffers and encoded 998 frames. - Video 2020-03-28 14:49:22.550 32612-2052/com.srwl.mytx E/MPEG4Writer: Dumping Audio track's last 10 frames timestamp and frame type 2020-03-28 14:49:22.550 32612-2052/com.srwl.mytx W/MPEG4Writer: 0-duration samples found: 1 2020-03-28 14:49:22.550 32612-2052/com.srwl.mytx W/MPEG4Writer: 0-duration samples found: 1 2020-03-28 14:49:22.550 32612-2052/com.srwl.mytx I/MPEG4Writer: Received total/0-length (0/0) buffers and encoded 0 frames. - Audio 2020-03-28 14:49:22.550 32612-2052/com.srwl.mytx I/MPEG4Writer: Audio track drift time: 0 us 2020-03-28 14:49:22.558 32612-2006/com.srwl.mytx E/AndroidRuntime: FATAL EXCEPTION: pool-7-thread-2 Process: com.srwl.mytx, PID: 32612 java.lang.IllegalStateException: Failed to stop the muxer at android.media.MediaMuxer.nativeStop(Native Method)

我希望有人可以告诉我出了什么问题。谢谢

audio video mediacodec mix mediamuxer
1个回答
0
投票

问题已经解决。

像这样:

  outputInfo.presentationTimeUs -= startPosition;
                    if (outputInfo.presentationTimeUs > lastEncodeOutputTimeStamp) {
                        encodeoutput++;
                        System.out.println("videoCliper audio encodeOutput" + encodeoutput + " dataSize" + outputInfo.size + " sampeTime" + outputInfo.presentationTimeUs);
                        mMediaMuxer.writeSampleData(muxAudioTrack, encodedData, outputInfo);
                        lastEncodeOutputTimeStamp = outputInfo.presentationTimeUs;
                    }

从开始时间减去写给mediamuxer的点数

© www.soinside.com 2019 - 2024. All rights reserved.