前言最近看到一個(gè)不錯(cuò)的視頻,,想要下載到本地收藏起來,,免得哪天網(wǎng)址失效無法播放。但是使用 FFmpeg 下載的時(shí)候報(bào)了個(gè)錯(cuò)
PNG ,?,?網(wǎng)頁里明明可以播放的。下載了其中一個(gè)片段,,打開后發(fā)現(xiàn)真的是一張圖片,。使用 hexdump 查看了一下,文件最開始確實(shí)是 PNG 圖片,,但是緊接著就看到了 Google 了一下,,找到兩篇文章 [1] [2],。講的是通過在視頻前加一個(gè)小的 PNG 圖片來偽裝成圖片騙過圖床的校驗(yàn),hls.js 在播放時(shí)會(huì)自動(dòng)忽略前邊的圖片,。但 FFmpeg 沒有相關(guān)處理,,把偽裝后的視頻識(shí)別成了圖片導(dǎo)致下載失敗,。 解決思路知道了問題的原因,解決思路就有了,。但是實(shí)際操作過程中遇到了很多問題,,這里記錄一下。 [3], 根據(jù)描述猜測(cè)是解析視頻片段時(shí)的一些參數(shù),,嘗試搭配 |
1 |
|
由于這個(gè)參數(shù)是最近才添加的,,翻遍全網(wǎng)都沒找到更詳細(xì)的描述,,故放棄此方法。
既然指定格式行不通了,,那我們還可以屏蔽 FFmeg 對(duì)圖片格式的檢測(cè),。但是 FFmpeg 文檔里也沒有找到相關(guān)參數(shù)(笑哭??)。這里我們可以通過自己編譯來屏蔽圖片格式支持,。下面是編譯過程:
1 |
|
使用自己編譯的 FFmpeg 嘗試下載,,果然成功了。
在查找資料的過程中,,發(fā)現(xiàn) m3u8 語法中有一個(gè)標(biāo)簽 EXT-X-BYTERANGE
[4],,可以讀取指定范圍的視頻片段,語法為:#EXT-X-BYTERANGE:<讀取內(nèi)容長(zhǎng)度>[@<起始位置偏移量>]
,。由于只要要破壞 PNG 格式頭就可以使 FFmpeg 識(shí)別到正確的視頻,,偏移 8 字節(jié)足夠了。這里我們把參數(shù)設(shè)置為 100000000@8
,。下載腳本如下:
1 |
|
雖然可以下載,,但是由于不知道每個(gè)視頻片段具體大小,使用了寫死的 100000000
,,F(xiàn)Fmpeg 下載時(shí)會(huì)卡好久,,不是一個(gè)完美的方案,故不推薦,。
雖然嘗試成功了兩次,,但是做法都不是太優(yōu)雅,還是希望 FFmpeg 官方可以增強(qiáng)對(duì) hls 自定義設(shè)置的支持,,如可以強(qiáng)制指定片段格式等,。可以通過一條命令成功下載
|