Android 利用MediaCodec API 21录制视频和音频
我一直在摆弄MediaCodec和MediaMuxer,从虚拟显示器上录制视频。我把它弄得很好。现在我想录制麦克风的声音,并将其添加到视频中。我已经找到了许多完全符合我要求的示例,但是所有这些示例都使用了MediaCodec中不推荐的部分。我真的很困惑如何重构到新的api 首先,我有一个线程从这样的录音中读取字节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
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?关键字
弃用
我真傻,不懂你的意思。你能详细解释一下吗?