我有一个缓冲器,其中包含由ffmpeg从根据Apple文档使用H264/AAC编码的视频文件读取的分组,在AAC中编码的音频流可以在硬件支持下被解码,
如何在硬件支持下对音频流进行解码?
更新:我使用音频队列服务来输出音频。现在,我使用ffmpeg解码AAC数据包,并将LPCM音频发送到AQS。根据苹果公司的文件,我可以直接将AAC音频发送给AQ,它将负责解码任务。它能用硬件解码吗?我是否需要,如何设置Audio Queue的参数来启用音频硬件解码?
发布于 2012-12-16 05:21:23
您可以告诉系统不要使用硬件解码,但可能不会反过来。
常量来确定可以使用哪些硬件编解码器。
enum {
kAudioFormatProperty_HardwareCodecCapabilities = 'hwcc',
};
UInt32 kAudioFormatProperty_HardwareCodecCapabilities
一个Constants值,指示指定列表中可以使用的编解码器的数量(如果应用程序按指定顺序开始使用编解码器)。将inSpecifier
参数设置为描述一组包含一个或多个音频编解码器的AudioClassDescription
结构的数组。如果属性值与inSpecifier
参数中数组的大小相同,则可以使用所有指定的编解码器。在iOS 3.0及更高版本中可用。在AudioFormat.h中声明。讨论使用此属性来确定是否可以同时实例化所需的编解码器集。
仅当使用音频队列服务或使用使用音频队列服务的AV Foundation等接口播放或录制时,才能使用基于硬件的编解码器。特别是,不能将基于硬件的音频编解码器与OpenAL一起使用,也不能在使用I/O音频单元时使用。
在描述硬件编解码器的存在时,系统不考虑当前音频会话类别。某些类别不允许使用硬件编解码器。一组硬件编解码器仅根据硬件是否支持指定的编解码器组合而被认为是可用的。
某些编解码器可以在硬件和软件实现中都可用。使用kAudioFormatProperty_Encoders
和kAudioFormatProperty_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-11 00:28:08
你可以,虽然像往常一样,核心音频有各种警告和边缘情况要注意。
将属性kExtAudioFileProperty_CodecManufacturer
设置为kAppleHardwareAudioCodecManufacturer
。在设置客户端数据格式之前执行此操作。
ExtendedAudioFile.h
中的一些文档
发布于 2012-12-18 08:37:41
与其这样计算,不如在这里强制设置一个非常大的缓冲区大小。
status = AudioQueueAllocateBufferWithPacketDescriptions(audioQueue_,_audioCodecContext->bit_rate * kAudioBufferSeconds / 8,_audioCodecContext->sample_rate * kAudioBufferSeconds / _audioCodecContext->frame_size + 1,&audioQueueBuffer_i);
https://stackoverflow.com/questions/13804429
复制相似问题