web-dev-qa-db-ja.com

AVPlayer HLSライブストリームレベルメーター(FFTデータの表示)

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

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

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

[〜#〜] edit [〜#〜]このようなものを作成したい(しかしもっと良い)

Nice levelmeter

編集II

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

編集III

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

セットアップ中に、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

60

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

オーディオデータを読み取る唯一の方法は、AVAudioSessionを利用することです。

[〜#〜]編集[〜#〜]

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

[AVAudioSession sharedInstance]

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

2
Simon Germain

AVPlayerを使用してオーディオを測定することは、まだ進行中の問題のようです。そうは言っても、AVPlayerAVAudioRecorderを組み合わせることで解決策が得られると思います。

2つのクラスの目的は一見矛盾しているように見えますが、AVAudioRecorderAVPlayerのオーディオ出力にアクセスできるようにする回避策があります。

プレーヤー/レコーダー

この Stack Overflow Answer で説明されているように、kAudioSessionProperty_AudioRouteChangeを使用してaudio route changeにアクセスすると、AVPlayerのオーディオを録音できます。

オーディオ録音を開始する必要があることに注意してくださいafterオーディオルート変更へのアクセス。リンクされたスタックの回答を参照として使用してください。詳細と必要なコードが含まれています。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~

AVPlayerのオーディオルートにアクセスして録音すると、measuringは比較的簡単です。

オーディオレベル

私の answer マイク入力の測定に関するスタックの質問では、オーディオレベルの測定にアクセスするために必要な手順について説明します。 AVAudioRecorderを使用して音量の変化を監視するのは想像以上に複雑なので、録音中に音声の変化を監視するためのテンプレートとして機能するGitHub project を含めました。

~~~~~~~~~~~~~~~~~~~~~~~~~~ 注意してください ~~~~~~~~~~~~~~~ ~~~~~~~~~~~

HLSライブストリーム中のこの組み合わせは、私がテストしたものではありません。この答えは厳密に理論的なものであるため、完全に理解するには両方のクラスを十分に理解する必要があります。

1
ChrisHaze