mei_13のPython講座 ロゴ

【解説】Pythonで動画を自在に扱う:yt-dlpの基本から応用までの実践ガイド




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

Pythonで動画を自在に扱う:yt-dlpの基本から応用までの実践ガイド


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。今日はPythonを使って動画の情報を取得したり、保存したりすることができる非常に強力なライブラリ、yt-dlpについて一緒に学んでいこうと思います。 少し難しい分野に聞こえるかもしれませんが、実はとても奥が深くて、一度覚えるとエンジニアとしての幅がぐっと広がるライブラリなんです。


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは!動画を扱うライブラリですか。以前、何かで「youtube-dl」という名前を聞いたことがある気がするのですが、それとは違うものなんですか?


Yukiのアイコン
【Yuki】 ええ、鋭いですね。yt-dlpは、もともとあった「youtube-dl」というプロジェクトから派生(フォーク)して生まれたライブラリなんです。 現在、本家のyoutube-dlは更新が停滞気味なのですが、yt-dlpは有志の手によって頻繁にアップデートされています。 新しい動画サイトへの対応や、ダウンロード速度の向上、新機能の追加などが積極的に行われているので、今から使うならyt-dlp一択だと言ってもいいかもしれません。


Hirokiのアイコン
【Hiroki】 なるほど、進化版ということなんですね。Python初心者でも使えるでしょうか?


Yukiのアイコン
【Yuki】 大丈夫ですよ。基本的な使い方はとてもシンプルですし、一つずつ丁寧に解説しますね。 まずは、環境構築から始めましょう。

yt-dlpとFFmpegの導入


Yukiのアイコン
【Yuki】 yt-dlpを使うには、まずライブラリ本体をインストールする必要があります。ターミナルやコマンドプロンプトで以下のコマンドを実行してみてください。

pip install yt-dlp


Hirokiのアイコン
【Hiroki】 インストールできました!これだけで準備完了ですか?


Yukiのアイコン
【Yuki】 実は、もう一つ大切なツールがあるんです。それがFFmpegです。 yt-dlpは動画のダウンロードはできますが、最高画質で保存するために映像と音声を合成したり、動画をMP3などの音声ファイルに変換したりする際には、背後でこのFFmpegというツールを利用します。


Hirokiのアイコン
【Hiroki】 FFmpeg……聞いたことがあります。動画編集の魔法のツールみたいなやつですよね。


Yukiのアイコン
【Yuki】 ふふ、そうですね。非常に多機能なツールです。お使いのOSに合わせて、公式サイトやパッケージマネージャー(Homebrewなど)からインストールしておいてください。 準備ができたら、まずはPythonを使わずに、コマンドラインから軽く動作確認をしてみましょうか。

yt-dlp -F [動画のURL]


Yukiのアイコン
【Yuki】 このコマンドを実行すると、その動画で利用可能な画質や形式(フォーマット)の一覧が表示されます。これを見るだけでも、その動画がどんな構成になっているかわかって面白いですよ。

Pythonプログラムからyt-dlpを呼び出す


Hirokiのアイコン
【Hiroki】 コマンドでも動くんですね!でも、せっかくなのでPythonのプログラムの中から制御してみたいです。


Yukiのアイコン
【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のアイコン
【Hiroki】 わあ、これだけで動画のタイトルとかが取得できるんですね!extract_infoという関数が鍵なんですか?


Yukiのアイコン
【Yuki】 その通りです。extract_infoで返ってくるinfoは巨大な辞書(dict)型になっていて、そこには動画のサムネイルURL、投稿日、タグ、説明文など、ありとあらゆるメタデータが含まれています。 誰かの役に立つために開発された小さなツールの積み重ねが、この一つの辞書に詰まっているような気がして、わたしはこういうデータ構造を見るのが少し好きだったりします。


Hirokiのアイコン
【Hiroki】 確かに、情報がぎっしり詰まっていてすごいですね。次は、実際に動画をダウンロードする方法を教えてください!

詳細なオプション設定:品質指定とフォーマット


Yukiのアイコン
【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のアイコン
【Hiroki】 'format': 'bestvideo+bestaudio/best' という書き方が少し独特ですね。


Yukiのアイコン
【Yuki】 そうなんです。これは「最高のビデオと最高のオーディオを合体させて、もしそれが無理なら単体で最高のファイルを選んでください」という指示なんです。 outtmpl(アウトプット・テンプレート)を使えば、保存するファイル名に動画タイトルや投稿日を自動的に含めることもできます。 夜、静かな時間にたくさんの動画を整理したいときなどは、このテンプレート機能がとても重宝すると思いますよ。


Hirokiのアイコン
【Hiroki】 なるほど!自分の好きなルールでファイル名を決められるのは便利ですね。 ところで、音声だけを抜き出してMP3で保存することはできますか?

音声の抽出とポストプロセッサ


Yukiのアイコン
【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のアイコン
【Hiroki】 postprocessorsの中に設定を書くんですね。 これを使えば、動画から音楽プレイヤー用のファイルを作るのも自動化できそうです。


Yukiのアイコン
【Yuki】 ええ、その通りです。ただ、変換には少しCPUのパワーを使うので、パソコンが一生懸命頑張っている音が聞こえてくるかもしれません。 わたしも、冬の寒い時期にPCが熱を持っているのを見ると、少しだけ親近感が湧いたりします……。


Hirokiのアイコン
【Hiroki】 あはは、PCも頑張ってるってことですね。 他にはどんな設定ができるんですか?

ログ出力とプログレスバーのカスタマイズ


Yukiのアイコン
【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のアイコン
【Hiroki】 これを設定すれば、独自のプログレスバーを作ったり、GUIアプリに組み込んだりすることもできそうですね!


Yukiのアイコン
【Yuki】 その通りです。Hirokiくん、飲み込みが早いですね。 この辞書の中身を詳しく知りたいときは、公式のドキュメントを眺めてみるのが一番です。

yt-dlp GitHub - Embedding yt-dlp


Yukiのアイコン
【Yuki】 ここには、指定できるすべてのオプションが網羅されています。 英語のドキュメントなので少し圧倒されるかもしれませんが、コード例を中心に見ていけば、きっと理解できるはずですよ。

エラーハンドリングの重要性


Hirokiのアイコン
【Hiroki】 Yukiさん、使ってみたのですが、時々エラーで止まってしまうことがあります。動画が削除されていたり、非公開だったりする場合でしょうか?


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のアイコン
【Yuki】 DownloadErrorを個別にキャッチするようにすると、何が原因で失敗したのかをユーザーに優しく伝えることができます。 プログラムも人間関係と同じで、何か問題が起きたときにどう振る舞うかが、信頼性に繋がるのだと思います。


Hirokiのアイコン
【Hiroki】 「プログラムも人間関係と同じ」……深いですね。確かに、エラーでいきなり終了しちゃうと悲しい気持ちになります。

利用上の注意点と倫理


Yukiのアイコン
【Yuki】 最後に、技術的なことと同じくらい大切なことをお話ししますね。 yt-dlpは非常に強力なツールですが、それゆえに使い手には責任が求められます。


Hirokiのアイコン
【Hiroki】 責任、ですか。


Yukiのアイコン
【Yuki】 はい。まず、各動画プラットフォームの利用規約を必ず守ってください。 多くの場合、公式が認めていない方法でのダウンロードは規約で制限されています。 また、著作権を侵害するような使い方は絶対にしてはいけません。


Hirokiのアイコン
【Hiroki】 自分が楽しむためだけだとしても、ルールは守らないといけないですね。


Yukiのアイコン
【Yuki】 そうです。また、短時間に大量のアクセスを行うと、相手側のサーバーに大きな負荷をかけてしまいます。 最悪の場合、あなたのIPアドレスがブロックされるだけでなく、法的な問題に発展する可能性もあります。 プログラムを書くときは、常に「相手(サーバー)への思いやり」を忘れないようにしてくださいね。


Hirokiのアイコン
【Hiroki】 わかりました。相手への思いやりを持って、正しく使いたいと思います。


Yukiのアイコン
【Yuki】 ええ、その心がけがあれば大丈夫だと思います。 yt-dlpは、正しく使えばデータ分析や個人的なアーカイブ作成に、これ以上ないほど便利なツールです。 もし何かわからないことがあれば、またいつでも聞いてくださいね。


Hirokiのアイコン
【Hiroki】 ありがとうございます!まずは簡単な動画情報の抽出から、いろいろ試してみようと思います。


Yukiのアイコン
【Yuki】 頑張ってくださいね。わたしも夜、静かな時間に新しいライブラリを調べるのが好きなので、Hirokiくんの挑戦を応援しています。 それでは、今日の講義はここまでです。お疲れ様でした。


Hirokiのアイコン
【Hiroki】 お疲れ様でした、Yukiさん!


参考資料: - yt-dlp GitHub Repository - FFmpeg Official Website



< 音声処理
コラム一覧に戻る
組み込み開発 >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

● プログラミング未経験者・初心者歓迎!
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki