オーディオ プレーヤーが 2 つのデータ シンクに出力する方法はありますか?
より具体的には、データソースをuriとして設定したオーディオプレーヤーを使用して、ネットからmp3をバッファおよび出力ミックスにストリーミングしようとしています。現在、オーディオ プレーヤーのシンクを出力ミックスのみに設定しているため、このファイルをストリーミングして、プリフェッチで十分なデータがあると判断されたときに再生できますが、同時にこのストリーミング データをバッファに入れたいと考えています。時間。
オーディオ プレーヤーが 2 つのデータ シンクに出力する方法はありますか?
より具体的には、データソースをuriとして設定したオーディオプレーヤーを使用して、ネットからmp3をバッファおよび出力ミックスにストリーミングしようとしています。現在、オーディオ プレーヤーのシンクを出力ミックスのみに設定しているため、このファイルをストリーミングして、プリフェッチで十分なデータがあると判断されたときに再生できますが、同時にこのストリーミング データをバッファに入れたいと考えています。時間。
答えはノーですが、これを回避する方法があります。
オーディオ プレーヤーを作成してバッファ キューに出力し、シンクを uri として作成すると、データを取得するのと同じ速さでバッファに再生されることに気付きませんでした。
それで、これが起こっていることに気づいたとき、ソースとしてバッファキューを持ち、シンクとして出力ミックスを持つ別のオーディオプレーヤーを作成しました。
すべての設定が完了したら、最初のオーディオ プレーヤー (uriPlayer) を一時停止します。これにより、「ダウンロード」が開始され、データがバッファーにストリーミングされます。uriPlayer のプリフェッチで十分なデータがあると判断されたら、uriPlayer の「デュレーション」をチェックして曲の長さを調べ、デュレーションとサンプルに基づいて uriPlayer からの pcm データを保持するのに十分な大きさのバッファを作成します。レート (および出力チャネル。ステレオの場合は 2、モノの場合は 1)。
このバッファーを uriPlayers のシンク バッファー キューにエンキューし、uriPlayers の状態を Play に設定して、バッファー キュー内のバッファーにすべてのデータの読み込みを開始します。
次に、この同じバッファーを 2 番目のプレーヤー (musicPlayer) のソース バッファーのキューに入れ、その状態を [再生] に設定します。これにより、バッファー キュー内のバッファーの再生が開始されます。
uriPlayer が、音楽プレーヤーがバッファから再生するよりも速く音楽ファイルのコンテンツをダウンロードできる限り、uriPlayer から getPosition を呼び出して、曲の現在ストリーミング中の場所と、その位置が musicPlayer より「進んでいる」かどうかを調べるだけです。現在再生中です。すべてが完璧に動作します。ダウンロードが遅くなったり遅すぎたりする場合は、uriPlayer よりも進んでいる場合は musicPlayer を一時停止します。