ネットワーク経由でビデオ ストリームをブロードキャストできるようにする Android アプリケーションの最初の部分を開発しています。現在、次のように非常に直接的な方法でビデオを送信しています。
Socket socket = new Socket(InetAddress.getByName(hostname), port);
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
recorder.setOutputFile(pfd.getFileDescriptor());
しかし残念ながら、それはあまり流動的ではありません。ソケット経由でデータ ストリームを送信する前に、データ ストリームをバッファリングしたいと考えています。私が試した方法の 1 つは、メディアを記録するために Android API を使用してストリームをファイルに書き込み、別のスレッドを使用してコンピューター上のサーバーにファイルをストリーミングすることです。
だから私の問題は次のとおりです。まだ書き込み中のファイルをソケットで送信するにはどうすればよいですか? BufferedInputStreamには読み取り用のブロッキング メソッドがないため、このようなことを試みましたが、成功しませんでした
while (inputStream.available() >= BUFFER_SIZE) {
inputStream.read(buffer);
outputStream.write(buffer);
}
outputStream.flush();
しかし、私がそうしているとき、ネットワークがデータストリームよりも速い場合、私はすぐにループから抜け出します.
それを行うための「良い」方法はありますか?私はアクティブな待機を行うことについて考えましたが、特にモバイルの場合、それは良い解決策ではありません. 別の方法は、次のようなことです。
while (true) {
while (inputStream.available() < BUFFER_SIZE) {
wait(TIME);
}
inputStream.read(buffer);
outputStream.write(buffer);
}
outputStream.flush();
しかし、それは私にとってはかなり汚いように聞こえます...もっと洗練された解決策はありますか?