2

音楽が完全に同期するように、GKSessionを介してあるデバイスから別のデバイスに音楽をストリーミングしようとしています。これまでのところ、これを使用してオーディオを取得する方法は知っていますが、いくつかの点についてはよくわかりません。データを転送するには、AudioFileReadPacketsを使用する必要があると確信しています。

  1. メモリバッファからのパケットデータをストリームとしてパッケージ化して送信するにはどうすればよいですか?
  2. 一方、受信したパケットをオーディオストリームに戻すにはどうすればよいですか?
  3. パケットが同期して再生されるようにするための最良の方法は何ですか?
4

1 に答える 1

9

重要な更新: 私はあなたが求めていることをほぼ実行するリポジトリをgithubに作成しました。見てみな!

以下は私の古い答えです:

  1. a。まず、githubプロジェクトで行ったのと同じように、音楽からオーディオバッファデータを取得します。

    b。このデータを取得してパケットに分割します。各パケットには、後で配信を管理し、同期されていることを確認するために使用するヘッダー情報が含まれています。したがって、たとえば、各パケットのタイムスタンプ、その順序、音楽ファイルのハッシュなど。アイデアを得るためにこの回答を参照してから、パケットをパッケージ化する方法を詳細に示すこの優れたチュートリアルを見てください。あらゆる目的。

  2. ネットワークの反対側では、パッケージ化と非常によく似た方法でパケットを解凍します。再度、それを行う方法を詳細に説明している上記のチュートリアルを参照してください。

  3. これが最も難しい部分です。幸い、2つのデバイスしか扱っていないので、GKSessionでそれを行うことができます。それ以外の場合は、レベルを下げる必要があります(つまり、bonjourを使用します。GKSessionは..のラッパーであり、多くのオーバーヘッドが追加されます。リアルタイムアプリを購入する余裕はありませんが、慌てる必要はありません。この本には、bonjourを使用するための優れた簡単な例があります。)

もう一方の端でオーディオキューバッファを満たすのに十分なパケットを収集し、次に信頼性の低いパケット(読み取り:udpプロトコル)を送信して音楽の再生をジャンプスタートするという考え方です。udp送信を使用すると、ほぼ瞬時に配信されます(人間の耳では、2つのデバイス間の遅延を区別できないと思います)。ただし、信頼性の低いパケットが失われることがあります。それを使って、またはそれを処理する方法を考えてください。

そして最後になりましたが、あなたは間違いなくコアオーディオの学習のコピーを手に入れたいと思っています..iOSでコアオーディオをしている人は誰でもこれを必要としています。また、この回答に続くディスカッションもご覧ください。コアオーディオ/リアルタイムiOSアプリに関しては、対処すべき多くのことに注意を向けることができます。

幸運を!

于 2013-03-10T06:48:08.450 に答える