顯示具有 youtube-dl 標籤的文章。 顯示所有文章
顯示具有 youtube-dl 標籤的文章。 顯示所有文章

2025年3月19日 星期三

yt-dlp下載錯誤導致 Whisper 無法使用的處理

2025年3月19日 星期三

之前有人反應在使用我的三個 Google Colab 的小工具:

會出現類似這樣的錯誤訊息而卡住:

ERROR: [youtube] BVSF-vSvL6Y: Sign in to confirm you’re not a bot. Use --cookies-from-browser or --cookies for the authentication. See  https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlp  for how to manually pass cookies. Also see  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#exporting-youtube-cookies  for tips on effectively exporting YouTube cookies

[圖1] 有較完整的訊息內容:

[圖1] yt-dlp 下載失敗的截圖

訊息中最重要的關鍵字其實是這兩個:

  • 「yt-dlp」
  • 「Sign in to confirm you’re not a bot」

錯誤是發生在使用「yt-dlp」來下載 YouTube 影片的程序中,應該是 YouTube 的網站在進行「機器人」偵測,Google Colab 的程序無法跟 YouTube 網站「正確互動」,而被擋下來,導致無法下載影片。

除了前面的錯誤訊息,我在測試時,「買一送一」,遇到了第二種錯誤訊息:

ERROR: unable to download video data: HTTP Error 403: Forbidden

[圖2] 是我 yt-dlp 用那麼久以來,第一次遇到的 403 Forbidden 訊息: 

[圖2] yt-dlp 403 Forbidden 的錯誤訊息

YouTube 直接跟我說,無法存取了(很好!我喜歡直接的人!)。

解決的方法

在 Google Colab 中,遇到前面兩種狀況時,目前我的解決方法是執行「中斷連線,並刪除執行階段」,這樣可以達到類似「閞機」的效果,將虛擬機關掉,然後我們再將它重啟。

怎麼做呢?很簡單,看 [圖3]、[圖4] 中的紅色箭頭:

[圖3] 點選「中斷連線,並刪除執行階段」

[圖4] 按「是」來確認

當我們利用「中斷連線,並刪除執行階段」,將虛擬機進入「關閉」的狀態以後,只要再重頭將 OpenAI Whisper / Faster Whisper / yt-dlp 的操作程序再執行一次,應該就有機會可以成功了!為什麼說「有機會」呢?哈!我自己在測試時,遇過要兩次才沒被 YouTube 擋下來;幸好不用像「國父」一樣 XDDD

祝您好運,可以畢其功於一役!

相關連結

2024年11月10日 星期日

開發 yt-dlp 應用的好幫手 cli_to_api.py

2024年11月10日 星期日

無論是 youtube-dl 或是後繼的分支 yt-dlp 都是用來下載網站影音的好工具,各大知名的影音網站都支援,真的是「超級強」,唯一的缺點它是屬於命令列的工具(對不畏懼指令的人,反而更能把 yt-dlp 的特色完全發揮)。如果不想面對指令,我也弄了一個只要填填資料就能用的,放在這篇文章中,可以試試看:

上面這個小工具是在 Google Colab 的虛薿機以 Python 來處理表單資料,再使用 yt-dlp 的模組來執行影音下載及後續的處理,

關於 yt-dlp 在下指令時,可用的功能選項語法,可以參考官方的說明:

模組中的應用方式可以參考 yt-dlp 的官方說明:

一開始,我以為就是將命令模式用的參數套到模組中就好了,很簡單嘛!哈~真的是太單純了!yt-dlp 的參數包羅萬向,有的參數是用在前端,有的參數是用在後端;同一個功能,名稱及所屬的階層亦不同。感覺直接下指令好像單純一點。

例如,下載影片後,只想儲存 mp3 聲音檔(如果使用預設工具,它是在最後時以 FFmpeg 來進行轉檔),在命令列中使用的是這樣的參數:

--extract-audio --audio-format mp3

但是在 Python 中使用 yt_dlp 模組時,最少必須在設定中使用:

'postprocessors': [{
    'key': 'FFmpegExtractAudio',
    'preferredcodec': 'mp3',
}]

哈!當初為了這個卡關很久,因為一開始,要嘛去搜尋別人的討論或心得;不然就是直接追 yt-dlp 的原始碼。有收穫,但是花了很多時間。

重點來了!昨天在這個網頁中找到了寶:

裡面提到了有一個名為「cli_to_api.py」的工具:

我們只要將在下 yd-dlp 命令時用的參數給 cli_to_api.py ,它就會提供轉換的建議,可以輕鬆地應用在 Python 中。例如,我輸入:

python cli_to_api.py --extract-audio --audio-format mp3

它就給我這樣的內容:

The arguments passed translate to:

{'final_ext': 'mp3',
 'format': 'bestaudio/best',
 'postprocessors': [{'key': 'FFmpegExtractAudio',
                     'nopostoverwrites': False,
                     'preferredcodec': 'mp3',
                     'preferredquality': '5'}]}

Combining these with the CLI defaults gives:

{'extract_flat': 'discard_in_playlist',
 'final_ext': 'mp3',
 'format': 'bestaudio/best',
 'fragment_retries': 10,
 'ignoreerrors': 'only_download',
 'postprocessors': [{'key': 'FFmpegExtractAudio',
                     'nopostoverwrites': False,
                     'preferredcodec': 'mp3',
                     'preferredquality': '5'},
                    {'key': 'FFmpegConcat',
                     'only_multi_video': True,
                     'when': 'playlist'}],
 'retries': 10}

真的是太令人感動了!愛死開源的社群了,讓人功力馬上大增!

另一個例子,如果想讓 yt-dlp 可以將有分章節的 YouTube 影片,下載後一個章節儲存一個檔案,命令列可以使用這個參數:

--split-chapters

使用  cli_to_api.py 來轉換一下:

The arguments passed translate to:

{'postprocessors': [{'force_keyframes': False, 'key': 'FFmpegSplitChapters'}]}

Combining these with the CLI defaults gives:

{'extract_flat': 'discard_in_playlist',
 'fragment_retries': 10,
 'ignoreerrors': 'only_download',
 'postprocessors': [{'force_keyframes': False, 'key': 'FFmpegSplitChapters'},
                    {'key': 'FFmpegConcat',
                     'only_multi_video': True,
                     'when': 'playlist'}],
 'retries': 10}

關鍵的設定是:

{'postprocessors': [{'force_keyframes': False, 'key': 'FFmpegSplitChapters'}]}

真是要命!害我鬼打牆,一直以為用「'split_chapters': True」,然後下指令明明成功了,在 Python 中,就是沒效果。

另外,以 chapters 儲存為什麼檔名的語法,順便筆記一下,命令列的參數:

-o "chapter:%(title)s-%(section_number)02d-%(section_title)s.%(ext)s"

用在 embedding 時:

'outtmpl': {'chapter': '%(title)s-%(section_number)02d-%(section_title)s.%(ext)s'}

怕檔名有用到特列的字,保險一點,還可以再加上 --windows-filenames 參數:

'windowsfilenames': True

有了  cli_to_api.py 這個小工具,真的是幫了大大的忙,讓人可以更體驗到 yt-dlp 這工具的強大。

相關連結


2023年9月8日 星期五

HTML5 FUN : 數學小白板時鐘元件

2023年9月8日 星期五

來囉~ HTML5 FUN 數學小白板的時鐘元件來囉~可以讓它自己走,也可以使用手動模式來自己拖曳指針。

底下整理一下它的功能選單:

  • 變大、變小:改變時間的尺寸。
  • 秒針顯示、秒針隱藏:可以用來控制是否顯示秒針。不顯時秒針時,會將它固定在12的位置後隱藏,這樣子就能讓分針可以對準刻度上的格子。(2023.10.15有異動)
  • 數字顯示切換:每按一次會讓刻度上的數字有以下的改變(循環切換)
    • 內圈加 13~24 的數字(與時針同色),供 24 小時制的對照。
    • 內圈加 0 ~55 每大格增加 5 的數字(與分針同時),供分鐘與秒鐘對照。
    • 清空所有數字。
    • 只有數字 1~12。
  • 24小時制:顯示24小時制的數字鐘。(2023.10.15有異動)
  • 12小時制:顯示12小時制的數字鐘。(2023.10.15有異動)
  • 穩藏數字鐘
  • 自動:讓時鐘可以持續更新為現在的時間。
  • 手動:指針需拖曳才會動。
  • 對時:抓取現在的時間。
  • 複製:製作一個目前時鐘的副本。

指針對應到刻度上都有一個同色的小方塊,它除了是一個「指示器」可以更清楚地顯示指針所在的刻度外,如果拖曳「指示器」,可以用與指針同色的扇形,及虛線箭頭標示出經過的時間。如果直接拖曳指針(不要在指示器上),就可以取消現有的經過時間標示。

更新補充(2023.10.15)

功能選單有以下的異動:

  • 「24小時制」、「12小時制」兩個按鈕合併為「12/24小時制」,以一個按鈕來切換。
  • 「秒針顯示」、「秒針隱藏」兩個按鈕合併為「秒針開/關」。並新增「分針開/關」「時針開/關」兩個按鈕;所以能用這三個按鈕來控制三根指針的顯示與否。
操作的新功能:
  • 當三根指針只剩一根時,拖曳指外側端點「指示器」時,旋轉角會有箭頭;拖曳指針則只有虛線的圓弧,無箭頭
  • 當指針只剩時針時,盤面上的刻度會只剩下12大格,拖曳的角度會鎖定在這12格刻度上。
  • 分享時鍾時,已可以匯出指針是否隱藏,及旋轉角的設定;開啟分享的網址時,亦可正常重現。

示範影片

底下是數學小白板時鐘元件的操作影片:

章節的清單如下,按時間可以直接跳到該章節:

00:00 新增時鐘元件及基本操作

00:48 功能選單介紹

01:00 秒針及刻度顯示設定

01:31 數字鐘的顯示與隱藏

02:11 複製時鐘

02:25 標示經過的時間

03:13 利用五格板放多個時鐘提問


相關連結


2023年3月30日 星期四

Toots : yt-dlp 下載 Youtube 或是其它網站的影音

2023年3月30日 星期四

每次別人問我如何下載 Youtube 影片,或是如何將 YouTube 影片下為 MP3?我唯一推薦使用的就是 youtube-dl (目前活躍發展的版本稱為 yt-dlp ),原因無他,它實在太強大了,不只可以下載 Youtube 的影片,很多知名網站的影音都可以下載。

▋ 支援哪些網站的下載?

yt-dlp 不是只能下載 YouTube 的影片哦!

像 Facebook 的影片、Twitter (X) 的影片 ...... 也可以,實在太多了,有興趣可以去 yt-dlp 專案看,傳送門在此:

它的小缺點是,官網提供的 yt-dlp 必須在命令列中輸入指令;如果想把影片轉為 mp3,還必須另外安裝 ffmpeg。

哈!一般人光看到「打指令」、「安裝」...... 就倒退 N 步了;所以有一些披著圖形界面,然後在背後使用 yt-dlp 的工具就應運而生。不過,如果要將 yt-dlp 的強大發揮到極至,打命令還是最有效率的。對指令有興趣,可以參考這個:

▋ 我來安裝,您來填寫表單下載影音

「yt-dlp 是以下指令的方式來使用」,太可怕了!!

好啦!不怕~不怕~~我在 Google Colab 中建好了會自動安裝 yt-dlp ,及自動下載影音的程序,您只要在表單中填寫要下載的影片網址、勾選要下載 mp4 影片,還是 mp3 音檔 ......,最後按一下執行鈕  ,不用自己面對指令了。

[圖1] 中的「url」的輸入欄位,是用來輸入想下載的影音網址,以 YouTube 來說,可以輸入單一影片的網址,或是播放清單的網址;選取完想要下載的是 mp4 (影片),或是 mp3 (純聲音),再按一下「執行」  的圖示,就會自動安裝並依設定執行程式,剩下的就是等待 Colab 幫我們將影音處理好,然後下載囉!

這個 Google Colab 中的 yt-dlp 執行時是在網頁瀏覽器中操作,所以可以在桌機、筆電、手機或是平板的網頁瀏覽器中執行。不過行動裝置因為有自動鎖定螢幕的機置,如果處理的時間較久,可能會因為自動鎖定螢幕而中斷程式的執行,影片比較大的時候,要注意鎖定螢幕的問題。

[圖1] Colab 上的 yt-dlp

▋ yt-dlp 影音下載工具的網址

下面這個短網址是放在 Google Colab 中的 yt-dlp :

▋ 使用方法

使用的方法很簡單,

  1. 打開前述的網址以後,進入 Colab 的頁面。
  2. 在「影音檔的網址」的欄位中填入影音所在的網址,例如: YouTube 影片網址、Facebook 有公開分享的網址 ......。
  3. 選取要輸出的格式。
  4. 設定其它選項。
  5. 都設定好了,就按左側有個三角形的圖示(  ),啟動安裝及下載的程序。

影片如果檔案較大者,可能要花一點時間,才能將影音檔案由 Google Colab 下載到自己的電腦,稍安勿躁,喝杯茶,輕鬆一下吧~~

▋ 下載失敗了嗎?

🌏 如果遇到無法下載的情形,首先要確認影片的來源是否為公開給任何人都可以看的,因為放在 Google Colab 中的 yt-dlp 是以「匿名」的方式去擷取影音的,並不是用您的身份,所以必須是公開給任何人的影音,才能抓得到。

 另外,如果是遇到錯誤訊息中有「Sign in to confirm you’re not a bot」,或是「403 Forbidden 」,可以參考這則文:

🐜 或是還有其它問題,請在本則文章最下方的留言區留言。




✂ ----------【分隔線】----------


✂ ----------【以下請忽略】----------



yt-dlp 合併為 mp4 的指令使用與除錯筆記

以下純屬個人的筆記,如果只是要用前述的工具,這部份建議略過不看,以免頭暈 ^_^ 。

在使用 yt-dlp 時,發現它和原生的 youtube-dl 顯著不同的地方。以預設值,直接下載 YouTube 的影片,它會將影片及聲音合併為 .mkv 格式的檔案;查了一下參數,照說使用「--merge-output-format mp4」可以將影音合併為 .mp4 的,但是一切並沒有如預期那麼容易,在我的電腦上,或是在 Google Colab 的環境中,都會出現類似這樣的錯誤訊息:

[youtube] wSBXfzgqHtE: Downloading android player API JSON
[info] wSBXfzgqHtE: Downloading 1 format(s): 248+251
[dashsegments] Total fragments: 6
[download] Destination: test3.f248.webm
[download] 100% of   55.29MiB in 00:00:25 at 2.14MiB/s
[dashsegments] Total fragments: 1
[download] Destination: test3.f251.webm
[download] 100% of    4.83MiB in 00:00:02 at 2.20MiB/s
[Merger] Merging formats into "test3.mp4"
ERROR: Postprocessing:   Stream #1:0 -> #0:1 (copy)

從訊來看,影片有下載回來 (248.webm),聲音有下載回來(251.webm),問題出在最後合併為 .mp4 的階段。

如果我們在 yt-dlp 的指令中再加上「-v」,可以更清楚問題點。摘錄最關鍵的錯誤訊息:

Input #0, matroska,webm, from 'file:test3.f248.webm':
  Metadata:
    encoder         : google/video-file
  Duration: 00:04:48.66, start: 0.000000, bitrate: 1606 kb/s
    Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709), 1920x1080, SAR
 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 1k tbn, 1k tbc (default)
Input #1, matroska,webm, from 'file:test3.f251.webm':
  Metadata:
    encoder         : google/video-file
  Duration: 00:04:48.68, start: -0.007000, bitrate: 140 kb/s
    Stream #1:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
[mp4 @ 0000000000146400] track 1: codec frame size is not set
[mp4 @ 0000000000146400] opus in MP4 support is experimental, add '-strict -2' i
f you want to use it.

Could not write header for output file #0 (incorrect codec parameters ?): Experi
mental feature

如果照上面紅色訊息中的指示,將「-strict -2」加在 ffmpeg 的參數中,的確就可以解決問題了。再去搜尋一下「opus in MP4 support is experimental, add '-strict -2' i f you want to use it.」,原來問題在 ffmpeg 的版本,我電腦中的 ffmpeg 和 Google Colab 環境中使用的 ffmpeg,都不是最新版,不加「「-strict -2」」,它就無法將「.webm」的聲音檔合併到 .mp4 中。如果將 ffmpeg 更新為最新的版本,ffmpeg 會自動幫忙處理好,yt-dlp 就不會因無法合併 .webm 產生錯誤而中斷了。

如果不更新 ffmpeg 也可以解決被 .webm 聲音檔打斷合併為 .mp4 影片的問題嗎?

既然知道是 .webm 聲音檔在作祟,那我們就限定聲音使用 mp4 可接受的聲音檔就好了,例如指定使用「m4a」格式,例如:

yt-dlp  -f "bv+ba[ext=m4a]/b" --merge-output-format mp4 https://www.youtube.com/watch?v=dQomed4X80U

上面的關鍵在「-f "bv+ba[ext=m4a]/b"」裡的「ba[ext=m4a]」,它指定使用音質最好的聲音檔,而且指定要使用「m4a」格式的,這樣一來,影片和聲音合併為 .mp4 時就不會有問題了。

有沒有更簡單的?

當然有,像這樣:

yt-dlp  -S "ext" --merge-output-format mp4 https://www.youtube.com/watch?v=dQomed4X80U

加上「-S "ext" 」的話,根據 yt-dlp 參數範例的說明,它就會用附檔名來決定選用的優先順序:

  • 影片的優先順序: mp4 > mov > webm > flv 
  • 聲音的優先順序: m4a > aac > mp3 ...

「m4a」是會被優先選用的,完全符合我們合併為 .mp4 時的需求。

在 Colab 中將除錯的歷程記錄在下列筆記本中:

可以實際觀察到 Colab 目前的 ffmpeg (ver. 4.2.7) 和 yt-dlp (ver. 2023.03.04) 的錯誤訊息及可行的參數運用方法。

相關連結


2022年5月24日 星期二

youtube-dl : SSL: CERTIFICATE_VERIFY_FAILED

2022年5月24日 星期二

在使用 youtube-dl 時,如果出現下面的錯誤訊息:

ERROR: Unable to download webpage: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)> (caused by URLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)'),))

表示來源網站的 SSL 憑證可能有問題,如果還是想繼續下載,可以使用 youtube-dl 的「--no-check-certificate」選項,它就會略過憑證的檢查;當然,安全就要自負囉!

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

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

相關文章



2022年3月30日 星期三

youtube-dl : 由 stdin 讀入網址

2022年3月30日 星期三

用 Python 寫了解析影片網址的小工具,網址要怎麼傳給 youtube-dl 呢?

youtube-dl 有個參數 -a 或 --batch-file ,它可以用來指定讀取一個網址清單的檔案;清單檔案裡面,一行一個網址;讀取後,youtube-dl 會批次下載那些網址的影片。

而 stdin / stdout 就像檔案一樣的操作,Python 以 print 將網址輸出,而 youtube-dl 就可以利用下面的語法來由 stdin 讀入

youtube-dl  -a - 

最後面那「-」減號就是 stdin。

所以假設我的 Python 程式叫 parase.py,解析的網頁是 https://a.b.c.d/xxx.html ,要執行的指令就像這樣:

python parse.py https://a.b.c.d/xxx.html | youtube-dl -a -

其實也就好玩,玩一下,不然,應該是整個都用 Python 來寫就好,一支程式就能搞定,還能有更多的變化。


Python : 錯誤訊息 : close failed in file object destructor

用 Python 寫了一支解析網頁中網址的小工具,打算把網址丟給 youtube-dl 去下載。其實最後也不過用 print 輸出而已,在 shell 底下可以看到分析出的網址,但是 pipe 給 youtube-dl 後,卻出現了底下的訊息:

close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr

查了一下,有 import sys ,在程式的最後面加入底下幾行,就不會冒出訊息了:

try:
    sys.stdout.flush()
except:
    pass
try:
    sys.stdout.close()
except:
    pass
try:
    sys.stderr.close()
except:
    pass



2022年3月28日 星期一

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

2022年3月28日 星期一

在前一篇「雄 : FFmpeg : 下載 .m3u8 播放清單的串流影片」中提到有些串流影片的影片片段被包裝成圖片檔,使用 youtube-dl 或 FFmpeg 開啟串流播放清單 .m3u8 檔後,會出現類似底下的錯誤訊息而無法下載影片:


[hls @ 00000000005aff80] Could not find codec parameters for stream 0 (Video: png, none(pc)): unspecif

Consider increasing the value for the 'analyzeduration' and 'probesize' options


仔細想想,造成 youtube-dl 無法下載的原因,應該是被 ffmpeg 給中斷了,因為如果使用 ffmpeg 來下載相同的影片,也會出現一樣的錯誤訊息而中斷。

「怨有頭,債有主。」找到原因了,那就試著看看 youtube-dl 有沒有不使用 ffmpeg 來下載串流檔案的參數。查了一下,還真有!

下面這兩個參數可以控制 youtube-dl 下載串流時使用的工具:

  • --hls-prefer-native
  • --hls-prefer-ffmpeg

從參數的名稱應該不難看出哪一個是使用 ffmpeg,哪一個是不使用 ffmpeg。

如果遇到被包裝成圖片檔的串流影片,而 ffmpeg 又無法被中斷下載,可以試試看,用 youtube-dl 的「 native HLS downloader」,在指令中加入:

--hls-prefer-native

當然囉!下載完,在檔案的最前面還是會有 PNG 的資料,一樣的,用工具去掉最前面的幾個 bytes,影片就能正常播放了。

後記

再搭配 youtube-dl 「--exec」選項,就可以在下載影片完,接著使用 ffmpeg 來將影片轉為正常的格式了。詳情參考於 2022.05.24 的完整做法:

相關文章




2022年3月27日 星期日

FFmpeg : 下載 .m3u8 播放清單的串流影片

2022年3月27日 星期日

 之前下載網路的影片大多是用 youtube-dl,不過,這幾天在某個以前能輕鬆下載的網站中,卻一直吃閉門羹。研究了幾天,稍有一點眉目。

該網站原來是由播放器載入 .m3u8 的串流播放清單,以前播放清單中放的是影片片段的網址,檔名是用 .ts 來當結尾。這次看到的 .m3u8 有兩個特別之處:一個是裡面又放別的 .m3u8 播放清單;另一種則是裡面不是放 .ts 的網址,居然是 .png 或是 .jpg。

.m3u8 檔案中放 .m3u8 這沒什麼,頂多是程序上多卡一道。但是放 .png 或是 .jpg 就妙了!而且如果將網所指的下載回來,開啟後,還真的是圖片,只差呈現的是一片白而已。利用網站的影片播放器可以播放影片,但是利用 youtube-dl 或是 ffmpeg 試著下載影片,就會出現下載到的是圖片,不是影片的警告訊息,當然影片也就下載不了。

好奇心驅使下,利用 HxD Hex Editor 開啟下載回來的 .png :

.png 影片片段檔案的內容

看到檔案的文件內容,有兩處令人覺得有趣:

  • FFmpeg Service01
  • IDAT

查了一下「IDAT」是 PNG 檔案中會用到的,而 FFmpeg 則是我用來處理影片的工具。於是將這個檔案的前 41 bytes (上圖反白的部份)刪除後,另存檔名為 xxx.png.ts。再用 VLC Player 來播播放,哇!看得到影片了吔!

依樣畫葫蘆,將另外四個小片段都刪掉前 41 bytes,並另存為 xxx.ts,仿原來的 .m3u8 製作了一個有新路徑的播放清單,可以用 ffplay 來播放,也可以利用 ffmpeg 將五個小片段合成一個 mp4 影片檔。

另一部影片的 .m3u8 播放清單中則都是 .jpg ,用 HxD Hex Editor 開啟下載回來的 .jpg 檔案:

.jpg 影片片段檔的內容

這個 .jpg 檔案的內容跟前面的 .png 長得滿像的,來比較一下:

.png 影片片段檔的內容

如果將上圖 .png 檔反白的部份刪除,它的檔頭跟 .jpg 就幾乎一樣了。所以我將下載回來的 .jpg 影片片段檔的檔名字尾加上了「.ts」,用 VLC Player 就可以直接播放了。哈!看起來,這支影片片段檔案的格式、編碼沒有問題,只要讓 FFmpeg 能接受叫「.jpg」的檔名就可以,所以要幫它加上底下的參數:


-allowed_extensions ALL 


完整的指令如下:


ffmpeg -allowed_extensions ALL -i https://xx.xx.xx.xx/index.m3u8 -c copy test.mp4


而串流播放清單中使用 .png 的影片處理起來就比較麻煩,我先解決如何用 FFmpeg 來直接下載串流檔案、去掉會誤導為 PNG 圖片的前 41 bytes。假設串流檔案叫 sample.png,使用底下的指令:


ffmpeg -f data  -protocol_whitelist "subfile,file,http,https,tcp,tls" -start 41 -i subfile:https://xx.xx.xx.xx/sample.png -map 0 -c copy -f data  sample.png.ts


輸入旳參數,去掉前 41 bytes 的關鍵:

  • -start 41 -i subfile:

如果出現 protocol whitelist 關鍵字的錯誤訊息,就再加上:

  • -protocol_whitelist "subfile,file,http,https,tcp,tls"

為了保持原來的編碼,輸入和輸出都加上:

  • -f data

輸出的編碼用 copy 的:

  • -c copy

下載並處理串流檔案的指令搞定了,剩下就是利用 PHP 去分析 index.m3u8 ,產生每一個串流檔案的處理指令,並通通放到一個批次檔裡,這樣就可以一口氣將有檔案下載回來。順便也製作一個帶有 .ts 新檔名的播放清單,方便串流檔案下載回來後,再以 FFmpeg 來合併成 .mp4 影片檔。

目前利用上述的方法,以 FFmpeg 來下載被動過手腳的影片是可行,有空再來研究一下,是不是還有更簡便的方式或工具。

相關文章


2017年5月27日 星期六

FFmpeg : 指定要加特效的時間點

2017年5月27日 星期六
2016年底的這一篇「雄 : FFmpeg : 影片剪接與加馬賽克」中利用了 youtube-dl 下載影片,並以 FFmpeg 為剪接、加馬賽克的工具,不過,當時不知道自己的 FFmpeg 版本太舊,以致於Timeline editing 的選項一直沒試成功,最後是用土法鍊鋼的方法完成了想達到的效果。這兩天心血來潮,更新了 FFmpeg ,花了一點時間研究了 Timeline editing 選項,再次體驗了 FFmepg 的強大。

這一篇就來細說重頭,一步驟一步驟的練功,最後建構出在指定位置、指定時段打馬賽克的影片。

2016年12月10日 星期六

FFmpeg : 影片剪接與加馬賽克

2016年12月10日 星期六
影片的剪輯不一定要使用圖形界面來操作的,如果只是想進行簡單的剪接而已,利用 ffmpeg 這個自由軟體,下指令即可進行剪接,甚至加上特效。

以底下的某化妝品廣告影片為例:



分析原廣告片,在 00:02:28.500 和 00:02:46.001 以後各有 1.5 秒 和 2 秒長的時間會出現商品的名稱,另外在 00:03:13 以後會有全版的廣告。片尾的廣告只要截掉不取即可,不過中間會有兩段要為商品名稱加上馬賽克。

本篇中會使用到兩個工具,都可以在網路中找到:

影片下載

在 YouTube 中的影片,可以利用 youtube-dl 下載。假設我們將下載回來的 FullHD 的影片儲存為 source.mp4。

切割影片

利用 ffmpeg 將原始影片(本例中的 source.mp4)切割為五分段,並輸出為 s1.mp4、s1.mp4、s1.mp4、s1.mp4、s1.mp4,五個影片檔。指令如下:

ffmpeg -i source.mp4 -ss 00:00:00.00 -t 00:02:28.500 -y -c copy s1.mp4 
ffmpeg -i source.mp4 -ss 00:02:28.501 -t 00:00:01.500  -y -c copy s2.mp4 
ffmpeg -i source.mp4 -ss 00:02:30.001 -t 00:00:16.000  -y -c copy s3.mp4 
ffmpeg -i source.mp4 -ss 00:02:46.001 -t 00:00:02.00 -y -c copy s4.mp4 
ffmpeg -i source.mp4 -ss 00:02:48.001 -t 00:00:25.00 -y -c copy s5.mp4

上述指令中,「-ss」設定了分段影片的開始時間,而「-t」設定了分段影片的長度。

加馬賽克

我們可以利用 ffmpeg 的濾鏡功能來為 s2.mp4 和 s4.mp4 這兩段有 mark 的地方加上馬賽克。

下載回來的影片,解析度是 1920 x 1080 ,而

  •  s2.mp4 中需要加馬賽克的大小假設為 960x540,放置的座標為 (380,270)
  •  s4.mp4 中需要加馬賽克的大小假設為 1160x540,放置的座標為 (380,270)

最後再用原來的檔名覆蓋儲存即可。執行底下的兩行指令:

ffmpeg -i s2.mp4  -filter_complex  "[0:v]crop=960:540:380:270,boxblur=10[fg];  [0:v][fg]overlay=380:270[v]" -map "[v]" -map 0:a -c:a copy -movflags +faststart  -y s2.mp4 
ffmpeg -i s4.mp4  -filter_complex  "[0:v]crop=1160:540:380:270,boxblur=10[fg];  [0:v][fg]overlay=380:270[v]" -map "[v]" -map 0:a -c:a copy -movflags +faststart  -y s4.mp4
上面的濾鏡參數:

  • [0:v] : 指出是針對第一個影片設定。
  • crop=960:540:380:270 在座標 (380, 27) 處取 960x540 大的畫面
  • boxblur : 馬賽克

連接影片

分段影片都處理好了,最後我們利用 ffmpeg 將 s1.mp4、s2.mp4、s3.mp4、s4.mp4、s5.mp4 五個檔案連接起來,並儲存為 new_movie.mp4,執行底下的這行指令:

ffmpeg -i s.mp4 -i out2.mp4  -i out3.mp4  -i out4.mp4  -i out5.mp4 -filter_complex concat=n=5:v=1:a=1 -y new_movie.mp4

concat 參數的部份:

  • n=5 : 有 5 個影片
  • v=1 : 有影片
  • a=1 : 有聲音


透過前面的操作以後,最後輸出的影片裡,看不到商品的名稱了。ffmpeg 實在好強,有空再來研究一下別的玩法。

後記

學而後知不足,2017年五月底再看這篇文章以後,才了解在整理這篇時有多麼土。其實 FFmpeg 如果用 version 2.0 以後的版本,有更簡單的方法。強烈的建議如果想幫影片加上多個不同的馬賽克,可以參考底下這篇中的方法:



相關文章



2016年10月31日 星期一

Tools : youtube-dl 下載影片的利器 part 4

2016年10月31日 星期一
關於 youtube-dl 這個強大的工具,之前寫過三篇介紹(詳見文末的相關文章),再追加一篇,如何連字幕一起下載。

youtube-dl 關於字幕的參數有:

  • --write-sub
  • --write-auto-sub
  • --all-subs
  • --list-subs
  • --sub-format FORMAT
  • --sub-lang LANGS
  • --embed-subs
  • --convert-subs FORMAT

以 YouTube 的影片來說,它的字幕 format 目前提供 vtt 和 ttml 兩種格式,我們可以利用底下指令來查詢:

youtube-dl --list-subs 影片網址

不過,我常用的影片播放程式 VLC 好像沒有支援 vtt 格式,沒關係,youtube-dl 的好朋友 ffmpeg 可以幫我們轉換為 VLC 支援的 srt 格式字幕檔。

所以,如果想在 YouTube 影片下載以後,順便:
  • 下載字幕檔。(使用 --write-sub --all-subs 參數)
  • 轉為 srt  格式的字幕檔。(使用 --convert-subs srt 參數)
  • 將字幕嵌入影片檔中。(使用 --embed-subs 參數)
就需要先下載底下兩支程式:
並將兩支程式放在同一個目錄中來搭配使用。

最後執行以下指令:

youtube-dl --write-sub  --all-subs --embed-subs --sub-format srt  影片網址

即可下載帶有字幕的 YouTube 影片。

什麼!下指令很麻煩!

好吧!我將之前的「Youtube-影片下載.vbs」改了一下,將下載所有字幕的參數加進去了,只要將這個有下載字幕的版本和 youtube-dl 及 ffmpeg 放在一起,就能變成有字幕的 YouTube mp4 影片囉!

檔案下載



相關文章



2016年6月21日 星期二

Tools : youtube-dl 下載 youku 的影片

2016年6月21日 星期二
2014年曾經介紹過利用 youtube-dl 來下載 YouTube 中的影片,最近好友在問如何下載 Youku 中的影片,印象中 youtube-dl 也支援 Youku 影片的下載。不過,太久沒更新我電腦中的 youtube-dl ,試了沒結果。重新下載最新版的 youtube-dl 才能正常的工作。

後來我們遇到另外一個問題,較長的影片,Youku 會將之切成很多小片段,所以一部影片下載完以後,會有很多檔案。甚至如果是使用「youtube-dl-gui」這個圖形化的界面來操作,只能下載到第一小段而已。

經過反覆的測試,最後,我將之前寫的「Youtube-影片下載.vbs」改寫為「Youku-影片下載.vbs」,讓它先利用 youtube-dl 去下載指定網址的 Youku 影片,然後再利用 ffmpeg 這個工具來把各分段影片檔案合併,用起來還算方便。底下簡單的分享一下操作的程序。

下載所需的工具


「Youtube-影片下載.vbs」會使用到以下兩支別人分享的工具程式


它們其實支援常見的作業系統,底下先以 Windows 為例,介紹如何使用。

下載的網址:



進入 youtube-dl 的下載頁面後,找到紅色前頭所指的「youtube-dl.exe」,它是我們下載影片的主角,建立一個資料夾,將下載的 youtube-dl.exe 儲存在該資料夾串。

youtube-dl 下載頁面
如果執行影片的下載任務出現找不到「msvcp100.dll」的訊息時,沒關係,上圖綠色箭頭所指的「Microsoft Visual C++ 2010 Redistributable Package (x86)」下載回來,安裝完後即可解決問題。

進入 ffmpeg 的下載頁面以後,可依 Windows 系統是 32位元或 64位元版而選擇不同的版本來下載。

ffmpeg 的下載頁面

下載回來的 ffmpeg 是個壓縮檔,解壓縮以後,我們只要「bin」資料夾的「ffmpeg.exe」即可以,將它複製到存放 youtube-dl.exe 的資料夾中。

最後登場的是下載我弄的小小工具「Youtube-影片下載.vbs」,下載的網址如下:


將壓縮檔裡的 「Youtube-影片下載.vbs 」解壓縮以後,和前面的 youtube-dl.exe 和 ffmpeg.exe 放在同一個資料夾中。有了這三者,應該可以輕鬆的下載 Youku 網站中的影片了。




下載 Youku 影片


工具準備妥當,可以下載影片囉!先大概介紹一下「Youtube-影片下載.vbs」所進行的程序:

  • 取得使用者輸入的 Youku 影片網址。
  • 試著用 youtube-dl 去擷取影片的「標題」。
  • 建立以影片標題為名稱的資料夾。
  • 試著以 youtube-dl 去擷取影片片段的清單,並產生給 ffmpeg 合併影片用的檔案清單,並儲存至 file_list.txt 檔案中。
  • 以 youtube-dl 下載影片。
  • 以 ffmpeg 合併各段影片為一個檔案。


影片下載 step 1

要下載影片,當然就是先連到 Youku 中,找到想下載的影片頁面,然後將影片的網址複製下來(圖片紅色箭頭指的那一長串)。



影片下載 step 2

啟動 「Youtube-影片下載.vbs」




影片下載 step 3

將複製好的影片網址貼入對話框輸入區,並按「確定」鈕。




影片下載 step 3

如果 youtube-dl 順利擷取到影片的相關資訊,應該會顯示類似底下合併影片訊息:


並且新增一個以影片標題為名的新資料夾。

按完「確定」鈕,就會開始下載影片囉!


相關文章





2014年5月22日 星期四

Tools : youtube-dl-gui 下載影片的利器 Part II

2014年5月22日 星期四
補記
本文為 2014年的舊文,youtube-dl 建議改用尚有持續發展的 yt-dlp :
如果想直接使用,可以參考 2023年3月較新的這一篇:
-----
原文開始

有網路真好,但是遇到網路不通,或是碰到龜速般的網路是又令人苦惱,最安心的做法當然是有「備」無患。上課前將要使用到的影片預先下載回來,管它是學校網路掛了,還是什麼「哇擱」Net 斷了、廢了,「雲」飄走了,備好的檔案一開就能上陣!


之前用過很多下載影片的方法,網站的、瀏覽器擴充功能的……,因為同事想找一個操作簡單、畫面單純的 Youtube 影片下載的方法給她活到老學到老,積極努力學電腦的長輩使用,花了點時間研究 youtube-dl 這個安裝過,卻不曾好好用過的厲害工具。為了讓老先生可以做到複製網址、貼網址,最後再按個「下載」鈕就可以輕鬆下載影片,本來我是利用 vbs 為 yotube-dl 這個 Python開發的工具,寫了個陽春的圖形界面,不過,這樣一來,可埋沒了 youtube-dl 的強大功能。後來又想用 C# 寫個有進階選項的 youtube-dl GUI,加入更多 youtube-dl 的功能選項,不過,看到網路上已經有人利用wxPython開發可跨平臺的 youtube-dlG (youtube-dl-gui) 當 youtube-dl 的前端圖形操作界面,決定好好用它就好啦!不傷神寫程式了。

2014年4月15日 星期二

Tools : youtube-dl 下載影片的利器

2014年4月15日 星期二

補記

本文為 2014年的舊文,youtube-dl 建議改用尚有持續發展的 yt-dlp :
如果想直接使用,可以參考 2023年3月的這一篇:
-----
原文開始

之前利用「TubGet」來下載 Youtube 上的影片,覺得還滿簡單好用的,只是最近不知怎麼了,已無法下載影片或是 MP3。同事問到還有什麼好用的工具可以下載影片,回想起上次在 Raspberry Pi 上安裝 rPlay 玩 AirPlay mirroring 時,它特別提醒要安裝 youtube-dl ,並更新為最新版,這個 youtube-dl 可是個好物,可以利用它來下載常見影音網站中的影音,可以下載單支影片,也支援播放清單及批次下載,功能強大,如果它有提供圖形界面就更完美了。

 
雄::gsyan © 2009. Design by Pocket