我正在尝试使用Android的MediaCodec将原始音频数据编码为aac。 我通过Andoid文档工作,缺乏很多。我现在能够使用AudioRecord录制音频并动态执行编码。
问题是生成的输出似乎没有效果。没有玩家可以回放,MediaExtractor无法打开文件。后者可能是因为输出未包装到有效容器中。没有关于如何处理编码器的输入缓冲区大小的明确文档。所以我尝试完全填充每个输入缓冲区,然后再次排队,但没有成功。我也尝试使用最后一个缓冲区提交END_OF_STREAM_FLAG也没有成功。
是否有人成功使用了MediaEncoder并可以提供有关如何正确使用它的一些信息?是否有可能生成有效的媒体容器,如mpeg4?
提前致谢!
答案 0 :(得分:2)
为它选择一个容器。我更喜欢adts。
将有效负载数据复制到足够容纳您容器的aray中,只需添加您的位。因此,在搜索了我的解决方案之后,我将一些片段放到了适当位置
profile =( configParams[0]>>3 )&0x1f;
frequency_index = (this.configParams[0]&0x7) <<1 | (this.configParams[1]>>7) &0x1;
channel_config = (this.configParams[1]>>3) &0xf;
int finallength = encoded_length + 7;
ENCodedByteArray[0] = (byte) 0xff;
ENCodedByteArray[1] = (byte) 0xf1;
ENCodedByteArray[2] = (byte) ( ((profile - 1) << 6) + (frequency_index << 2) +(channel_config >> 2));
ENCodedByteArray[3] = (byte) (((channel_config & 0x3) << 6) + (finallength >> 11));
ENCodedByteArray[4] = (byte)( (finallength & 0x7ff) >> 3);
ENCodedByteArray[5] = (byte) (((finallength & 7) << 5) + 0x1f) ;
ENCodedByteArray[6] = (byte) 0xfc;
使用类似
的内容 byte chunkADTS[]=new byte[info.size + 7];
fillInADTSHeader(chunkADTS,info.size);
outputBuffers[bR].get(chunkADTS,7,info.size);
buffer.pushData(chunkADTS);