2013-02-28 12 views
5

私は、TCPまたはUDPプロトコルを使用してインターネット経由でアンドロイド電話のカメラからビデオをストリーミングするアプリケーションを作成しようとしています。私は現在、アンドロイドの携帯電話からC#で書かれたサーバーを実行しているコンピュータにバイト配列を転送することができます。私は、ネットワーク上で.jpegを送信し、30fpsでそれらを表示することで、ストリーミングビデオをやったことがありますが、これはあまりにも多くの帯域幅を使います。カメラからアンドロイドでライブビデオをストリーミングする

まず、カメラから画像をキャプチャする最良の方法は何ですか? 私はそれを取って、エンコード/ネットワーク経由で送信し、それを圧縮し、私はバイト[]のデータでちょうど興味

onPictureTaken(byte[] data, Camera camera) 

または

onPreviewFrame (byte[] data, Camera camera) 

...で探しています。

第2に、これらのフレームをネットワーク経由でストリーミングできるバイト配列の圧縮ビデオにするにはどうすればよいですか?私はビデオの品質についてあまり気にしません、私は帯域幅を減らすことについてもっと気にします。

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

答えて

4

あなたは、ユーザー

onPreviewFrame (byte[] data, Camera camera) 

それとも、RTSPストリームを送信することにより、さまざまな方法で試すことができますが任意のエンコーダを使用することにより、自分でデータをエンコードするために計画している場合。 SpyDroidは、この方法について学ぶための非常に素晴らしいプロジェクトです。

0

帯域幅が懸念される場合は、JPEG画像バイト配列を送信する必要がありますか? dataバイト配列はYUV形式なので、JPEG 1より大きい。 JPEG圧縮を実行するときには、品質を定義することができます。これは、バイト配列サイズの送信に影響します。 sizeが以前

Camera.Size size = parameters.getPreviewSize(); 
として定義した

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(); 

}