【问题标题】:How can image format be determined from a byte stream?如何从字节流中确定图像格式?
【发布时间】:2014-06-26 16:23:14
【问题描述】:

我正在尝试编写一个 python 脚本,该脚本加入网络摄像头多播并将接收到的每个帧作为图像存储在本地硬盘上。通常,可以单击指向流的链接,然后在浏览器或 VLC 媒体播放器中播放流。

流作为 UDP 多播提供,我可以使用以下代码(Python33、Windows 7)订阅它:

import socket
import struct

MCAST_GRP = '(the ip)'
MCAST_PORT = (the port)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', MCAST_PORT))
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)

sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)


while True:
    data = sock.recv(1316)

    print(data)

这就是我卡住的地方。数据似乎是一个字节流,我希望在其中对图像进行编码,但在不确定图片的格式的情况下,我无法继续解码此流并将其转换为实际图像。打印数据显示的是这种类型的输出:

b'G\x01\x00\x1c\xc4 ...' b'G\x01\x00\x18\x87 ...' b'GA\x015p\x00\xff\xff ...'

如何将这些字节流转换为实际图像?是否有与我需要查找和隔离的 jpg / png 格式相关的标记?

提前感谢您的帮助!

【问题讨论】:

  • 你可以看看这个库:pythonware.com/products/pil
  • 尝试使用 ImageFile.Parser().feed(data),但出现错误:IOError('cannot parse this image')。也许我必须先解码,或者隔离实际图像在流中的位置?
  • 另外,我使用 VLC 发现它使用 H264 - MPEG-4 AVC 编解码器来解码此流。

标签: python opencv udp python-imaging-library


【解决方案1】:

如果流中也是文件(图片)的头部,则包含格式信息,例如见wiki for BMP file format

【讨论】:

    【解决方案2】:

    我不是 Python 方面的专家,但有点像视频流方面的专家,我怀疑你可能从一开始就以错误的方式思考它。当你加入组播并接收流时,它与静态图片关系不大。视频通常会根据 H.264 标准进行编码,并且帧以所谓的图片组 (GOP) 的形式构成。 GOP由I、P和B帧组成,例如IPBBPBBPBBPBBPI,其中静态图片仅为I帧。通常,人们会将 I 帧存储为缩小的图像,以便在 FF 或 RW 操作期间显示它们。要从视频流中提取 I 帧,您通常会使用独立库,而我所知道的最有用的库 - https://www.ffmpeg.org/

    它将允许您将流解码到所有 24,25,或者每秒的帧数,以防您真的想在视频中存储每张图片...

    【讨论】:

    • 感谢您的精彩回复,并正确识别出我缺乏理解。我现在使用 OpenCV(从 python 调用)来解码流。据我了解——我可能是错的——opencv 使用 ffmpeg 来解码流。你知道 ffmpeg 是否擅长解码 MPEG-4 Part 10 AVC 格式吗? VLC 打开并显示流没有任何问题,但我的 opencv 解决方案显示碎片图像(几乎就像某些信息没有到达并且重复相同的像素以完成图像)。
    • 好吧,H.264 和 AVC 基本上是同义词:en.wikipedia.org/wiki/H.264/MPEG-4_AVC - 所以 ffmpeg 可以处理。无论您使用 ffmpeg 还是其他任何东西,您都需要对视频进行解码(或解压缩)才能仅获取 I 帧(实际图片)。也许在这里看看它是如何工作的pr0gr4mm3r.com/linux/…
    猜你喜欢
    • 2011-09-09
    • 2020-11-23
    • 1970-01-01
    • 2011-01-04
    • 2020-11-27
    • 2011-11-22
    • 2012-11-17
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多