服务器(PC)上的实时视频流由机器人通过UDP发送的图像

Ric*_*nop 9 python video udp ffmpeg video-streaming

嗯.我发现这看起来很有希望:

http://sourceforge.net/projects/mjpg-streamer/


好.我将尝试清楚地详细解释我想要做的事情.

我有一个带摄像头和wifi棒的小型人形机器人(这是机器人).机器人的wifi贴平均wifi传输速率为1769KB/s.机器人有500Mhz CPU和256MB RAM,因此它不足以进行任何严肃的计算(此外,机器人上已经运行了几个模块用于运动,视觉,声纳,语音等).

我有一台PC,我可以从中控制机器人.我想让机器人在房间里走动,看一下机器人在PC上看到的实时视频.

我已经有的工作了.机器人正在我想要他走路并用相机拍摄图像.图像通过UDP协议发送到我收到它们的PC(我通过将传入的图像保存在磁盘上来验证这一点).

相机返回YUV442色彩空间中640 x 480像素的图像.我发送有损压缩(JPEG)的图像,因为我试图在PC上获得最好的FPS.我正在使用PIL库对机器人进行JPEG压缩.

我的问题:

  1. 有人可以给我一些关于如何将传入的JPEG图像转换为实时视频流的想法吗?我知道我需要一些视频编码器.您推荐哪种视频编码器?FFMPEG还是其他什么?我对视频流非常陌生,所以我想知道什么是最适合这项任务的.我更喜欢用Python来编写这个,所以我更喜欢一些拥有Python API的视频编码器或库.但我想如果库有一些好的命令行API,它不一定是在Python中.

  2. 我可以从中获得最好的FPS是什么?鉴于1769KB/s的平均wifi传输速率和图像的尺寸?我应该使用与JPEG不同的压缩吗?

  3. 我很乐意看到任何代码示例.链接到解释如何做到这一点的文章也没关系.

一些代码示例.以下是我将JPEG图像从机器人发送到PC(缩短的简化代码段)的方法.这在机器人上运行:

# lots of code here

UDPSock = socket(AF_INET,SOCK_DGRAM)

  while 1:
    image = camProxy.getImageLocal(nameId)
    size = (image[0], image[1])
    data = image[6]
    im = Image.fromstring("YCbCr", size, data)
    s = StringIO.StringIO()
    im.save(s, "JPEG")

    UDPSock.sendto(s.getvalue(), addr)

    camProxy.releaseImage(nameId)

  UDPSock.close()

  # lots of code here
Run Code Online (Sandbox Code Playgroud)

这是我在PC上接收图像的方式.这在PC上运行:

  # lots of code here

  UDPSock = socket(AF_INET,SOCK_DGRAM)
  UDPSock.bind(addr)

  while 1:
    data, addr = UDPSock.recvfrom(buf)
    # here I need to create a stream from the data
    # which contains JPEG image

  UDPSock.close()

  # lots of code here
Run Code Online (Sandbox Code Playgroud)

pyf*_*unc 1

检查你的第一个问题。尽管这里的解决方案使用非流式图片集。这可能有帮助。该示例使用 pyMedia。

有些符合你想要的。

如果您需要编辑二进制流: