よしたかの日常

日常の事やイラスト投稿、開発している時の備忘録を書いています。

MacでYouTubeの映像・音声を保存する方法

おはこんばんにちは!

曇りが続いていたんだけど、晴れ間が見えると一気に気温があったかくなってきましたね。

前置き

私は、よく外出時用にYouTubeの歌ってみた系を保存して、iPhoneに入れています。

保存する際に、俗に言うYouTube保存サイトを利用してmp3形式で保存していたのですが、たまたま今日気まぐれにおすすめサイトに出てきた保存サイトを利用しようとしたら、そこに保存する際に使用しているライブラリのことが書かれていました。

これは、自分で保存サイト作れるのではと思い、ライブラリについて色々調べていたら、MacのHomebrewで簡単にインストールすることができることがわかったので、やるしかない!って感じにインストールしました。

準備

Homebrewについては、省略します!
下記、公式サイトへ行ったらわかると思います。 brew.sh


で、目的のYouTubeの動画を保存するパッケージは、「yt-dlp」というパッケージです。

まずは、ターミナルを開いてHomebrewでyt-dlpパッケージをインストールします。
続いて、動画・音声の設定用にffmpegパッケージを入れます。

コマンドは下記の通りです。

brew install yt-dlp
brew install ffmpeg

これで準備は終わりです。

使い方

yt-dlpの基本的なコマンドは下記の通りです。

yt-dlp [Url] [Option(省略可)]

例としては下記のような書き方になります。

yt-dlp "https://www.youtube.com/watch?v=A_uB51ZuCy0"


ちなみに例として使用しているYouTubeの動画は先日公開された戌神ころねさんの新しいオリジナル曲『TROUBLE “WAN”DER!』です。
ころさんらしい小ネタが満載で楽しい楽曲・MVになっています。
ぜひ、観てみてください。

www.youtube.com


話がそれました。
上記コマンドをターミナルで実行すると、YouTubeの動画が実行したディレクトリ上にwebm形式で保存されます。
Googleのサービスだから、標準の規格がwebmになっているんですね。

保存形式の指定

このままだと、面倒なのでオプション指定をします。
『-format』オプションを指定すると、出力形式の指定が出来ます。

ということで、下記のようにオプションを追加してみます。

yt-dlp "https://www.youtube.com/watch?v=A_uB51ZuCy0" --format mp4

上記のコマンドを実行すると、少し時間がかかってからmp4形式で保存されているかと思います。

これで、基本的なYouTube動画の保存ができるようになりました。

音声ファイルのみ保存したい

私的には、音声のみを保存したいので、オプションを書き換えていきます。
まずは、『-F』と『-f』というオプションがあるのですが、最初に『-F』のみを追加した状態でコマンドを実行します。

yt-dlp "https://www.youtube.com/watch?v=A_uB51ZuCy0" -F

すると、下記のような表が表示されます。
これは、どの形式で保存しますか?という表になっており、『-f』オプションに使用する値を調べる表になります。

ID  EXT   RESOLUTION FPS CH │   FILESIZE   TBR PROTO │ VCODEC          VBR ACODEC      ABR ASR MORE INFO
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
sb3 mhtml 48x27        0    │                  mhtml │ images                                  storyboard
sb2 mhtml 80x45        1    │                  mhtml │ images                                  storyboard
sb1 mhtml 160x90       1    │                  mhtml │ images                                  storyboard
sb0 mhtml 320x180      1    │                  mhtml │ images                                  storyboard
233 mp4   audio only        │                  m3u8  │ audio only          unknown             [en] Default
234 mp4   audio only        │                  m3u8  │ audio only          unknown             [en] Default
599 m4a   audio only      2 │  794.04KiB   31k https │ audio only          mp4a.40.5   31k 22k [en] ultralow, m4a_dash
600 webm  audio only      2 │  829.83KiB   32k https │ audio only          opus        32k 48k [en] ultralow, webm_dash
139 m4a   audio only      2 │    1.23MiB   49k https │ audio only          mp4a.40.5   49k 22k [en] low, m4a_dash
249 webm  audio only      2 │    1.20MiB   48k https │ audio only          opus        48k 48k [en] low, webm_dash
250 webm  audio only      2 │    1.59MiB   63k https │ audio only          opus        63k 48k [en] low, webm_dash
140 m4a   audio only      2 │    3.26MiB  130k https │ audio only          mp4a.40.2  130k 44k [en] medium, m4a_dash
251 webm  audio only      2 │    3.16MiB  125k https │ audio only          opus       125k 48k [en] medium, webm_dash
597 mp4   256x144     12    │  836.90KiB   32k https │ avc1.4d400b     32k video only          144p, mp4_dash
602 mp4   256x144     12    │ ~  2.10MiB   84k m3u8  │ vp09.00.10.08   84k video only
598 webm  256x144     12    │  627.62KiB   24k https │ vp9             24k video only          144p, webm_dash
269 mp4   256x144     24    │ ~  4.25MiB  169k m3u8  │ avc1.4D400C    169k video only
160 mp4   256x144     24    │    1.66MiB   66k https │ avc1.4D400C     66k video only          144p, mp4_dash
603 mp4   256x144     24    │ ~  4.16MiB  165k m3u8  │ vp09.00.11.08  165k video only
278 webm  256x144     24    │    1.76MiB   70k https │ vp09.00.11.08   70k video only          144p, webm_dash
229 mp4   426x240     24    │ ~  7.23MiB  287k m3u8  │ avc1.4D4015    287k video only
133 mp4   426x240     24    │    3.06MiB  122k https │ avc1.4D4015    122k video only          240p, mp4_dash
604 mp4   426x240     24    │ ~  7.07MiB  281k m3u8  │ vp09.00.20.08  281k video only
242 webm  426x240     24    │    3.42MiB  136k https │ vp09.00.20.08  136k video only          240p, webm_dash
230 mp4   640x360     24    │ ~ 12.95MiB  515k m3u8  │ avc1.4D401E    515k video only
134 mp4   640x360     24    │    5.59MiB  222k https │ avc1.4D401E    222k video only          360p, mp4_dash
18  mp4   640x360     24  2 │   12.14MiB  482k https │ avc1.42001E         mp4a.40.2       44k [en] 360p
605 mp4   640x360     24    │ ~ 14.88MiB  592k m3u8  │ vp09.00.21.08  592k video only
243 webm  640x360     24    │    6.32MiB  251k https │ vp09.00.21.08  251k video only          360p, webm_dash
231 mp4   854x480     24    │ ~ 20.12MiB  800k m3u8  │ avc1.4D401E    800k video only
135 mp4   854x480     24    │   11.27MiB  448k https │ avc1.4D401E    448k video only          480p, mp4_dash
606 mp4   854x480     24    │ ~ 23.02MiB  915k m3u8  │ vp09.00.30.08  915k video only
244 webm  854x480     24    │    8.87MiB  352k https │ vp09.00.30.08  352k video only          480p, webm_dash
22  mp4   1280x720    24  2 │ ≈ 24.30MiB  966k https │ avc1.64001F         mp4a.40.2       44k [en] 720p
232 mp4   1280x720    24    │ ~ 37.10MiB 1475k m3u8  │ avc1.4D401F   1475k video only
136 mp4   1280x720    24    │   21.04MiB  837k https │ avc1.4D401F    837k video only          720p, mp4_dash
609 mp4   1280x720    24    │ ~ 45.17MiB 1796k m3u8  │ vp09.00.31.08 1796k video only
247 webm  1280x720    24    │   20.81MiB  827k https │ vp09.00.31.08  827k video only          720p, webm_dash
270 mp4   1920x1080   24    │ ~142.58MiB 5668k m3u8  │ avc1.640028   5668k video only
137 mp4   1920x1080   24    │  109.36MiB 4348k https │ avc1.640028   4348k video only          1080p, mp4_dash
614 mp4   1920x1080   24    │ ~ 87.64MiB 3484k m3u8  │ vp09.00.40.08 3484k video only
248 webm  1920x1080   24    │   66.57MiB 2647k https │ vp09.00.40.08 2647k video only          1080p, webm_dash
616 mp4   1920x1080   24    │ ~143.73MiB 5714k m3u8  │ vp09.00.40.08 5714k video only          Premium

出力したい形式を『-f ID』で指定します。
音声のみが欲しいので、ID「599」「139」「140」の辺りになります。

なので、コマンドは下記の通りになります。

yt-dlp "https://www.youtube.com/watch?v=A_uB51ZuCy0" -f 140

これで、音声ファイルのみの保存をすることができるようになりました。

ちなみに、表にあるvideo onlyのIDを指定すると映像のみで音声がないファイルが出力されます。
音声もつけたい場合は、下記のように書く必要があります。

yt-dlp "https://www.youtube.com/watch?v=A_uB51ZuCy0" -f 137+140 --merge-output-format mp4

『-f』オプションに『映像ID+音声ID』を指定して、『--marge-output-format』オプションで映像IDと音声IDの形式を合体してmp4形式で出力させる指定をしています。

もう一手間

これで、目的の音声のみ保存ができるようになったのですが、毎回毎回URLを書き換えて実行は面倒なのでcommandファイルで簡単に実行できるようにしていきます。

まずは、適当にcommandファイルを作成して、下記のように記述して保存します。

#!/bin/bash

echo "Youtube Video Url:"
read url
yt-dlp "$url" -f 140 --output '~/Downloads/%(channel)s/%(title)s.%(ext)s' --write-thumbnail --convert-thumbnails jpg

osascript -e 'tell application "Terminal" to close first window'

echoは、何も表示されないと寂しいから書いているだけです。
readコマンドで、動画URLの入力待ち状態にしています。

yt-dlpのところは、『$url』で入力されたURLを指定しており、『--output』オプションで、どこに保存するかを指定しています。

内容は、ダウンロードフォルダにチャンネル名のフォルダを作って、その中に動画タイトル名で保存してね、という内容です。

『--write-thumbnail』オプションは、一緒にサムネイルも保存してね、という内容です。
『--convert-thumbnails』オプションは、指定しないとGoogle規格のwebp形式で保存されるので、jpgで保存するように指定しています。

最後の行の『osascript』コマンドは、処理が終わったらウィンドウを閉じる確認ダイアログを出すコマンドになってます。
処理が終わったあと、[プロセスが終了しました]でウィンドウが開いたままになってしまうのを防ぐ目的に書いています。

これであとは、commandファイルに実行権限をつけてダブルクリックするだけで、ターミナルが起動してURL入力待ち状態になるので、YouTube動画のURLをコピペするだけで、ダウンロードフォルダに音声ファイルとサムネイルが保存されるようになります。

yt-dlpについて

まさか、こんな便利なパッケージがあったとは...。
制作者に感謝です!!

Macで、とタイトルでは書いているけどPythonで出来ており、WindowsでもLinuxでも同じように動かせるようです。

github.com

masayoshi-9a7ee.hatenablog.com


なんか、久しぶりに長い記事を書いた気がする...🫠