首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用硬件解码音频?

如何利用硬件解码音频?
EN

Stack Overflow用户
提问于 2012-12-10 23:56:11
回答 4查看 4.2K关注 0票数 2

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-16 05:21:23

您可以告诉系统不要使用硬件解码,但可能不会反过来。

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

代码语言:javascript
运行
复制
enum {
    kAudioFormatProperty_HardwareCodecCapabilities = 'hwcc',
};

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

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

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

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

基于软件的编解码器始终可以实例化,因此在使用软件编码或解码时不需要使用此常量。

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

代码语言:javascript
运行
复制
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可能比使用音频队列更好

票数 4
EN

Stack Overflow用户

发布于 2012-12-11 00:28:08

你可以,虽然像往常一样,核心音频有各种警告和边缘情况要注意。

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

ExtendedAudioFile.h中的一些文档

票数 1
EN

Stack Overflow用户

发布于 2012-12-18 08:37:41

与其这样计算,不如在这里强制设置一个非常大的缓冲区大小。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13804429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档