gpt4 book ai didi

Android Camerax 视频序列化和传输

转载 作者:行者123 更新时间:2023-12-04 07:30:11 25 4
gpt4 key购买 nike

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

我目前正在使用提供 imageAnalysis 用例的 Android Camerax API,它使我能够访问原始图像平面:我得到一个 ImageProxy YUV_420_888 格式。

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

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

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

最佳答案

如果您真的关心性能,您应该使用 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 block ,您的索引将介于 0 和 9 之间)
  3. 有关接收方可以预期分割 YUV_420_888 帧的序列号数量的信息

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

关于Android Camerax 视频序列化和传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67988539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com