Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 利用MediaCodec API 21录制视频和音频_Android_Android Mediacodec_Android Audiorecord_Mediamuxer - Fatal编程技术网

Android 利用MediaCodec API 21录制视频和音频

Android 利用MediaCodec API 21录制视频和音频,android,android-mediacodec,android-audiorecord,mediamuxer,Android,Android Mediacodec,Android Audiorecord,Mediamuxer,我一直在摆弄MediaCodec和MediaMuxer,从虚拟显示器上录制视频。我把它弄得很好。现在我想录制麦克风的声音,并将其添加到视频中。我已经找到了许多完全符合我要求的示例,但是所有这些示例都使用了MediaCodec中不推荐的部分。我真的很困惑如何重构到新的api 首先,我有一个线程从这样的录音中读取字节 while (running && recording) { audioPresentationTimeNs = System.nanoTime

我一直在摆弄MediaCodec和MediaMuxer,从虚拟显示器上录制视频。我把它弄得很好。现在我想录制麦克风的声音,并将其添加到视频中。我已经找到了许多完全符合我要求的示例,但是所有这些示例都使用了MediaCodec中不推荐的部分。我真的很困惑如何重构到新的api

首先,我有一个线程从这样的录音中读取字节

while (running && recording) {
            audioPresentationTimeNs = System.nanoTime();

            iReadResult = mAudioRecord.read(mTempBuffer, 0, SAMPLES_PER_FRAME);
            if(iReadResult == AudioRecord.ERROR_BAD_VALUE || iReadResult == AudioRecord.ERROR_INVALID_OPERATION)
                Log.e(TAG, "audio buffer read error");

            // send current frame data to encoder
            try {
这不起作用,因为无法将dequeueInputBuffer称为异步。。。那么我需要做什么才能在这里获得正确的inputBufferIndex呢

                int inputBufferIndex = audioEncoder.dequeueInputBuffer(-1);

                if (inputBufferIndex >= 0) {
                    inputBuffer = audioEncoder.getInputBuffer(inputBufferIndex);
                    inputBuffer.clear();
                    inputBuffer.put(mTempBuffer);

                    if(VERBOSE)Log.d(TAG, "sending frame to audio encoder");
                    audioEncoder.queueInputBuffer(inputBufferIndex, 0, mTempBuffer.length, audioPresentationTimeNs / 1000, 0);
                }
            } catch (Throwable t) {
                Log.e(TAG, "sendFrameToAudioEncoder exception");
                t.printStackTrace();
            }
        }
然后我有我的回调,它由我的AudioEncoder使用,它应该从AudioRecord接收数据:

private class audioEncoderCallback extends MediaCodec.Callback{
我应该在这里接收输入数据并发送到onOutputBufferAvailable吗

    @Override
    public void onInputBufferAvailable(MediaCodec codec, int index) {
    }
这一部分应该是将数据传送到muxer

    @Override
    public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {

        if(muxerStarted) {
            ByteBuffer encodedData = codec.getOutputBuffer(index);

            encodedData.position(info.offset);
            encodedData.limit(info.offset + info.size);

            mMuxer.writeSampleData(audioTrackIndex, encodedData, info);
            if (VERBOSE) Log.d(TAG, "AudioEncoder sent " + info.size + " bytes to mMuxer");

            codec.releaseOutputBuffer(index, false);
        }
    }

    @Override
    public void onError(MediaCodec codec, MediaCodec.CodecException e) {
        Log.d(TAG, "Error: " + e);
    }
我是否考虑同时使用audioTrackIndex和videoTrackIndex将数据传送到muxer中

    @Override
    public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
        if (VERBOSE) Log.d(TAG, "encoder output format changed: " + format);

        audioTrackIndex = mMuxer.addTrack(format);
        if(videoTrackIndex != -1) {
            muxerStarted = true;
            mMuxer.start();
        }
    }
}

嗨,我很难理解你的问题。据我所知,MediaCodec和MediaMuxer都是从API-18开始提供的。你为什么提到API-21?关键字
弃用
我真傻,不懂你的意思。你能详细解释一下吗?