2

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

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

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

4

4 回答 4

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

于 2012-12-15T21:21:23.023 回答
1

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

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

中的一些文档ExtendedAudioFile.h

于 2012-12-10T16:28:08.207 回答
0

找到这个宝石:

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

由于 AudioFormatGetProperty 不经常工作。上面描述了如何将 AudioFormatGetPropetyInfo 用于编码器或解码器,并检测硬件或软件中存在哪些。

于 2014-03-20T22:55:58.610 回答
0

而不是做这个计算只是在这里强制一个非常大的缓冲区大小。

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

于 2012-12-18T00:37:40.770 回答