從影音平台上下載被分割的 *.ts 影片並合併起來

2016-09-22 Other

今天有一個業務需求是希望可以將公司放在影音平台上的影片下載回來,由於他並不是直接可以點右鍵下載的形式,所以記錄將過程記錄在此篇

 

花了一些時間解析了一下這個影音平台從影片上右鍵內容是可以解析到影片位址的,下載回來的是一個 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

 

22 Replies to “從影音平台上下載被分割的 *.ts 影片並合併起來”

  1. 訪客表示:

    你好,我在下載公視的影片時也遇到同樣的問題,然後就爬文到這裡了。首先感謝您的熱心分享,可是我仍有幾個不太懂的地方想請教一下您:
    1.請問這個script是要寫在哪裡呢?記事本嗎?
    2.cat工具要上哪找呢?

    • shazi7804表示:

      Hi

      1. 這個script是基於 bash 環境下開發的,只要有 bash 環境都可以!
      2. cat 工具是 Linux 底下的工具,在 Windows 下可以透過 cygwin 安裝。

      • 訪客表示:

        謝謝

      • 訪客表示:

        我把這個 script 的網址和檔名都改成公視的 並複製貼上到 cygwin 按 enter ,卻出現「No such file or directory」(但在瀏覽器貼網址都能正常下載),請問這該怎麼解決?

        公視版的 script 如下:
        #!/bin/bash
        #
        # Program: ts video more download and merge
        # Author: shazi
        URL=”http://plus7hd-pts.cdn.hinet.net/pts-plus7hd/_definst_/smil:mbroutput/169/2_TUE/PTS-2017-01-10-22-00/PTS-2017-01-10-22-00.smil”
        shift
        wget ${URL}/media_b4000000_{0..259}.ts &
        wait
        echo media_b4000000_{0..259}.ts | tr ” ” “\n” > tslist
        while read line; do cat $line >> combined.ts; done < tslist

        請問這段 script 是不是有哪個地方出問題了呢?還是其它原因?
        圖片如下:https://i.imgur.com/6OYfJyk.png

        • shazi7804表示:

          Hi

          請問能否提供出現 「No such file or directory」的詳細Log訊息給我,您貼上的這段 script 除了 “\n” 中的 “ 這個符號有誤以外,修正後可成功合併影片。

          • 訪客表示:

            可是我修正符號後依然出現 「No such file or directory」耶
            Log訊息是放在哪個路徑下呢?

            • shazi7804表示:

              Hi

              我了解問題了,你的 Cygwin 是否沒有安裝 wget ?
              因為 echo 無法找到相對應的 ts 檔案,所以無法合併。

  2. 阿爆表示:

    你好,我现在有个问题…就是我已经把ts文件都下载下来存在电脑里了,可不可以直接合并呢?我的是mac系统

    • shazi7804表示:

      那你只需要 script 裡面的這段

      echo 65189_500{0..165}.ts | tr " " "\n" > tslist
      while read line; do cat $line >> combined.ts; done < tslist

  3. 小麥表示:

    看完這篇操作後,下載 + 合併都成功了
    感謝這篇的教學 ~

  4. 阿阿中表示:

    一直煩惱TS檔下載,量少可以手動,量大就不知道怎麼下手,看到這篇文章的教學後,終於可以自動下載+合併了 真是太感謝您了

  5. Benson表示:

    哈囉我最近也遇到TS檔案下載相關問題,想和您請教!
    我利用Chrome 開發者工具將m3u8的文件下載下來分析,文件網址如下:
    https://www.yottau.com.tw/course/video/readM3u8/3/503/3BmhmzwXmfVZmBORVGSymnkylDtxms/480P.m3u8
    開啟後發現該m3u8文件中的網址後還有其他後綴格式大概如:URL.ts?Expires=123456789&Signature=ABCDEFG123456
    我猜這後綴應該是某種認證機制。不過我對Bash Script 不熟,不知如何再對程式進一步加工處理….不過大致的想法是,能不能先對下載下來的m3u8文件給程式讀取後,對字串做處理,再讓程式自動下載合併。
    [讀取m3u8文件+ 字串處理 +wget+ CAT 合併]。p.s. 使用環境:OSX系統。
    如果可以行的話我就找到該片的m3u8文件,下載下來後餵給程式就大功告成囉!

    以上寫的有點冗長~盼大神回復了!

    • shazi7804表示:

      其實沒有這麼複雜,要合併一個 m3u8 文件就是「下載 > 合併」,只要你能夠下載完整的 m3u8 的分割檔再進行 cat 合併就可以。

      但你必須先思考怎麼通過 Get 的驗證。

  6. none表示:

    yahoo tv ts檔怎麼依序合併?

  7. Uchihatsu表示:

    想問一下我照你的SCRIPT 做了
    不過只可以下載而做不了COMBINE的動作
    可以問有沒有解決方法??

    line 5: $’\r’: command not found
    line 6: $’wait\r’: command not found
    line 8: tslist: No such file or directory

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱