0

やあ、

私たちは Java プロジェクトに取り組んでいる学生で、次のことを行う必要があります。

  1. Web カメラからビデオ ストリームをキャプチャする
  2. このストリームをビデオ ファイルとマージします (各ピクセルの色の平均を取るため、2 つのストリームが重ねられます)。
  3. RTP または RTSP を使用して、ネットワーク上でこのマージの結果を送信します (理論的には、2 台の Android タブレットで受信されます)。

非常に重要なことの 1 つは、これらすべての操作をリアルタイム(またはほぼリアルタイム) で行う必要があるということです。RTP ストリームは、Web カメラがビデオをキャプチャしているのと同時に受信する必要があります。

これを行うために、Java Media Framework (JMF) API を使用します。1 番目と 2 番目のポイントが正常に実装されました。毎秒、ウェブカメラからの 30 個のBufferedImageが、ビデオ ファイルからの30 個のBufferedImageとマージされます。結果は従来の JFrame (Swing と JMF のみを使用して表示) に表示され、非常にうまく機能します。

3 番目のポイントをまだ実行する必要があります。RTP 経由でビデオ ストリームを送信するのはそれほど難しくありません。 ポイント 1 と 2 により、ビデオ ストリームはありませんが、一連の BufferedImages があります。これらの BufferedImage からビデオ ファイルを取得する方法はわかっています。ただし、これはハード ドライブに記録されたビデオ ファイルにすぎず、リアルタイムでネットワーク上に送信することはできません。では、これらの BufferedImage から RTP 経由で直接送信できるオンザフライストリームを作成するにはどうすればよいでしょうか?

よろしくお願いします。

4

1 に答える 1

1

回答を改善したいと思います。

最初に、本当に RTP/RTSP を使用する必要があるかどうかという問題があります。必要がない場合は、DatagramSocket を介して画像データを送信し、受信者がそれらをデコードする方法を知っていると仮定することができます。次のようなものを使用します

DatagramSocket socket = new DatagramSocket(port);
DatagramPacket packet = new DatagramPacket(new byte[1], 1);    

packet.setAddress(receiver.getAddress());
packet.setPort(port);

while(running)
{
   byte[] data = getMergedImageData();

   packet.setData(data);
   packet.setLength(data.length);

   socket.send(packet);
}

RTP を使用する必要がある場合は、mjsipプロジェクトを参照してください。基本的に、有効な RTP ヘッダー (たとえば、データバッファーの最初の 12 バイト) を作成する必要があります。各ビットがどこに属しているかがわかっていれば、これはかなり単純です。

画像のエンコード方法によっては、追加の要件に注意する必要がある場合があります。たとえば、RTP を介して Jpeg を送信する場合、完全な Jpeg ヘッダーを削除し、短縮された RTP/Jpeg ヘッダーを作成して、RTP ヘッダーとペイロードの間に配置する必要があります。受信者は、省略されたヘッダーから Jpeg ヘッダーを再作成する必要があります。Jpeg の場合は、画像に EOI マーカーがまだない場合は必ず追加してください。この点で、あえてJNIに飛び込むなら、ffmpegはあなたのために多くの仕事をすることができると思います.

RTP ペイロードを調整する方法の詳細については、これを参照してください。

乾杯〜

于 2013-03-02T15:32:04.480 に答える