【问题标题】:Android MediaCodec - encode audio on the fly into aacAndroid MediaCodec - 将音频即时编码为 aac
【发布时间】:2013-01-14 07:23:32
【问题描述】:

我正在尝试使用 Android 中的 MediaCodec 将原始音频数据编码为 aac。 我通过了缺少很多的 Andoid 文档。我目前能够使用AudioRecord 录制音频并即时进行编码。

问题是生成的输出似乎无效。没有播放器可以播放它,MediaExtractor 无法打开文件。后者可能是因为输出未包装到有效容器中。没有关于如何处理编码器的输入缓冲区大小的明确文档。所以我试图在我再次排队之前完全填充每个输入缓冲区但没有成功。我也尝试用最后一个缓冲区提交 END_OF_STREAM_FLAG 也没有成功。

有没有人成功使用过 MediaEncoder 并且可以提供一些关于如何正确使用它的信息?是否有可能生成像 mpeg4 这样的有效媒体容器?

提前致谢!

【问题讨论】:

    标签: android encoding aac


    【解决方案1】:

    为它选择一个容器。我更喜欢广告。

    将有效负载数据复制到一个对您的容器足够大的数组中,只需添加您的位即可。所以在网上搜索了我的解决方案后,我做了一些 sn-p

        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);
    

    【讨论】:

    • 在 Android 4.3 及更高版本上,您可以使用 MediaMuxer 类将 MediaCodec 的输出打包到 MPEG-4 容器中。作为奖励,当 AAC 包含在 .MP4 中时,它不需要每个数据包的 ADTS 标头。我有一个简单的例子here
    • 你能提供一个更详细的例子吗?我想实施这个解决方案,但我不清楚它是如何组合在一起的。我正在下载 AAC-ATDS 音频文件并尝试在本地播放。如果我使用 MediaCodec 解码器将 aac 解码为 PCM,然后将其输入音轨,我可以在本地播放它。我更愿意将其重新编码为可使用常规媒体播放器播放的格式。 (我不知道为什么下载文件上的 ATDS 标头不起作用,但我相信 MediaCodec 解码器会剥离它们;如果它们确实存在的话)。
    【解决方案2】:

    您可以使用 MediaCodec AAC 解码器再次解码原始数据。请务必按照Decoding AAC using MediaCodec API on Android中所述正确设置它

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 2013-11-18
      • 2021-08-02
      • 2013-02-22
      • 1970-01-01
      • 2011-01-25
      • 2013-09-22
      • 2018-07-14
      • 2016-03-12
      相关资源
      最近更新 更多