我有一个缓冲区,其中包含 ffmpeg 从使用 H264/AAC 编码的视频文件中读取的数据包根据 Apple 文档,在 AAC 中编码的音频流可以在硬件支持下进行解码,
如何在硬件支持的情况下解码音频流?
更新:我使用音频队列服务来输出音频。现在我使用 ffmpeg 解码 AAC 数据包并将 LPCM 音频发送到 AQS。根据 Apple 文档,我可以直接将 AAC 音频发送到 AQ,它会负责解码任务。它是用硬件解码的吗?我需要,以及如何设置音频队列的参数来启用音频硬件解码?
我有一个缓冲区,其中包含 ffmpeg 从使用 H264/AAC 编码的视频文件中读取的数据包根据 Apple 文档,在 AAC 中编码的音频流可以在硬件支持下进行解码,
如何在硬件支持的情况下解码音频流?
更新:我使用音频队列服务来输出音频。现在我使用 ffmpeg 解码 AAC 数据包并将 LPCM 音频发送到 AQS。根据 Apple 文档,我可以直接将 AAC 音频发送到 AQ,它会负责解码任务。它是用硬件解码的吗?我需要,以及如何设置音频队列的参数来启用音频硬件解码?
您可以告诉系统不要使用硬件解码,但可能不是相反。
常量来确定可以使用哪些硬件编解码器。
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 而不是音频队列
您可以,尽管像往常一样使用 Core Audio 有各种警告和边缘情况需要注意。
将属性设置kExtAudioFileProperty_CodecManufacturer
为kAppleHardwareAudioCodecManufacturer
。在设置客户端数据格式之前执行此操作。
中的一些文档ExtendedAudioFile.h
找到这个宝石:
https://developer.apple.com/library/ios/qa/qa1663/_index.html
由于 AudioFormatGetProperty 不经常工作。上面描述了如何将 AudioFormatGetPropetyInfo 用于编码器或解码器,并检测硬件或软件中存在哪些。
而不是做这个计算只是在这里强制一个非常大的缓冲区大小。
status = AudioQueueAllocateBufferWithPacketDescriptions(audioQueue_, _audioCodecContext->bit_rate * kAudioBufferSeconds / 8, _audioCodecContext->sample_rate * kAudioBufferSeconds / _audioCodecContext->frame_size + 1, &audioQueueBuffer_[i]);