2013-02-28 44 views
5

Tôi đang cố gắng tạo một ứng dụng sẽ phát video từ máy ảnh của điện thoại Android qua internet bằng giao thức TCP hoặc UDP. Tôi hiện đang có thể chuyển một mảng byte từ điện thoại Android vào máy tính của tôi đang chạy một máy chủ mà tôi đã viết bằng C#. Tôi đã thực hiện streaming video trước khi gửi .jpeg của trên mạng và hiển thị chúng ở 30 khung hình/giây nhưng điều này sử dụng quá nhiều băng thông.Phát video trực tiếp từ máy ảnh trên android

Đầu tiên, cách tốt nhất để chụp ảnh từ máy ảnh là gì? Tôi nhìn vào ...

onPictureTaken(byte[] data, Camera camera) 

hoặc

onPreviewFrame (byte[] data, Camera camera) 

Tôi chỉ quan tâm đến [] data byte, lấy đó và mã hóa/nén nó sau đó gửi nó qua mạng.

Thứ hai, làm cách nào để chuyển các khung này thành video nén là mảng byte có thể được phát qua mạng? Tôi không quan tâm quá nhiều về chất lượng video, tôi quan tâm nhiều hơn đến việc giảm băng thông.

Đây là những gì tôi đang cố gắng làm, nhưng tôi không cần video chất lượng cao. https://code.google.com/p/spydroid-ipcamera/

Trả lời

4

nếu bạn đang có kế hoạch để mã hóa dữ liệu bằng cách cho mình bằng cách sử dụng bất kỳ bộ mã hóa sau đó sử dụng

onPreviewFrame (byte[] data, Camera camera) 

Hoặc bạn có thể thử một phương pháp khác nhau bằng cách gửi dòng rtsp. SpyDroid là một dự án rất hay để xem xét để tìm hiểu về phương pháp này.

0

Nếu bạn lo ngại về băng thông, có lẽ bạn nên cố gửi một mảng byte hình ảnh JPEG? Vì mảng byte data ở định dạng YUV, nó lớn hơn định dạng JPEG. Khi chạy một nén JPEG, bạn có thể xác định chất lượng của nó, điều này sẽ ảnh hưởng đến việc gửi kích thước mảng byte.

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

} 

nơi trước đây size được định nghĩa là

Camera.Size size = parameters.getPreviewSize(); 
Các vấn đề liên quan