HTTPライブストリーミングを使用するラジオアプリにAVPlayer
を使用しています。次に、そのオーディオストリームにレベルメーターを実装します。さまざまな周波数を表示するレベルメーターが最適ですが、単純な左/右のソリューションが出発点として最適です。
AVAudioPlayer
を使用したいくつかの例を見つけました。しかし、必要な情報をAVPlayer
から取得するための解決策が見つかりません。
誰かが私の問題の解決策を考えることができますか?
[〜#〜] edit [〜#〜]このようなものを作成したい(しかしもっと良い)
編集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
残念ながら、AVFoundation
でHLSストリームを使用しても、オーディオトラックを制御することはできません。 HLSストリームをミュートしようとして同じ問題が発生しましたが、それは不可能であることが判明しました。
オーディオデータを読み取る唯一の方法は、AVAudioSession
を利用することです。
[〜#〜]編集[〜#〜]
次のようにAVAudioSessionにアクセスできます。
[AVAudioSession sharedInstance]
AVAudioSession のドキュメントは次のとおりです。
AVPlayer
を使用してオーディオを測定することは、まだ進行中の問題のようです。そうは言っても、AVPlayer
とAVAudioRecorder
を組み合わせることで解決策が得られると思います。
2つのクラスの目的は一見矛盾しているように見えますが、AVAudioRecorder
がAVPlayer
のオーディオ出力にアクセスできるようにする回避策があります。
この Stack Overflow Answer で説明されているように、kAudioSessionProperty_AudioRouteChange
を使用してaudio route changeにアクセスすると、AVPlayerのオーディオを録音できます。
オーディオ録音を開始する必要があることに注意してくださいafterオーディオルート変更へのアクセス。リンクされたスタックの回答を参照として使用してください。詳細と必要なコードが含まれています。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
AVPlayer
のオーディオルートにアクセスして録音すると、measuringは比較的簡単です。
私の answer マイク入力の測定に関するスタックの質問では、オーディオレベルの測定にアクセスするために必要な手順について説明します。 AVAudioRecorder
を使用して音量の変化を監視するのは想像以上に複雑なので、録音中に音声の変化を監視するためのテンプレートとして機能するGitHub project を含めました。
~~~~~~~~~~~~~~~~~~~~~~~~~~ 注意してください ~~~~~~~~~~~~~~~ ~~~~~~~~~~~
HLSライブストリーム中のこの組み合わせは、私がテストしたものではありません。この答えは厳密に理論的なものであるため、完全に理解するには両方のクラスを十分に理解する必要があります。