今天有一個業務需求是希望可以將公司放在影音平台上的影片下載回來,由於他並不是直接可以點右鍵下載的形式,所以記錄將過程記錄在此篇
花了一些時間解析了一下這個影音平台從影片上右鍵內容是可以解析到影片位址的,下載回來的是一個 index.m3u8
$ wget http://eshare.vod.otvcloud.com/123456/index.m3u8
將 index.m3u8 打開可以看到裡面還包了兩個不同的 m3u8 位址
$ vim index.m3u8 #EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=500000 500/stream.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=300000 300/stream.m3u8
第一眼的認知是這是分為兩種解析度,然後再次將這兩個 m3u8 載回來看一下
$ wget http://eshare.vod.otvcloud.com/123456/500/stream.m3u8 $ vim stream.m3u8 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:2 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:2.000000, 65189_5000.ts #EXTINF:2.000000, 65189_5001.ts #EXTINF:2.000000, 65189_5002.ts #EXTINF:2.000000, 65189_5003.ts #EXTINF:2.000000, 65189_5004.ts #EXTINF:2.000000, 65189_5005.ts #EXTINF:2.000000, 65189_5006.ts #EXTINF:2.000000, 65189_5007.ts
發現裡面包了很多個 ts 檔案,原來這個影音平台是將影音分割為很多個 ts 小檔案處理,這個方式目前已經許多影音平台都採用這種方式來增加使用者瀏覽的速度。
那我們就必須將他一一載回來並且合併起來
直接寫一個簡單的 script
#!/bin/bash # Program: ts video more download and merge # Author: shazi URL="http://eshare.vod.otvcloud.com/123456/500" wget ${URL}/65189_500{0..165}.ts & wait echo 65189_500{0..165}.ts | tr " " "\n" > tslist while read line; do cat $line >> combined.ts; done < tslist
由於所有的檔案共有 165 個,所以批次把它載回來並且使用 cat 合併成 combined.ts
以上也分享於 github