2013-02-28 20 views
5

Próbuję utworzyć aplikację, która przesyła strumieniowo wideo z aparatu telefonu z systemem Android przez Internet za pomocą protokołu TCP lub UDP. Obecnie jestem w stanie przenieść tablicę bajtów z telefonu z Androidem na mój komputer, na którym działa serwer, który napisałem w C#. Zrobiłem streaming wideo przed wysłaniem .jpeg za pośrednictwem sieci i pokazując je na 30 fps, ale to wykorzystuje zbyt dużą przepustowość.Strumień wideo na żywo z kamery na Androidzie

Po pierwsze, jaki byłby najlepszy sposób przechwytywania obrazów z aparatu? Patrzę na ...

onPictureTaken(byte[] data, Camera camera) 

lub

onPreviewFrame (byte[] data, Camera camera) 

Jestem zainteresowany Bajt [] Dane, biorąc że i kodowania/kompresji go następnie wysłanie go przez sieć.

Po drugie, w jaki sposób należy zamienić te ramki w skompresowane wideo, które jest tablicą bajtów, które mogą być przesyłane strumieniowo przez sieć? Nie przejmuję się zbytnio jakością wideo, bardziej zależy mi na zmniejszeniu przepustowości.

Oto, co próbuję zrobić, ale nie potrzebuję wideo wysokiej jakości. https://code.google.com/p/spydroid-ipcamera/

Odpowiedz

4

jeśli planujesz kodować dane przez siebie za pomocą dowolnego kodera następnie użytkownikowi

onPreviewFrame (byte[] data, Camera camera) 

Albo można spróbować w inny sposób poprzez wysyłanie strumienia rtsp. SpyDroid to bardzo fajny projekt do obejrzenia, aby poznać tę metodę.

0

Jeśli martwisz się o przepustowość, może powinieneś spróbować wysłać tablicę bajtów obrazów JPEG? Ponieważ tablica bajtów data jest w formacie YUV, jest większa niż JPEG. Podczas kompresji JPEG możesz określić jej jakość, co wpłynie na rozmiar tablicy bajtowej.

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

} 

gdzie size uprzednio zdefiniowany jako

Camera.Size size = parameters.getPreviewSize(); 
Powiązane problemy