安卓Camerax视频序列化和传输

3

为了进行光学相机通信(OCC)研究项目,我需要积极地分析视频帧。目前,我使用python和opencv在我的电脑上离线处理录制于智能手机上的视频。我希望使用三星Galaxy A40相机实时处理视频。由于我对安卓开发还不太熟悉,所以我只想创建一个基本应用程序来捕获视频并将其传输到我的电脑进行分析。我的应用程序需要30 fps或更好的1080p拍摄。

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

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

最佳方法是什么,可以将图像序列化并传输到我的python应用程序中? 我计划使用套接字创建简单的TCP连接,将图像转换为位图,并直接发送。但我不确定这种方法是否非常高效,也不知道如何转换图像和缓冲图像。欢迎提供代码示例。有线连接(使用USB电缆连接到我的电脑)也是可能的,但我没有找到支持它的API。

欢迎提出任何想法!提前感谢您。


通常在设备上处理相机视频流不需要进行流媒体传输。如果仅用于监控/演示目的,您可以使用像scrcpy这样的工具。无论如何,您都将增加转换/传输的开销,除了设备上的图像处理。 - Morrison Chang
1个回答

4
如果您真的关心性能,应该使用UDP而不是TCP。只需记住,UDP不能保证您发送的数据包在接收端以相同的顺序到达,或者是否到达,单个UDP消息中可以发送的最大数据包大小为65535字节。因此,您需要在接收端实现某种逻辑来重新排序数据包,并告诉发送方您错过了什么。 通常,实时流应用程序(如Stadia、PS Remote Play等)使用某种前向纠错(FEC)机制,以便接收方可以自行恢复丢失的数据包。对于我的流应用程序,我使用了jerasure。但当然使用FEC是可选的。 YUV_420_888格式在压缩方面也不是很理想,对于流媒体,我建议使用h.264或VP8之类的格式。您可以在互联网上找到一些示例,例如(该项目有点旧,但可能有助于理解)。

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

一个非常好的开源流媒体应用是 moonlight。它也适用于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字节)。

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