获取 Bilibili 直播真实地址并使用 OPENCV 打开
使用的工具
- selenium (一个Web自动化工具)
- opencv-python
- chromedriver
难点: 获取地址
- Bilibili 的直播页面没有直接给出视频流地址
- 地址是通过 js 得到的
- 这里可以通过使用 selenium + webdriver 来运行 js
- 这里选择了 chromedriver 其它还有:
- phantomjs
- firefox
步骤
- 设置 chromedriver 输出带有 Network Traffic 的 log
- 直接使用 selenium + chromedriver 访问网页
- 打开 log
- 寻找视频流地址
代码实现:
导入库
import time
import re
import cv2
import numpy as np
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
获取真实地址
d_cap = DesiredCapabilities.CHROME
d_cap['loggingPrefs'] = { 'performance':'ALL' }
def GetLiveURL(url, timeout = 30):
print("Starting Chrome...")
driver = webdriver.Chrome(desired_capabilities=d_cap)
print("Opening URL : %s"%url)
driver.get(url)
t_url_msg = None
trys = 0
while True:
print('Waiting...')
for i in driver.get_log('performance'):
if '.flv' in i['message']:
# print(i['message'])
t_url_msg = i['message']
break
if t_url_msg:
break
trys += 1
if trys == int(timeout/2):
print('Error: Timeout!')
break
time.sleep(2)
driver.close()
t_url = re.findall('https://(.*?)"', t_url_msg)
# print(t_url)
for i in t_url:
if '.flv' in i:
t_url = i
return 'https://' + t_url
使用 OpenCV 打开视频流
url = 'http://live.bilibili.com/266'
t_url = GetLiveURL(url)
print('Find TRUE URL : %s'%t_url)
print('Opening Stream...')
cap = cv2.VideoCapture(t_url)
print('Start!')
# fil = np.eye(15)/15
while (cap.isOpened()):
ret, frame = cap.read()
# frame 为 Numpy 数组 可以进行一些变换
# gray = cv2.filter2D(frame,-1,fil) #cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# frame = np.concatenate((gray,frame), axis=1)
cv2.imshow('Conv_Test', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
@Aeonni 写于2018.03.17
转载请注明出处