Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.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 3gpp编码器输出缓冲区包含不正确的字节_Android_Amr_3gp_Android Mediacodec - Fatal编程技术网

Android MediaCodec 3gpp编码器输出缓冲区包含不正确的字节

Android MediaCodec 3gpp编码器输出缓冲区包含不正确的字节,android,amr,3gp,android-mediacodec,Android,Amr,3gp,Android Mediacodec,我正在尝试将来自麦克风的音频流编码为3gpp(AMR-NB)。问题是输出缓冲区包含奇怪的数据。代码和输出如下: 创建媒体编码器: MediaFormat format = MediaFormat.createAudioFormat("audio/3gpp", 8*1024, 1); format.setInteger(MediaFormat.KEY_BIT_RATE, 8*1024); format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, minBu

我正在尝试将来自麦克风的音频流编码为3gpp(AMR-NB)。问题是输出缓冲区包含奇怪的数据。代码和输出如下:

创建媒体编码器:

MediaFormat format = MediaFormat.createAudioFormat("audio/3gpp", 8*1024, 1);
format.setInteger(MediaFormat.KEY_BIT_RATE, 8*1024);
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, minBufSize);
MediaCodec encoder = MediaCodec.createEncoderByType("audio/3gpp");
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
encoder.start();
来自麦克风的PCM数据似乎正确(存储到文件中,大胆聆听)

读取编码字节(缓冲区,在线程中运行):

输出为:

07-11 13:13:58.622: 34 6c 1e 08 27 80 05 28 56 40 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
07-11 13:13:58.632: 34 6c 1e 08 27 80 05 28 56 40 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
07-11 13:13:58.667: 34 ff d9 08 27 80 05 28 56 40 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
07-11 13:13:58.672: 34 6c 1e 08 27 80 05 28 56 40 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
07-11 13:13:58.677: 34 6c 1e 08 27 80 05 28 56 40 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
我在谷歌上搜索过,没有找到任何帮助。Android文档在MediaCodec上的使用也不是很好——在outputbuffer上下文中使用ByteBuffer.clear()时有很多尝试和错误

致以最良好的祝愿,
啊哈。

感谢所有的患者,回答我自己的问题

真正的问题实际上是将原始PCM数据输入编码器输入。Android文档在如何准确地将数据输入到输入缓冲区方面含糊不清(好吧,老实说,它实际上更多地与ByteBuffer行为有关):

我的解释是添加以下数据:

inputBuffers[inputBufferIndex].clear();
inputBuffers[inputBufferIndex].put(audioPCMbuffer);
codec.queueInputBuffer(inputBufferIndex, ...);
上面的代码缺少一点:翻转ByteBuffer的位置

inputBuffers[inputBufferIndex].flip();

把它保存在这里供将来参考,因为很难找到简单的代码来查看实现。

给所有的患者,回答我自己的问题

真正的问题实际上是将原始PCM数据输入编码器输入。Android文档在如何准确地将数据输入到输入缓冲区方面含糊不清(好吧,老实说,它实际上更多地与ByteBuffer行为有关):

我的解释是添加以下数据:

inputBuffers[inputBufferIndex].clear();
inputBuffers[inputBufferIndex].put(audioPCMbuffer);
codec.queueInputBuffer(inputBufferIndex, ...);
上面的代码缺少一点:翻转ByteBuffer的位置

inputBuffers[inputBufferIndex].flip();

将其保留在此处供将来参考,因为很难找到简单的代码来查看实现。

flip()
设置
limit=position
然后
position=0
<代码>清除()设置
限制=容量
然后
位置=0
。我不确定在提交缓冲区后调用
flip()
有什么好处。
flip()
设置
limit=position
然后
position=0
<代码>清除()设置
限制=容量
然后
位置=0
。我不确定在提交缓冲区后调用
flip()
有什么好处。当缓冲区交给您时,
outputBuffer
上的位置和限制可能设置不正确。请尝试
outputBuffer.position(bufferInfo.offset)
outputBuffer.limit(bufferInfo.offset+bufferInfo.size)
。将缓冲区交给您时,
outputBuffer
上的位置和限制可能无法正确设置。尝试
outputBuffer.position(bufferInfo.offset)
outputBuffer.limit(bufferInfo.offset+bufferInfo.size)