5

TCPまたはUDPプロトコルを使用して、インターネット経由でAndroid携帯のカメラからビデオをストリーミングするアプリを作成しようとしています. 現在、C# で記述したサーバーを実行しているコンピューターに Android フォンからバイト配列を転送できます。ネットワーク経由で .jpeg を送信して 30 fps で表示することにより、以前にビデオのストリーミングを行ったことがありますが、これは帯域幅を使いすぎます。

まず、カメラから画像をキャプチャする最良の方法は何でしょうか? 私は見ている...

onPictureTaken(byte[] data, Camera camera)

また

onPreviewFrame (byte[] data, Camera camera)

byte[] データに興味があるだけで、それを取得してエンコード/圧縮し、ネットワーク経由で送信します。

次に、これらのフレームを、ネットワーク経由でストリーミングできるバイト配列である圧縮ビデオに変換するにはどうすればよいですか? ビデオの品質はあまり気にしませんが、帯域幅を削減することの方が重要です。

これが私がやろうとしていることですが、高品質のビデオは必要ありません。 https://code.google.com/p/spydroid-ipcamera/

4

2 に答える 2

4

任意のエンコーダーを使用して自分でデータをエンコードする予定がある場合は、ユーザー

onPreviewFrame (byte[] data, Camera camera)

または、rtsp ストリームを送信して別の方法を試すこともできます。SpyDroidは、この方法について学ぶのに非常に優れたプロジェクトです。

于 2013-02-28T03:59:27.287 に答える
0

帯域幅が気になる場合は、JPEG 画像のバイト配列を送信してみてはいかがでしょうか。バイト配列は YUV 形式なのでdata、JPEG よりも大きくなります。JPEG 圧縮を実行する場合、バイト配列サイズの送信に影響する品質を定義できます。

 public void onPreviewFrame(byte[] data, Camera camera){

 YuvImage image = new YuvImage(data, ImageFormat.NV21,
                            size.width, size.height, null);
 baos = new ByteArrayOutputStream();
 int jpeg_quality = 100;

 image.compressToJpeg(new Rect(0, 0, size.width, size.height),
                         jpeg_quality, baos);

 byte[] sending_array = baos.toByteArray();

} 

以前は次のようにsize定義されていました

Camera.Size size = parameters.getPreviewSize();
于 2016-03-03T12:19:32.023 に答える