(1時間4,000円の伴走型ビデオチャット指導も受付中!)
Pythonで動画を自在に扱う:yt-dlpの基本から応用までの実践ガイド
![]()
【Yuki】
Hirokiくん、こんにちは。今日はPythonを使って動画の情報を取得したり、保存したりすることができる非常に強力なライブラリ、yt-dlpについて一緒に学んでいこうと思います。
少し難しい分野に聞こえるかもしれませんが、実はとても奥が深くて、一度覚えるとエンジニアとしての幅がぐっと広がるライブラリなんです。
![]()
【Hiroki】
Yukiさん、こんにちは!動画を扱うライブラリですか。以前、何かで「youtube-dl」という名前を聞いたことがある気がするのですが、それとは違うものなんですか?
![]()
【Yuki】
ええ、鋭いですね。yt-dlpは、もともとあった「youtube-dl」というプロジェクトから派生(フォーク)して生まれたライブラリなんです。
現在、本家のyoutube-dlは更新が停滞気味なのですが、yt-dlpは有志の手によって頻繁にアップデートされています。
新しい動画サイトへの対応や、ダウンロード速度の向上、新機能の追加などが積極的に行われているので、今から使うならyt-dlp一択だと言ってもいいかもしれません。
![]()
【Hiroki】
なるほど、進化版ということなんですね。Python初心者でも使えるでしょうか?
![]()
【Yuki】
大丈夫ですよ。基本的な使い方はとてもシンプルですし、一つずつ丁寧に解説しますね。
まずは、環境構築から始めましょう。
yt-dlpとFFmpegの導入
![]()
【Yuki】
yt-dlpを使うには、まずライブラリ本体をインストールする必要があります。ターミナルやコマンドプロンプトで以下のコマンドを実行してみてください。
pip install yt-dlp
![]()
【Hiroki】
インストールできました!これだけで準備完了ですか?
![]()
【Yuki】
実は、もう一つ大切なツールがあるんです。それがFFmpegです。
yt-dlpは動画のダウンロードはできますが、最高画質で保存するために映像と音声を合成したり、動画をMP3などの音声ファイルに変換したりする際には、背後でこのFFmpegというツールを利用します。
![]()
【Hiroki】
FFmpeg……聞いたことがあります。動画編集の魔法のツールみたいなやつですよね。
![]()
【Yuki】
ふふ、そうですね。非常に多機能なツールです。お使いのOSに合わせて、公式サイトやパッケージマネージャー(Homebrewなど)からインストールしておいてください。
準備ができたら、まずはPythonを使わずに、コマンドラインから軽く動作確認をしてみましょうか。
yt-dlp -F [動画のURL]
![]()
【Yuki】
このコマンドを実行すると、その動画で利用可能な画質や形式(フォーマット)の一覧が表示されます。これを見るだけでも、その動画がどんな構成になっているかわかって面白いですよ。
Pythonプログラムからyt-dlpを呼び出す
![]()
【Hiroki】
コマンドでも動くんですね!でも、せっかくなのでPythonのプログラムの中から制御してみたいです。
![]()
【Yuki】
そうですよね。Pythonから使う場合は、yt_dlpモジュールをインポートして利用します。
まずは、最もシンプルな「動画の情報を取得するだけ」のコードを書いてみましょう。
import yt_dlp
def get_video_info(url):
# オプションの設定
ydl_opts = {}
# YoutubeDLオブジェクトを作成
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
# 動画情報の抽出(download=Falseにすることで、情報を取るだけで保存はしません)
info = ydl.extract_info(url, download=False)
# タイトルや再生回数などを表示
print(f"タイトル: {info.get('title')}")
print(f"チャンネル名: {info.get('uploader')}")
print(f"再生回数: {info.get('view_count')}")
video_url = "https://www.youtube.com/watch?v=example"
get_video_info(video_url)
![]()
【Hiroki】
わあ、これだけで動画のタイトルとかが取得できるんですね!extract_infoという関数が鍵なんですか?
![]()
【Yuki】
その通りです。extract_infoで返ってくるinfoは巨大な辞書(dict)型になっていて、そこには動画のサムネイルURL、投稿日、タグ、説明文など、ありとあらゆるメタデータが含まれています。
誰かの役に立つために開発された小さなツールの積み重ねが、この一つの辞書に詰まっているような気がして、わたしはこういうデータ構造を見るのが少し好きだったりします。
![]()
【Hiroki】
確かに、情報がぎっしり詰まっていてすごいですね。次は、実際に動画をダウンロードする方法を教えてください!
詳細なオプション設定:品質指定とフォーマット
![]()
【Yuki】
動画をダウンロードする場合は、先ほどのydl_optsという辞書にさまざまな設定を書き込んでいきます。
例えば、「一番いい画質と一番いい音質を組み合わせて、MP4形式で保存したい」という場合は、次のように書きます。
import yt_dlp
def download_video(url):
ydl_opts = {
# フォーマットの指定(最高画質の映像 + 最高画質の音声)
'format': 'bestvideo+bestaudio/best',
# 出力ファイル名のテンプレート
'outtmpl': '%(title)s.%(ext)s',
# マージ(合成)する際のコンテナ形式
'merge_output_format': 'mp4',
}
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
print("ダウンロードが完了しました。")
except Exception as e:
print(f"エラーが発生しました: {e}")
video_url = "https://www.youtube.com/watch?v=example"
download_video(video_url)
![]()
【Hiroki】
'format': 'bestvideo+bestaudio/best' という書き方が少し独特ですね。
![]()
【Yuki】
そうなんです。これは「最高のビデオと最高のオーディオを合体させて、もしそれが無理なら単体で最高のファイルを選んでください」という指示なんです。
outtmpl(アウトプット・テンプレート)を使えば、保存するファイル名に動画タイトルや投稿日を自動的に含めることもできます。
夜、静かな時間にたくさんの動画を整理したいときなどは、このテンプレート機能がとても重宝すると思いますよ。
![]()
【Hiroki】
なるほど!自分の好きなルールでファイル名を決められるのは便利ですね。
ところで、音声だけを抜き出してMP3で保存することはできますか?
音声の抽出とポストプロセッサ
![]()
【Yuki】
もちろんです。その場合は、ポストプロセッサ(Post-processor)という機能を使います。
ダウンロードが終わった後に、FFmpegを使ってファイルを変換する処理のことですね。
import yt_dlp
def download_audio(url):
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3', # 形式をMP3に
'preferredquality': '192', # ビットレートを指定
}],
'outtmpl': '%(title)s.%(ext)s',
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
video_url = "https://www.youtube.com/watch?v=example"
download_audio(video_url)
![]()
【Hiroki】
postprocessorsの中に設定を書くんですね。
これを使えば、動画から音楽プレイヤー用のファイルを作るのも自動化できそうです。
![]()
【Yuki】
ええ、その通りです。ただ、変換には少しCPUのパワーを使うので、パソコンが一生懸命頑張っている音が聞こえてくるかもしれません。
わたしも、冬の寒い時期にPCが熱を持っているのを見ると、少しだけ親近感が湧いたりします……。
![]()
【Hiroki】
あはは、PCも頑張ってるってことですね。
他にはどんな設定ができるんですか?
ログ出力とプログレスバーのカスタマイズ
![]()
【Yuki】
実用的なプログラムを作るなら、今どれくらいダウンロードが進んでいるかを知りたくなりますよね。
yt-dlpには、進行状況を監視するための「フック」という仕組みがあります。
def my_hook(d):
if d['status'] == 'downloading':
# ダウンロード中の情報を表示
p = d.get('_percent_str', '0%')
speed = d.get('_speed_str', 'N/A')
print(f"進行状況: {p} 速度: {speed}")
elif d['status'] == 'finished':
print("ダウンロード完了!ファイルを変換中です...")
ydl_opts = {
'progress_hooks': [my_hook],
}
![]()
【Hiroki】
これを設定すれば、独自のプログレスバーを作ったり、GUIアプリに組み込んだりすることもできそうですね!
![]()
【Yuki】
その通りです。Hirokiくん、飲み込みが早いですね。
この辞書の中身を詳しく知りたいときは、公式のドキュメントを眺めてみるのが一番です。
yt-dlp GitHub - Embedding yt-dlp
![]()
【Yuki】
ここには、指定できるすべてのオプションが網羅されています。
英語のドキュメントなので少し圧倒されるかもしれませんが、コード例を中心に見ていけば、きっと理解できるはずですよ。
エラーハンドリングの重要性
![]()
【Hiroki】
Yukiさん、使ってみたのですが、時々エラーで止まってしまうことがあります。動画が削除されていたり、非公開だったりする場合でしょうか?
![]()
【Yuki】
そうですね。ネットワークの不安定さや、動画側の制限などでエラーは必ず発生します。
ですので、実際に運用するコードでは、しっかりと例外処理を組み込むことが大切です。
from yt_dlp.utils import DownloadError
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
except DownloadError as e:
print(f"ダウンロードに失敗しました。URLが正しいか確認してください: {e}")
except Exception as e:
print(f"予期しないエラーが発生しました: {e}")
![]()
【Yuki】
DownloadErrorを個別にキャッチするようにすると、何が原因で失敗したのかをユーザーに優しく伝えることができます。
プログラムも人間関係と同じで、何か問題が起きたときにどう振る舞うかが、信頼性に繋がるのだと思います。
![]()
【Hiroki】
「プログラムも人間関係と同じ」……深いですね。確かに、エラーでいきなり終了しちゃうと悲しい気持ちになります。
利用上の注意点と倫理
![]()
【Yuki】
最後に、技術的なことと同じくらい大切なことをお話ししますね。
yt-dlpは非常に強力なツールですが、それゆえに使い手には責任が求められます。
![]()
【Hiroki】
責任、ですか。
![]()
【Yuki】
はい。まず、各動画プラットフォームの利用規約を必ず守ってください。
多くの場合、公式が認めていない方法でのダウンロードは規約で制限されています。
また、著作権を侵害するような使い方は絶対にしてはいけません。
![]()
【Hiroki】
自分が楽しむためだけだとしても、ルールは守らないといけないですね。
![]()
【Yuki】
そうです。また、短時間に大量のアクセスを行うと、相手側のサーバーに大きな負荷をかけてしまいます。
最悪の場合、あなたのIPアドレスがブロックされるだけでなく、法的な問題に発展する可能性もあります。
プログラムを書くときは、常に「相手(サーバー)への思いやり」を忘れないようにしてくださいね。
![]()
【Hiroki】
わかりました。相手への思いやりを持って、正しく使いたいと思います。
![]()
【Yuki】
ええ、その心がけがあれば大丈夫だと思います。
yt-dlpは、正しく使えばデータ分析や個人的なアーカイブ作成に、これ以上ないほど便利なツールです。
もし何かわからないことがあれば、またいつでも聞いてくださいね。
![]()
【Hiroki】
ありがとうございます!まずは簡単な動画情報の抽出から、いろいろ試してみようと思います。
![]()
【Yuki】
頑張ってくださいね。わたしも夜、静かな時間に新しいライブラリを調べるのが好きなので、Hirokiくんの挑戦を応援しています。
それでは、今日の講義はここまでです。お疲れ様でした。
![]()
【Hiroki】
お疲れ様でした、Yukiさん!
参考資料: - yt-dlp GitHub Repository - FFmpeg Official Website
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

