【发布时间】:2016-10-06 09:44:08
【问题描述】:
我按照 Android 官方文档使用 MediaCodec 对象为我的音频输入设置了编码器。但是下面代码中的dequeueOutputBuffer方法总是返回-1。这个返回值是什么意思?
我的代码:
/*configuarion of MediaCodec object*/
codec = MediaCodec.createEncoderByType("audio/mp4a-latm");
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);
format.setInteger(MediaFormat.KEY_AAC_PROFILE,MediaCodecInfo.CodecProfileLevel.AACObjectHE);
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
codec.start();
ByteBuffer[] inputBuffers = codec.getInputBuffers();
ByteBuffer[] outputBuffers = codec.getOutputBuffers();
/*main loop to encode audio data*/
for (;;) {
int inputBufferIndex = codec.dequeueInputBuffer(-1); -->this is never zero so data should be written correctly!
if (inputBufferIndex >= 0) {
// write data from audiorecord in queue
inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(buf);-->data from audiorecord object
encoder.queueInputBuffer(inputBufferIndex, 0, buf.length, 0, 0);
codec.queueInputBuffer(inputBufferIndex, ...);
}
int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 0);-------->>> "-1"
if (outputBufferIndex >= 0) {
//do something but never called because outputbufferindex is always -1??
【问题讨论】:
-
数据不会马上准备好。在输出可用之前,您可能需要提交多个缓冲区。另见bigflake.com/mediacodec。
-
buf.length 的大小是多少?你会以某种方式向编码器发送正常的帧吗?也尝试将 codec.dequeueOutputBuffer(bufferInfo, 0) 更改为 codec.dequeueOutputBuffer(bufferInfo, 10000)
标签: android android-mediacodec