Android Camerax视频序列化和传输



对于一个涉及光学相机通信(OCC(的研究项目,我需要主动分析视频帧,我目前正在我的电脑上使用python和opencv离线进行分析(我用智能手机录制视频,然后进行处理(。我想通过使用我的三星galaxy a40上的相机来实时处理视频。我对android开发还很陌生,所以我只想创建一个基本的应用程序来捕捉视频并将其传输到我的电脑进行分析。我的应用程序需要以每秒30帧或更高的速度拍摄1080p。

我目前使用的是Android Camerax API,它提供了imageAnalysis用例,使我可以访问原始图像平面:我获得了YUV_420_888格式的ImageProxy。

我仍在熟悉API,但已经能够基于在线示例复制一些基本的应用程序。我还有一个具体的问题:

在pc上将图像序列化并传输到我的python应用程序的最佳方式是什么我计划使用套接字创建一个简单的TCP连接,将图像转换为位图,然后像这样直接发送。然而,我不确定这种方法是否非常有效,我也不知道如何转换图像并缓冲它。代码示例当然是受欢迎的。有线连接(USB电缆到我的电脑(也是可能的,但我没有找到任何支持。

欢迎有任何想法!提前谢谢。

如果你真的关心性能,你应该使用UDP而不是TCP。请记住,UDP不能保证您发送的数据包以相同的顺序到达接收方,或者如果有的话,并且您在单个UDP消息中可以发送的最大数据包大小为65535字节。因此,您需要在接收方实现某种逻辑来重新排序数据包,并告诉发送方您遗漏了什么。

通常,Stadia、PS Remote Play等实时流媒体应用程序使用某种FEC(前向纠错(机制,以便接收器可以自行恢复丢失的数据包。对于我的流媒体应用程序,我使用了jereasure。但是使用FEC当然是可选的。

YUV_420_888格式在压缩方面也不是很理想,对于流媒体,我建议使用类似h.264或VP8的格式。你会在互联网上找到一些例子,例如(这个项目有点旧,但它可能有助于获得这个想法(

https://github.com/bytestar/android-h264-stream-demo

一个非常好的开源流媒体应用程序是月光。它也适用于Android,这绝对值得一看,看看它是如何工作的。

有些东西对你的项目来说可能有些过头了,但至少我建议你使用UDP,把一个大的YUV_420_888帧分成几个小的。在所有这些小数据包中,包括接收器的以下信息

  1. 一个唯一的标识符(以便接收器知道数据包属于哪个YUV_420_888帧(
  2. 序号(如果将YUV_420_888帧拆分为10个部分,则索引将在0到9之间(
  3. 关于接收机对于分割YUV_420_888帧可以期望多少序列号的信息

拆分大YUV_420_888帧的原因是为了避免MTU问题(大于当前默认MTU值的消息将被丢弃,通常大约1500字节(。

最新更新