在幫客戶做一些可以線上撥放的教學課程影片
目前已經使用 ffmpeg 做 m3u8 的加密了
撥放上是完全沒有問題
假設這個 lesson1.m3u8 共有 0000.ts ~ 1000.ts
================================
現在客戶希望可以做一些 "預告" 的影片
我的想法是既然 ts 檔案都分切好了
沒必要產生新的影片檔案
所以我想說就動態產生一個新的 m3u8 檔案
讓他去撥放特定範圍的影片就好了
然後問題就出現了
如果我一個 m3u8 檔案是 連續片段 , 就可以正常撥放
例如
lesson1p1.m3u8 = 0100.ts ~ 0200.ts (有透過動態讀取修改 ts 檔名為 0000 ~ 0099)
lesson1p2.m3u8 = 0500.ts ~ 0800.ts (有透過動態讀取修改 ts 檔名為 0000 ~ 0299)
但如果在 1 個 m3u8 檔案中 , 混和多段 ts 檔案就會在進入 第2段時造成異常
例如
lesson1p3.m3u8 = 0050.ts ~ 0080.ts , 0100.ts ~ 0150.ts ,
(有透過動態讀取修改 ts 檔名為 0000 ~ 0079)
================================
我前端是使用 videojs 這個撥放器
但透過桌面 app potplayer 也是有一樣的問題
我推測是不是因為 ts 檔案中有一些驗證機制 , 來確保撥放的下一個檔案是連續的
不知道有沒有方式可以略過這個驗證機制 , 不管怎樣就照播之類的?
嘗試用 google 找資料
但可能下錯關鍵字吧 , 一直找不到相關說明
不管是 hls vhs ffmpeg m3u8 format ... balabala
不知道有沒有前輩可以給一些方向參考 , 或是更好的解決方案
目前預告都只能請客戶自己剪輯成 mp4 後再轉 m3u8
但我個人覺得這樣維護上 和 硬碟空間
都有點浪費
因為 ts 裡面會寫入 timestamp, 如果播放器發現他前後不連續就會中斷; 要播放與原本編碼順序不連續的片段, 需要在 m3u8 內插入 EXT-X-DISCONTINUITY 標籤隔開, 讓播放器知道 timestamp 要自行計算:
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
400-clipA-0.ts
#EXTINF:10,
400-clipA-1.ts
#EXTINF:5,
400-clipA-2.ts
#EXT-X-DISCONTINUITY
#EXTINF:10,
400-advert0.ts
#EXTINF:3,
400-advert1.ts
#EXT-X-DISCONTINUITY
#EXTINF:10,
400-clipB-0.ts
#EXTINF:10,
400-clipB-1.ts
#EXTINF:5,
400-clipB-2.ts
#EXT-X-ENDLIST
你可能也需要調整 EXT-X-DISCONTINUITY-SEQUENCE 參數:
https://yuanchieh.page/posts/2018/2018-09-24_hls-spec/