我有一个缓冲区,其中包含ffmpeg从使用H264 / AAC编码的视频文件中读取的数据包 根据Apple文档,在AAC中编码的音频流可以通过硬件支持进行解码,
如何通过硬件支持解码音频流?
更新:我使用音频队列服务输出音频。现在我使用ffmpeg解码AAC数据包并将LPCM音频发送到AQS。根据Apple文档,我可以直接向AQ发送AAC音频,它将负责解码任务。它是用硬件解码的吗?我是否需要,以及如何设置音频队列的参数以启用音频硬件解码?
答案 0 :(得分:4)
您可以告诉系统不使用硬件解码,但可能不是相反。
常量以确定可以使用哪些硬件编解码器。
enum {
kAudioFormatProperty_HardwareCodecCapabilities = 'hwcc',
};
常量
kAudioFormatProperty_HardwareCodecCapabilities
一个UInt32值,指示可以使用的指定列表中的编解码器数量,如果应用程序要按指定的顺序开始使用它们。将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而不是音频队列
答案 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中存在的内容。