对于一个涉及光学相机通信(OCC)的研究项目,我需要积极分析视频帧,目前我正在我的pc上使用python和opencv (我用智能手机记录视频,然后处理)。我想用我的三星星系a40上的摄像头实时处理这段视频。我是android开发的新手,所以我只想创建一个基本的应用程序,用于捕捉视频并将其传输到我的pc上进行分析。我的应用程序需要在30 fps时捕获1080 p,或者更好。
我目前正在使用Android,该API提供了imageAnalysis用例,它允许我访问原始图像平面:我获得YUV_420_888格式的ImageProxy。
我仍在熟悉API,但能够根据在线示例复制一些基本应用程序。我还有一个具体问题:
--在pc上序列化和传输图像给我的python应用程序的最好方法是什么?--我计划使用套接字创建一个简单的TCP连接,将图像转换成位图,然后像这样直接发送。但是,我不确定这种方法是否非常有效,我也不知道如何转换图像并缓冲它。代码示例当然是受欢迎的。有线连接(USB电缆到我的pc)也是可能的,但我没有找到任何支持。
任何想法都欢迎!提前谢谢。
发布于 2021-06-21 08:54:21
如果你真的关心性能,你应该使用UDP而不是TCP。请记住,UDP并不保证您发送的数据包在接收端以相同的顺序到达,或者如果您可以在单个UDP消息中发送的最大数据包大小为65535字节。因此,您应该实现某种逻辑,以便在接收方重新排序数据包,并告诉发送方您遗漏了什么。
一般情况下,实时流媒体应用,如Stadia,PS远程播放等,采用了某种FEC (前向纠错)机制,使接收者可以自行恢复丢失的数据包。在我的流媒体应用程序中,我使用了泽拉西。当然,使用FEC是可选的。
YUV_420_888格式在压缩方面也不是很理想,对于流,我建议使用h.264或VP8之类的格式。你会在互联网上找到一些例子,例如(这个项目有点老了,但可能有助于了解这个想法)。
https://github.com/bytestar/android-h264-stream-demo
月光是一个非常好的开源流媒体应用程序。它也适用于Android,它绝对值得一看,看看它是如何工作的。
有些东西对您的项目来说可能有些过分,但至少我建议使用UDP,将一个大的YUV_420_888框架分成几个小的。在所有这些小数据包中,包括以下信息供接收者使用
分割大型YUV_420_888帧的原因是为了避免MTU问题(大于当前默认MTU值的消息将被丢弃,通常约为1500个字节)。
https://stackoverflow.com/questions/67988539
复制相似问题