2013-02-28 13 views
5

Ich versuche, eine App zu machen, die ein Video von der Kamera eines Android-Telefons über das Internet mit dem TCP-oder UDP-Protokoll streamen wird. Ich bin im Moment in der Lage, ein Byte-Array von dem Android-Telefon auf meinen Computer zu übertragen, der einen Server ausführt, den ich in C# geschrieben habe. Ich habe bereits Video-Streaming gemacht, indem ich .jpegs über das Netzwerk gesendet habe und sie mit 30 fps gezeigt habe, aber das verbraucht zu viel Bandbreite.Streame Live-Video von der Kamera auf Android

Zuerst, was wäre die beste Möglichkeit, die Bilder von der Kamera zu erfassen? Ich betrachte ...

onPictureTaken(byte[] data, Camera camera) 

oder

onPreviewFrame (byte[] data, Camera camera) 

Ich bin nur daran interessiert, die byte [] Daten, dass und Codierung unter/Komprimieren es dann über das Netzwerk gesendet werden.

Zweitens, wie soll ich diese Frames in ein komprimiertes Video, das ein Byte-Array ist, das über das Netzwerk gestreamt werden kann, drehen? Die Videoqualität interessiert mich nicht sonderlich, mir geht es eher um die Reduzierung der Bandbreite.

Hier ist, was ich versuche zu tun, aber ich brauche kein hochwertiges Video. https://code.google.com/p/spydroid-ipcamera/

Antwort

4

wenn Sie planen, durch das Senden RTSP-Stream in einem anderen Verfahren selbst Daten zu codieren versuchen unter Verwendung eines beliebigen Encoder dann Benutzer

onPreviewFrame (byte[] data, Camera camera) 

Oder Sie können. SpyDroid ist ein sehr schönes Projekt, um sich über diese Methode zu informieren.

0

Wenn Sie Bedenken hinsichtlich der Bandbreite haben, sollten Sie vielleicht versuchen, ein JPEG-Bild-Byte-Array zu senden? Da data Byte-Array im YUV-Format ist, ist es größer als JPEG. Wenn Sie eine JPEG-Komprimierung ausführen, können Sie die Qualität festlegen, die sich auf die Größe der Byte-Arrays auswirken würde.

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

} 

wo size zuvor als

definiert wurde
Camera.Size size = parameters.getPreviewSize(); 
Verwandte Themen