如何利用硬件解码音频?

时间:2012-12-10 15:56:11

标签: ios ffmpeg core-audio audioqueue

我有一个缓冲区,其中包含ffmpeg从使用H264 / AAC编码的视频文件中读取的数据包 根据Apple文档,在AAC中编码的音频流可以通过硬件支持进行解码,

如何通过硬件支持解码音频流?

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

4 个答案:

答案 0 :(得分:4)

您可以告诉系统不使用硬件解码,但可能不是相反。

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

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而不是音频队列

答案 1 :(得分:1)

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

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

ExtendedAudioFile.h

中的一些文档

答案 2 :(得分:0)

而不是进行此计算只是在这里强制使用非常大的缓冲区大小。

status = AudioQueueAllocateBufferWithPacketDescriptions(audioQueue_,         _audioCodecContext-> bit_rate * kAudioBufferSeconds / 8,         _audioCodecContext-> sample_rate * kAudioBufferSeconds /           _audioCodecContext-> frame_size + 1,         &安培; audioQueueBuffer_ [I]);

答案 3 :(得分:0)

找到这个宝石:

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

由于AudioFormatGetProperty不经常工作。上面描述了如何将SoundFormatGetPropetyInfo用于编码器或解码器,并检测hw或sw中存在的内容。