2022年5月24日 星期二

youtbue-dl : 下載 ffmpeg 無法下載的串流影片之二

2022年5月24日 星期二

在「雄 : 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。

相關文章



沒有留言:

張貼留言

 
雄::gsyan © 2009. Design by Pocket