如何利用硬件解码音频



我有一个缓冲区,其中包含ffmpeg从使用H264/AAC编码的视频文件中读取的数据包根据苹果公司的文件,AAC编码的音频流可以在硬件支持下解码,

如何在硬件支持下解码音频流?

更新:我使用音频队列服务来输出音频。现在我使用ffmpeg解码AAC数据包,并将LPCM音频发送到AQS。根据苹果公司的文件,我可以直接将AAC音频发送给AQ,它将负责解码任务。它用硬件解码吗?我需要,以及如何设置音频队列的参数以启用音频硬件解码?

您可以告诉系统不要使用硬件解码,但可能不会使用其他方式。

常数,以确定可以使用哪些硬件编解码器。

enum {
kAudioFormatProperty_HardwareCodecCapabilities = 'hwcc',
};

常量kAudioFormatProperty_HardwareCodecCapabilities一个UInt32值,指示如果应用程序按指定顺序开始使用指定列表中可使用的编解码器的数量。将inSpecifier参数设置为描述一组一个或多个音频编解码器的AudioClassDescription结构的阵列。如果属性值与inSpecifier参数中的数组大小相同,则可以使用所有指定的编解码器。在iOS 3.0及更高版本中可用。以AudioFormat.h声明。讨论使用此属性可以确定是否可以同时实例化所需的编解码器集。

基于硬件的编解码器只能在使用音频队列服务或使用接口(如AV Foundation)播放或录制时使用,这些接口使用音频队列服务。特别是,不能将基于硬件的音频编解码器与OpenAL一起使用或在使用I/O音频单元时使用。

在描述硬件编解码器的存在时,系统不考虑当前音频会话类别。某些类别不允许使用硬件编解码器。通过这个常数,仅基于硬件是否支持指定的编解码器组合,一组硬件编解码器被认为是可用的。

一些编解码器可以在硬件和软件实现中都可用。使用kAudioFormatProperty_EncoderskAudioFormatProperty_Decoders常量来确定给定的编解码器是否存在,以及它是基于硬件还是基于软件。

基于软件的编解码器总是可以实例化的,所以在使用软件编码或解码时不需要使用这个常数。

以下代码示例说明了如何按优先级顺序检查硬件AAC编码器和硬件AAC解码器是否可用:

AudioClassDescription requestedCodecs[2] = {
{
kAudioEncoderComponentType,
kAudioFormatAAC,
kAppleHardwareAudioCodecManufacturer
},
{
kAudioDecoderComponentType,
kAudioFormatAAC,
kAppleHardwareAudioCodecManufacturer
}
};
UInt32 successfulCodecs = 0;
size = sizeof (successfulCodecs);
OSStatus result =   AudioFormatGetProperty (
kAudioFormatProperty_HardwareCodecCapabilities,
requestedCodecs,
sizeof (requestedCodecs),
&size,
&successfulCodecs
);
switch (successfulCodecs) {
case 0:
// aac hardware encoder is unavailable. aac hardware decoder availability
// is unknown; could ask again for only aac hardware decoding
case 1:
// aac hardware encoder is available but, while using it, no hardware
// decoder is available.
case 2:
// hardware encoder and decoder are available simultaneously
}

https://github.com/mooncatventures-group/sampleDecoder

然而,你可能最好使用audioUnits,而不是音频队列

您可以,尽管像往常一样,Core Audio有各种警告和边缘情况需要注意。

将属性kExtAudioFileProperty_CodecManufacturer设置为kAppleHardwareAudioCodecManufacturer。请在设置客户端数据格式之前执行此操作。

ExtendedAudioFile.h中的一些文档

与其进行此计算,不如在此处强制使用非常大的缓冲区大小。

status=AudioQueueAllocateBufferWithPacketDescriptions(audioQueue_,_audioCodecContext->bit_rate*kAudioBufferSeconds/8,_audioCodecContext->sample_rate*kAudioBufferSeconds/_audioCodecContext->frame_ size+1,&audioQueueBuffer_[i]);

发现这个:

https://developer.apple.com/library/ios/qa/qa1663/_index.html

因为AudioFormatGetProperty不经常工作。上面描述了如何将AudioFormatGetPropertyInfo用于编码器或解码器,并检测硬件或软件中存在的内容。

相关内容

  • 没有找到相关文章