在「雄 : youtbue-dl : 下載 ffmpeg 無法下載的串流影片」這篇中,利用 youtube-dl 的選項「--hls-prefer-native」,讓它避免使用 ffmpeg 來下載偽裝為圖片的串流影片,好處是可以一個網址來下載整個影片,不過因為它還是帶有圖片的識別資料,最後仍然要處理這部份,一般的影音播放工具才會識別出它是影片,才能正常播放。
後來試了一下,其實只要將帶有圖片識別資料的影片檔,去掉最前面的 3 bytes (通常是 PNG、BMP、JPG ... ),就可以利用 ffmpeg 來進行轉存為正常影片了。
假設用 youtube-dl 下載回來的串流影片檔的檔名為 NG.mp4,想要去掉前 3 bytes (也就是由第 4 bytes 讀起),就利用底下的指令來輸出為正常的影片 OK.mp4:
ffmpeg -protocol_whitelist subfile,file -start 4 -i subfile:NG.mp4 -map 0 -c copy OK.mp4
再者,因為 youtube-dl 可以利用「--exec」的選項來指定,在影片下載並儲存完後,接著要針對輸出的檔案執行的命令。讓「--hls-prefer-native」和「--exec」同時使用,前段由 youtube-dl 來下載偽裝為圖片的串流影片,後段交由 ffmpeg 來轉為正常影片。
使用前,要先確認 youtube-dl 和 ffmpeg 都放在一起了,然後執行底下的指令:
youtube-dl ---hls-prefer-native --exec "ffmpeg -protocol_whitelist subfile,file -start 4 -i subfile:{} -map 0 -c copy {}.mp4" URL
上面的指令中, URL 是要下載的串流影片網址。
如果和前面尚未合併的指令比較一下,有沒有發現到:
- 輸入的「NG.mp4 」檔名被換為「{}」。
- 輸出的「OK.mp4」檔名被換為「{}.mp4」。
當使用 youtube-dl 的 --exec」的選項,後面指令的字串裡,「{}」代表最後 youtube-dl 儲存的檔名,這樣滿方便的,我們除了使用 youtube-dl 預設的檔名外,也能使用「-o」的選項來自訂檔名,利用「{}」可以自動幫我們替換掉。
不過,為了讓原始檔跟被 ffmpeg 處理過的檔案同時存在,輸出時,在原始檔名的字尾又加上了「.mp4」({}.mp4),所以如果 youtube-dl 中使用了「-o test.mp4」,ffmpget 處理完就會變成「test.mp4.mp4」。
如果 youtube-dl 下載回來的串流影片是「沒被動過手腳」的正常影片,會是什麼結果呢?
mov,mp4,m4a,3gp,3g2,mj2 @ 0000000000460440] Format mov,mp4,m4a,3gp,3g2,mj2 detected only with low score of 1, misdetection possible!
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000000000460440] moov atom not found subfile:XXX.mp4: Invalid data found when processing input
ERROR: Command returned error code 1
如果已經是正常影片,在輪到 ffmpeg 進行後續處理時,會類似出現上面的錯誤訊息。
不過沒關係,youtube-dl 已經將影片儲存好了。
所以做一個小結論:
- 如果執行前面的指令,經過 youtube-dl 和 ffmpeg 處理過的影片,影片的檔名會是 XXX.mp4.mp4 (.mp4 出現兩次)。
- 如果執行前面的指令, ffmpeg 出現了錯誤訊息,影片的檔名會是 XXX.mp4。
相關文章
- 雄 : youtbue-dl : 下載 ffmpeg 無法下載的串流影片
- 雄 : FFmpeg : 下載 .m3u8 播放清單的串流影片
- 雄 : Tools : youtube-dl 下載影片的利器
- 雄 : Tools : youtube-dl-gui 下載影片的利器 Part II
- 雄 : Tools : youtube-dl 下載 youku 的影片
- 雄 : Tools : youtube-dl 下載影片的利器 part 4
沒有留言:
張貼留言