2

H264 / AACを使用してエンコードされたビデオファイルからffmpegによって読み取られたパケットを含むバッファがありますAppleのドキュメントによると、AACでエンコードされたオーディオストリームはハードウェアサポートでデコードできます、

ハードウェアサポートを使用してオーディオストリームをデコードする方法は?

更新:オーディオキューサービスを使用してオーディオを出力します。今、私はffmpegを使用してAACパケットをデコードし、LPCMオーディオをAQSに送信します。Appleのドキュメントによると、AACオーディオをAQに直接送信でき、デコードタスクを処理します。ハードウェアでデコードしますか?オーディオハードウェアのデコードを有効にするために、Audio Queueのパラメータを設定する必要がありますか?

4

4 に答える 4

4

ハードウェアデコードを使用しないようにシステムに指示できますが、その逆はおそらくできません。

使用できるハードウェアコーデックを決定するための定数。

enum {
    kAudioFormatProperty_HardwareCodecCapabilities = 'hwcc',
};

定数 kAudioFormatProperty_HardwareCodecCapabilities アプリケーションが指定された順序でコーデックの使用を開始した場合に使用できる、指定されたリストのコーデックの数を示すUInt32値。パラメータを、 1つまたは複数のオーディオコーデックのセットを記述する構造体inSpecifierの配列に設定します。AudioClassDescriptionプロパティ値がパラメータの配列のサイズと同じである場合inSpecifier、指定されたすべてのコーデックを使用できます。iOS3.0以降で利用できます。AudioFormat.hで宣言されています。ディスカッションこのプロパティを使用して、目的のコーデックのセットを同時にインスタンス化できるかどうかを判断します。

ハードウェアベースのコーデックは、Audio Queue Servicesを使用して、またはAudioQueueServicesを使用するAVFoundationなどのインターフェイスを使用して再生または録音する場合にのみ使用できます。特に、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-15T21:21:23.023 に答える
1

Core Audioではいつものように、注意すべきさまざまな警告やエッジケースがあります。

kExtAudioFileProperty_CodecManufacturerプロパティをに設定しますkAppleHardwareAudioCodecManufacturer。クライアントデータ形式を設定する前にこれを行ってください。

のいくつかのドキュメントExtendedAudioFile.h

于 2012-12-10T16:28:08.207 に答える
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 に答える
0

この宝石を見つけました:

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

AudioFormatGetPropertyはあまり頻繁に機能しないため。上記は、エンコーダーまたはデコーダーにAudioFormatGetPropetyInfoを使用して、hwまたはswに存在するものを検出する方法を説明しています。

于 2014-03-20T22:55:58.610 に答える