在安卓上从摄像头实时传输视频流

5
我尝试制作一个应用程序,使用TCP或UDP协议从Android手机的相机上流式传输视频并通过互联网进行传输。我目前能够将字节数组从Android手机传输到一台运行我用C#编写的服务器的计算机上。我以前曾经使用发送.jpeg文件通过网络进行实时图像流传输的方式,并在30fps下显示这些图像,但这会占用太多带宽。
首先,从相机捕获图像的最佳方法是什么? 我正在考虑...
onPictureTaken(byte[] data, Camera camera)

或者

onPreviewFrame (byte[] data, Camera camera)

我只对byte[]数据感兴趣,将其编码/压缩后发送到网络。
其次,我应该如何将这些帧转换为压缩的视频,它是一个可以在网络上流式传输的字节数组?我不太关心视频质量,更关心减少带宽占用。
以下是我的目标,但我不需要高质量视频。 https://code.google.com/p/spydroid-ipcamera/
2个回答

4

如果您计划使用任何编码器自行编码数据,则用户应该

onPreviewFrame (byte[] data, Camera camera)

或者你可以尝试通过发送RTSP流的方法进行。 SpyDroid 是一个非常不错的项目,可以学习这种方法。


0

如果你担心带宽问题,或许你可以尝试发送JPEG图像字节数组?由于data字节数组是以YUV格式存储的,因此比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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接