问题:从网站抓取视频流到文件中

对于我的图像分类项目,我需要收集分类图像,对我来说,一个很好的来源是世界各地不同的网络摄像头在互联网上流式传输视频。像这个:

https://www.skylinewebcams.com/en/webcam/espana/comunidad-valenciana/alicante/benidorm-playa-poniente.html

我一般对视频流和网络抓取没有任何经验,所以在互联网上搜索信息后,我在 python 中想出了这个幼稚的代码:

url='https://www.skylinewebcams.com/a816de08-9805-4cc2-94e6-2daa3495eb99'
r1 = requests.get(url, stream=True)
filename = "stream.avi"

if(r1.status_code == 200):
    with open(filename,'w') as f:
        for chunk in r1.iter_content(chunk_size=1024):
            f.write(chunk)

else:
    print("Received unexpected status code {}".format(r.status_code))

其中 url 地址取自网站视频块的来源:

<video data-html5-video="" 
poster="//static.skylinewebcams.com/_2933625150.jpg" preload="metadata" 
src="blob:https://www.skylinewebcams.com/a816de08-9805-4cc2-94e6- 
2daa3495eb99"></video>

但它不起作用(avi 文件为空),即使在浏览器中视频流运行良好。谁能解释我如何将此视频流捕获到文件中?

解答

从那以后我取得了一些进展。这是代码:

print ("Recording video...")
url='https://hddn01.skylinewebcams.com/02930601ENXS-1523680721427.ts'
r1 = requests.get(url, stream=True)
filename = "stream.avi"

num=0
if(r1.status_code == 200):
    with open(filename,'wb') as f:
        for chunk in r1.iter_content(chunk_size=1024):
            num += 1
            f.write(chunk)
            if num>5000:
                print('end')
                break

else:
    print("Received unexpected status code {}".format(r.status_code))

现在我可以得到一些写在文件中的视频。我所做的更改是 1) 在 open(filename,'wb') 中将 'w' 更改为 'wb' 以写入二进制数据,但最重要的是 2) 更改了 url。我在 Chrome devtools 'network' 中查看了浏览器发送了哪些请求以获取实时流,并且刚刚复制了最新的请求,它请求了一些 .ts 文件。

接下来,我发现了如何获取 .ts 视频文件的地址。可以像这样使用 m3u8 模块(可通过 pip 安装):

import m3u8
m3u8_obj = m3u8.load('https://hddn01.skylinewebcams.com/live.m3u8? 
                        a=k2makj8nd279g717kt4d145pd3')
playlist=[el['uri'] for el in m3u8_obj.data['segments']]

视频文件的播放列表将是这样的

['https://hddn04.skylinewebcams.com/02930601ENXS-1523720836405.ts',
 'https://hddn04.skylinewebcams.com/02930601ENXS-1523720844347.ts',
 'https://hddn04.skylinewebcams.com/02930601ENXS-1523720852324.ts',
 'https://hddn04.skylinewebcams.com/02930601ENXS-1523720860239.ts',
 'https://hddn04.skylinewebcams.com/02930601ENXS-1523720868277.ts',
 'https://hddn04.skylinewebcams.com/02930601ENXS-1523720876252.ts']

我可以从列表中下载每个视频文件。

剩下的唯一问题是,为了加载播放列表,我首先需要在浏览器中打开网页。否则播放列表将是空的。可能打开网页会启动流式传输,这会在服务器上创建可以请求的 m3u8 文件。我仍然不知道如何从 python 初始化流,而不在浏览器中打开页面。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐