获取 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

转载请注明出处