65

AVPlayerHTTP ライブ ストリーミングを使用したラジオ アプリに使用しています。次に、そのオーディオ ストリームのレベル メーターを実装します。さまざまな周波数を示すレベルメーターが最適ですが、単純な左/右のソリューションが出発点として最適です。

を使用した例をいくつか見つけましAVAudioPlayerた。しかし、必要な情報をオフにするための解決策が見つかりませんAVPlayer

誰かが私の問題の解決策を考えることができますか?

編集私はこのようなものを作成したい(しかしより良い)

素敵なレベルメーター

編集Ⅱ

1 つの提案はMTAudioProcessingTap、生のオーディオ データを取得するために を使用することでした。配列を使用して見つけることができた例[[[_player currentItem] asset] tracks]は、私の場合は空の配列です。もう 1 つの提案[[_player currentItem] audioMix]null、私に適したものを使用することでした。

編集Ⅲ

も経った今でも、解決策はないようです。私は確かに進歩したので、それを共有します。

セットアップ中に、key-value オブザーバーを playerItem に追加しています。

[[[self player] currentItem] addObserver:self forKeyPath:@"tracks" options:kNilOptions context:NULL];

//////////////////////////////////////////////////////

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context
    if ([keyPath isEqualToString:@"tracks"] && [[object tracks] count] > 0) {
        for (AVPlayerItemTrack *itemTrack in [object tracks]) {
            AVAssetTrack *track = [itemTrack assetTrack];

            if ([[track mediaType] isEqualToString:AVMediaTypeAudio]) {
                [self addAudioProcessingTap:track];
                break;
            }
        }
}

- (void)addAudioProcessingTap:(AVAssetTrack *)track {
    MTAudioProcessingTapRef tap;
    MTAudioProcessingTapCallbacks callbacks;
    callbacks.version = kMTAudioProcessingTapCallbacksVersion_0;
    callbacks.clientInfo = (__bridge void *)(self);
    callbacks.init = init;
    callbacks.prepare = prepare;
    callbacks.process = process;
    callbacks.unprepare = unprepare;
    callbacks.finalize = finalise;

    // more tap setup...

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];

    AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack];
    [inputParams setAudioTapProcessor:tap];
    [audioMix setInputParameters:@[inputParams]];

    [[[self player] currentItem] setAudioMix:audioMix];
}

ここまでは順調ですね。これはすべて機能し、適切なトラックを見つけて、inputParams や audioMix などをセットアップできました。しかし、残念ながら、呼び出される唯一のコールバックは init コールバックです。他のどれもどの時点でも発砲しません。

さまざまな (種類の) ストリーム ソースを試しました。そのうちの 1 つは公式の Apple HLS ストリームです: http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

4

2 に答える 2

2

残念ながら、HLS ストリームを使用してAVFoundationも、オーディオ トラックを制御することはできません。HLS ストリームをミュートしようとして同じ問題に遭遇しましたが、それは不可能であることが判明しました。

オーディオ データを読み取る唯一の方法は、AVAudioSession.

編集

次のように AVAudioSession にアクセスできます。

[AVAudioSession sharedInstance]

AVAudioSessionのドキュメントは次のとおりです

于 2014-06-01T18:46:07.130 に答える