2

バッキング トラックの再生中にオーディオ ストリームを録音する必要があるアプリを作成しています。これは機能していますが、再生と記録開始の間に一貫性のないギャップがあります。

同期を毎回完璧にするために何かできるかどうかわからないので、遅延を計算してサーバー側で調整できるように、各ストリームの開始時刻を追跡しようとしています. 接続が開始されたときにイベントが送信されないように見えるため、これも課題であることが証明されています(私の知る限り)。ストリームのバッファ サイズなど、さまざまなプロパティを使用してみました。

録音されたオーディオはモノラルのみなので、2 番目のステレオ トラックにある種の「制御信号」を配置して、サウンドがいつ録音を開始するかを正確に判断できるのではないかと考えています (またはバッキング全体を貼り付けます)。そのチャンネルで追跡して、そのように同期できるようにします)。これにより、このサウンドを NetStream に適切に注入するという新しい問題が残ります。

これらのアイデアのいずれかが機能するかどうか、それらを実行する方法、またはいくつかの代替案を誰かが知っている場合、それは非常に役立ちます! しばらくの間、この問題に取り組んできました

4

4 に答える 4

0

私の経験では、NetStream は Flash (NetStream:play2 ?!!) の最も不正確で汚い機能の 1 つですが、Flash の主な用途がおそらくビデオの再生であることを考えると、かなり皮肉なことです。信頼できる方法で他のものと同期しようとするのは非常に困難です... イベントとステータスはあまり単純ではなく、同期を台無しにする可能性のある問題が複数あります.

幸いなことに、netStream.time は現在の再生ヘッドの位置を非常に正確に教えてくれるので、最終的にはそれを使用して開始時間、遅延、フレーム落ちなどを判断できます。ただし、実際の開始時間を判断するのは少し難しいことに注意してください。netStream の読み込みを開始すると、時間の値はゼロですが、最初のフレームが表示され、バッファがいっぱいになるのを待っている (まだ再生されていない) ときの時間の値は 0.027 のようなものです (ビデオによって異なります)。この値を注意深く監視して、イベントを正確に判断します。

NetStream を使用する代わりに、ビデオを SWF ファイルに埋め込むこともできます。これにより、同期がはるかに簡単になります (特に、エンコーディングで頻繁にキーフレームを使用する場合)。ただし、品質とファイルサイズの比率が失われます (私の記憶が正しければ、h264 ではなく FLV しか使用できません)。

于 2010-11-10T09:58:22.110 に答える
0

頭に浮かぶ唯一のことは、メタデータを試して使用することです。フラッシュ メディア ストリームはメタデータと onMetaData コールバックをサポートします。入ってくるオーディオと出て行くオーディオを録音するためにフラッシュメディアサーバーを使用していると思います。オーディオをサーバーにストリーミングしているときにsendメソッドを使用する場合、リスニング オーディオ トラックの再生ヘッドのタイムスタンプをその中に入れることができるため、2 つのストリームをサーバーに戻すときに、それらを適切に多重化できます。クライアントにストリーミングされるオーディオをメタデータでエンコードし、onMetaData を使用してそれらを同期することもできます。これを行う方法はわかりませんが、2 つ目の方法は、後で多重化する必要がないように、オーディオが戻ってきたときに 2 つのストリームを結合するか、2 つの空のビデオ ストリームにアタッチすることです。オーディオトラック...

于 2010-11-09T18:28:35.503 に答える
0

接続の開始時にイベントが送信されないようです

確かに.. NetStatusEvent.NET_STATUS は、NetConnections と Netstreams のさまざまな理由で発生します。リスナーを追加して、NET_STATUS.info の内容を処理するだけです。

as3 リファレンス ドキュメントはこちらで、NET_STATUS.info を探しています

于 2010-11-13T07:40:22.130 に答える
0

NetStreamに何かを注入する場合... SOUND と同じくらい複雑です... ここでは、代わりにSocketを使用する方がよいと思います。バイトを直接読み取ることになります。NetStreamに圧縮がある可能性があるため、送信されるデータは生のサウンド データではありません。コーデックを解凍するためのクラスが必要になります。最終的に生のサウンド データを取得したら、 Socket.readUnsignedByte() または Socket.readFloat() を使用してそこに入力を追加し、Socket.writeByte()またはSocket.writeFloat()使用して変更されたデータを書き戻します。

これは、オーディオにバックを挿入する代替手段です。


同期については、実際には非常に簡単です。データはすぐには送信されないかもしれませんが、変わらないことが 1 つあります。それは時間です。したがって、ユーザーのオーディオが終了したら、何もせずにバック トラックにミックスするだけです。時間は同じままです。

ユーザーのインターネット ダウンロードが遅いため、バックトラックに不要な中断がある場合は、次のサウンド バッファを追加するのに十分なデータがバッファリングされているかどうかを SWF で確認します (私の記憶が正しければ、通常は 4096 バイト)。はいの場合、ユーザーのオーディオのストリーミングを続行します。

そうでない場合は、ストリーミングを行わず、データが戻ってきたらすぐに開始してください。

于 2010-11-09T19:23:25.583 に答える