今回はPythonで簡単にYouTubeの動画を高画質でダウンロードする方法について解説します。
数千円で販売されているダウンロードツールや、怪しげなWebサイトを使ってダウンロードする方法もありますが、Pythonなら無料かつ安全にYouTube動画がダウンロードできます。
しかも、YouTubeに限らず、その他数多くのストリーミングサイトからもダウンロードできてしまいます。
とっても簡単なんで、興味のある方は是非ご活用下さい。
利用するライブラリは yt_dlp と ffmpeg
yt-dlp は YouTubeをはじめとするストリーミング動画をダウンロードするライブラリ、ffmpeg は動画を編集するためのライブラリで、今回はこの2つを利用します。
yt-dlp は、YouTube動画のダウンロードライブラリとして有名な「youtube-dl」 のソースコードをコピーし、不具合改修や機能追加を行ったものです。
一方、ffmpeg は、ビデオ、オーディオ、その他のマルチメディアファイルの再生、フォーマット変換、分割や結合などの編集などを行うためのものです。
どちらもEXEファイルが用意されており、コマンドプロンプト(DOS窓)から実行して使用するのですが、Pythonから容易に呼び出せるためのライブラリも用意されています。
Pythonから呼び出すことにより、自分が使いやすい画面(UI)を作ったり、特定の条件に合致する動画をまとめてダウンロードするなど、アイデア次第で様々なことができるようになります。
dlpに関する仕様 | https://github.com/yt-dlp/yt-dlp/blob/2021.12.01/README.md |
---|---|
ffmpegに関する仕様 | https://ffmpeg.org/documentation.html |
事前準備
yt-dlp が利用できるOSは、Linux、Windows、MacOSの3種類で、Pythonは 3.7以上に対応しています。
事前準備は、yt-dlpとffmpegを続けてインストールするだけです。
yt-dlpのインストール
yt-dlp をインストールするのはすごく簡単で、 下記の1行を実行するだけです。
pip install yt-dlp
注意点としては、YouTubeの仕様が変わることで、YouTube動画がダウンロードできなくなる可能性があります。
この場合は、yt-dlp の開発者が対応してくれるまで待たなければなりません。
対応版がリリースされたら、以下のコマンドでアップグレードして下さい。
pip install --upgrade yt-dlp
次に、ffmpeg をインストールします。
こちらは yt-dlp より少し面倒ですが、公式サイトからZIPファイルをダウンロードし、任意のフォルダに解凍後、そこに環境変数のパスを通せば完了です。
まず公式サイトから 「ffmpeg-master-latest-win64-gpl-shared.zip」をダウンロードします。
ffmpeg-master-latest-win64-gpl-shared.zip を任意のフォルダに解答して、bin フォルダを環境変数に登録します。
尚、後ほど紹介するサンプルプログラムではプログラム中から環境変数を登録しているので、上記の作業は必須ではありません。
以上で準備は完了です。
簡単なサンプルの紹介
ダウンロードの方法は簡単で、たった3行で完了します。
1 2 3 |
from yt_dlp import YoutubeDL ydl = YoutubeDL() result = ydl.download(['https://www.youtube.com/watch?v=7G0ovtPqHnI']) |
ダウンロード対象の動画は、donwnloadメソッドの引数として、リスト形式で渡します。
ydl.download([url1,url2,url3,・・・])
つまり、一度に複数の動画をまとめてダウンロードできます。
注意事項としては、オプションを何も指定しない場合は、音声が含まれている動画の中から、動画と音声の品質が一番良い動画がダウンロードされるという点です。
YouTubeでは多くの場合、最高品質の動画と最高品質の音声は、それぞれ別ファイルとしてアップロードされています。このため、仮に4K動画がアップロードされていても、音声品質が高くなければ1ランク下の動画が選択されることになります
また、ファイルは場所はユーザーフォルダの直下にダウンロードされていまいます。
オプションの指定方法
yt-dlpには数多くのオプションが用意されていますが、いずれも辞書型で指定します。
1 2 3 4 |
option = { 'outtmpl' : 'C:/Users/hoge/Videos/mov/%(title)s.%(ext)s', 'format' : 'bestaudio/best' } |
outtmpl | 出力ファイル名のテンプレート。 出力先フォルダを指定したい場合は、ここに記述する。 %(title)s → 動画ファイルのタイトル %(ext)s → 動画ファイルの拡張子 %(upload_date)s → アップロード日 %(id)s → 動画ID その他のテンプレートについては、こちらの公式ページに記載されています。 |
---|---|
format | ダウンロード対象(動画、音声)の指定 'best' → 動画と音声の両方が含まれる中での最高画質(デフォルト) 'bestvideo' → 音声が含まれていない最高品質の動画(無い場合はエラー) 'bestaudio' → 動画が含まれていない最高品質の音声(無い場合はエラー) 'bestvideo/best' → 音声の有無に関わらず最高品質の動画 'bestaudio/best' → 音声の有無に関わらず最高音質の音声を抜き出す 'bestvideo+bestaudio/best' → 最高品質の動画と最高品質の音声をダウンロード後に結合 その他のオプションについては、こちらの公式ページに記載されています。 |
高画質で動画をダウンロードする
高画質でダウンロードする場合、動画と音声のそれぞれについて、最高品質のものを個別にダウンロードした後で、結合する必要があります。
つまり、この結合を行うために、ffmpeg が必要になります。結合は ffmpeg 以外のツールを利用することも可能ですが、ffmpeg をインストールしておけば、yt_dlp が自動的に結合してくれるので便利です。
以上のことを踏まえて書き直したプログラムは次のようになります。
ここでは、ffmpeg-master-latest-win64-gpl-shared を解凍して取り出したbinフォルダの中身を 'C:/Users/hoge/ffmpeg-win64/bin' に格納したことを想定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import os from yt_dlp import YoutubeDL # ffmpegのbinフォルダを環境変数に登録する(既に環境変数に登録済みなら、この処理は不要) path = 'C:/Users/hoge/ffmpeg-win64/bin' os.environ['PATH'] += '' if path in os.environ['PATH'] else ';' + path #オプションを指定(最高画質の動画と最高音質の音声を取り出し結合するためのオプション) option = { 'outtmpl' : 'C:/Users/hoge/Videos/mov/%(title)s.%(ext)s', 'format' : 'bestvideo+bestaudio/best' } #インスタンスの生成 ydl = YoutubeDL(option) #ダウンロードの実行 result = ydl.download(['https://www.youtube.com/watch?v=7G0ovtPqHnI']) |
動画の一覧を取得する
YouTubeのURLにアップロードされている動画の一覧は、オプションに 'listformats' : True を設定し、extract_infoメソッドを呼ぶことで取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#オプションを指定(動画一覧を取得するためのオプション) option = { 'listformats' : True } #インスタンスの生成 ydl = YoutubeDL(option) #動画一覧を取得 video_list = ydl.extract_info(['https://www.youtube.com/watch?v=7G0ovtPqHnI'], download=False) #取得した情報を表示 for video in video_list['formats']: print( video['format_id'], video['ext'], video['resolution'], video['fps'], video['protocol'], video['vcodec'], video['acodec'], video['aspect_ratio'] ) |
ydl.extract_infoメソッドを実行すると、コンソールに以下の内容が出力されます。
戻り値を video_list に受けていますが、コンソールに出力された内容がすべて取得できるのではなく、一部の項目のみとなっています。
下記が video_list の内容をprintした結果(一例)です。
IDを指定してダウンロードする
取得した動画一覧に含まれるフォーマットID (format_id)を使って、動画をダウンロードすることも可能です。
この場合、'format' オプションにフォーマットIDを指定します。
1 2 3 4 5 6 7 8 9 10 11 12 |
#オプションを指定(format_id=400) option = { 'outtmpl' : 'C:/Users/hoge/Videos/mov/%(title)s.%(ext)s', 'format': '400' } #インスタンスの生成 ydl = YoutubeDL(option) #動画一覧を取得 ydl = YoutubeDL(option) result = ydl.download(['https://www.youtube.com/watch?v=7G0ovtPqHnI']) |
指定したフォーマットIDの動画を直接ダウンロードしに行くのではなく、アップロードされている全ての動画を1つづつチェックし、該当するフォーマットID(今回は400を指定)が見つかった時点でダウンロードを開始するという動作になります。
更に、ダウンロードが終わった後も最後までフォーマットIDのチェックが行われるため、少々時間が掛かります。
下記は、途中経過の画面キャプチャです。
動画から音声のみを抜き出してMP3で保存する
動画ファイルから音声だけを取り出し、mp3 形式でダウンロードすることも可能です。
多くの場合、最高品質の音声は webm 形式で保存されています。ポータブルプレーヤーやスマホで扱いやす mp3 に変換する場合、オプションに以下の内容を記述します。
'preferredcodec' で音声ファイルのフォーマットを、'preferredquality' でビットレートを指定できますが、ビットレートを上げたからと言って、元の音声の音質が上がる事はありません。
単にデータ容量が増えるだけなので、元のビットレートを超えないように指定して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#オプションを指定(最高音質の音声をmp3形式でダウンロードする) option = { 'outtmpl' : '%(title)s.%(ext)s', 'format': 'bestaudio/best', 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', #変換したい形式を指定 'preferredquality': '192' #ビットレートを指定 }] } #インスタンスの生成 ydl = YoutubeDL(option) #動画一覧を取得 ydl = YoutubeDL(option) result = ydl.download(['https://www.youtube.com/watch?v=7G0ovtPqHnI']) |
まとめ
今回は、YouTubeをダウンロードするために ft_dlpを、ダウンロードした動画と音声を結合するために ffmpeg を使って、YouTubeから最高品質の画質、音声を持つ動画をダウンロードする方法を紹介しました。
ft_dlpは 、更新がほとんどされなくなった「youtube-dl」 の フォーク(=元のプログラムソースに不具合修正や機能追加を行ったもの)として、現在も活発に改善が行われています。
これまでYouTubeの動画をダウンロードするといえば、数千円~数万円のストリーミングダウンロードツールを購入するか、YouTube動画ダウンロード専用の海外Webサイトを使う方法が一般的でした。
しかし、ft_dlpとffmpeg を組み合わせれば、同じことが無料かつ簡単に出来てしまいます。
それぞれ単独のEXEとしても利用可能ではありますが、Pythonから簡単に呼び出せるので、かゆいところに手が届くプログラムが自作できます。
これを機に、ぜひ挑戦してみてください。
コメント