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