将网站的视频流捕获到文件中

And*_*rin 7 python video-streaming web-scraping

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

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))
Run Code Online (Sandbox Code Playgroud)

其中 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>
Run Code Online (Sandbox Code Playgroud)

但它不起作用(avi 文件为空),即使在浏览器中视频流工作良好。有人能解释一下如何将此视频流捕获到文件中吗?

And*_*rin 6

从那时起我取得了一些进步。这是代码:

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))
Run Code Online (Sandbox Code Playgroud)

现在我可以在文件中写入一些视频。我所做的更改是 1) 在 open(filename,'wb') 中将 'w' 更改为 'wb' 以写入二进制数据,但最重要的是 2) 更改了 url。我在 Chrome 开发工具“网络”中查看了浏览器发送哪些请求来获取实时流,然后复制了最新的请求,它请求一些 .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']]
Run Code Online (Sandbox Code Playgroud)

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

['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']
Run Code Online (Sandbox Code Playgroud)

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

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