pylivecap 是一個用來擷取直播中影片的 frame,並且存成圖片的 Python package。解決目前沒有「只擷取直播目前畫面」程式的狀況。
目前的作法是透過 streamlink 獲得畫面,傳到 ffmpeg 解出一個 frame 來,透過 Python 整理成單一的 API 來使用。主要架構非常簡單,就是下面這樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def capture(url, output, quality=VideoQuality.BEST): livestream = [ ‘streamlink’, ‘-O’, url, quality.value ] ffmpeg = [ ‘ffmpeg’, ‘-y’, # Force overwrite ‘-i’, ‘-‘, ‘-f’, ‘image2’, ‘-vframes’, ‘1’, output ] p1 = subprocess.Popen(livestream, stderr=subprocess.DEVNULL, stdout=subprocess.PIPE) p2 = subprocess.Popen(ffmpeg, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, stdin=p1.stdout) p1.stdout.close() p2.communicate() |
這邊很可恥的用了 workaround。理論上 streamlink 有提供 API,並且可以直接讀取 streaming 的資料,用法是這樣:
1 2 3 4 5 6 7 |
import streamlink streams = streamlink.streams(youtube_link) stream = streams[‘best’] fd = stream.open() data = fd.read(1024) fd.close() |
但是因為得到的 data 沒有辦法直接轉成 image (我還沒找出方法),因此婉轉的作法是透過 command line 操作,把 streamlink 從直播串流中擷取到的資料 pipe 到 ffmpeg 中轉換為一張圖片。核心的指令如下:
1 |
streamlink –O https://www.youtube.com/watch\?v\=VsvZqiB2y1o 720p | ffmpeg -i – -f image2 -updatefirst 1 -r 1/2 out.jpg |
變更 -r
的數字,可以改變擷取圖片的間隔時間 (e.g. 每 5 秒一張為 1/5,每 3 秒一張為 1/3)。
pylivecap 使用範例
1 2 3 4 5 6 7 8 9 10 11 |
>>> import pylivecap >>> YOUTUBE_LIVESTREAM = ‘https://www.youtube.com/watch?v=zjGR32QyTkQ’ # Capture YouTube livestream to `/tmp/out.jpg` >>> pylivecap.safe_capture(YOUTUBE_LIVESTREAM, ‘/tmp/out.jpg’) # Setting Video Quality to 360p >>> pylivecap.safe_capture(YOUTUBE_LIVESTREAM, ‘/tmp/out.jpg’, pbylivecap.VideoQuality.Q360) # Faster capture without checking >>> pylivecap.capture(YOUTUBE_LIVESTREAM, ‘/tmp/out.jpg’) |
提醒,pylivecap 不適合作為直播影片 short interval 大量擷取,因為運行時間不固定 (取決於網路),如果要短時間大量擷取的話,還是透過 youtube-dl 或是 streamlink 下載下來再處理吧。
Leave a Reply