如何从字节流中确定图像格式?

时间:2014-06-26 16:23:15

标签: python opencv udp python-imaging-library

我正在尝试编写一个连接网络摄像头多播的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格式相关的标记需要查找和隔离?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果在流中也是文件(图像)的标题,则它包含有关格式的信息,例如,请参阅wiki for BMP file format

答案 1 :(得分:0)

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

它允许您将流解码到所有24,25,或者每秒的帧数,如果您真的想在视频中存储每个图片...... / p>