Android MediaCodec-将音频实时编码到aac中

Android MediaCodec-将音频实时编码到aac中,android,encoding,aac,Android,Encoding,Aac,我正在尝试使用来自Android的代码将原始音频数据编码到aac中。 我通过Andoid文档完成了我的工作,它缺少很多东西。我目前能够录制音频使用和做编码的飞行 问题是生成的输出似乎无效。没有玩家可以播放它,玩家也无法打开文件。后者可能是因为输出没有包装到有效的容器中。关于如何处理编码器的输入缓冲区大小,没有明确的文档。因此,我尝试在再次排队之前完全填充每个输入缓冲区,但没有成功。我还尝试提交带有最后一个缓冲区的\u-OF-STREAM \u标志的结束\u,但也没有成功 是否有人成功使用了Med

我正在尝试使用来自Android的代码将原始音频数据编码到aac中。 我通过Andoid文档完成了我的工作,它缺少很多东西。我目前能够录制音频使用和做编码的飞行

问题是生成的输出似乎无效。没有玩家可以播放它,玩家也无法打开文件。后者可能是因为输出没有包装到有效的容器中。关于如何处理编码器的输入缓冲区大小,没有明确的文档。因此,我尝试在再次排队之前完全填充每个输入缓冲区,但没有成功。我还尝试提交带有最后一个缓冲区的\u-OF-STREAM \u标志的结束\u,但也没有成功

是否有人成功使用了MediaEncoder,并能提供一些正确使用的信息?是否有可能生成有效的媒体容器,如mpeg4


提前谢谢

您可以使用MediaCodec AAC解码器再次解码原始数据。只需确保按照

选择容器中所述正确设置即可。我更喜欢ADT

将有效负载数据复制到一个足够大的容器中,只需添加位即可。所以在网上搜寻我的解决方案后,我整理了一些片段

    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;

在Android 4.3及更高版本上,您可以使用该类将MediaCodec的输出打包到MPEG-4容器中。另外,当AAC包含在.MP4中时,它不需要每个数据包的ADTS头。我有一个简单的例子。你能提供一个更详细的例子吗?我想实施这个解决方案,但我不清楚它是如何结合在一起的。我正在下载AAC-ATDS音频文件并尝试在本地播放。如果我使用MediaCodec解码器将aac解码为PCM,然后将其送入音频曲目,我可以在本地播放。我更愿意把它重新编码成一种可以用普通媒体播放器播放的格式。(我不知道下载文件上的ATDS头为什么不起作用,但我相信MediaCodec解码器会将它们去除;如果它们确实存在的话)。
            byte chunkADTS[]=new byte[info.size + 7];
            fillInADTSHeader(chunkADTS,info.size);
            outputBuffers[bR].get(chunkADTS,7,info.size);
            buffer.pushData(chunkADTS);