はじめに
普段ならFedoraを使うところだが、(体感)利用者の多そうな AlmaLinux 10 でできないかやってみる。
Fedora 向けの手順をそのまま AlmaLinux で実行しようとすると、パッケージが見つからなかったり、バージョンによってはPython のバージョンが合わなかったりと、何かとつまずくことがあった。
というわけで、今回は AlmaLinux 10 で FFmpeg と yt-dlp を導入し、YouTube の動画を MP4 形式で保存するまでの手順をまとめる。
実際に試して引っかかった箇所と、その解決方法も紹介していく。
なお、実際に利用する際は、著作権法やYouTubeの利用規約、権利者の許諾などを確認してほしい。
1. 検証環境
今回使用した環境は以下のとおり。
- OS:AlmaLinux 10.2
- カーネル:6.12.0-211.7.3.el10_2.x86_64
- 動画ダウンロードツール:yt-dlp
- 動画・音声の処理:FFmpeg
まずは OS とカーネルのバージョンを確認する。
[root@youtubedownloader ~]# cat /etc/almalinux-release
AlmaLinux release 10.2 (Lavender Lion)
[root@youtubedownloader ~]# uname -r
6.12.0-211.7.3.el10_2.x86_64
2. FFmpeg をインストールする
2.1. なぜ FFmpeg が必要なのか
YouTubeでは動画を取得する際に映像と音声が別々のデータとして配信されるので、ダウンロードする場合、映像と音声を1つのファイルに結合する必要がある。
また、音声の変換などにも FFmpeg を利用できる。
そこで、まずは FFmpeg をインストールしていく。
2.2. 標準リポジトリからインストールできるか確認する
最初に、通常どおり DNF でインストールを試みた。
[root@youtubedownloader ~]# dnf install ffmpeg
メタデータの期限切れの最終確認: 4:00:19 前の 2026年10月24日 18時21分01秒 に実施しました。
引数に一致する結果がありません: ffmpeg
エラー: 一致するものが見つかりません: ffmpeg
残念ながら、パッケージが見つからない。
そこで、EPEL と CRB を利用できるようにしたうえで、RPM Fusion のリポジトリを追加する。
2.3. EPEL を追加する
まずは EPEL のリリースパッケージをインストールする。
[root@youtubedownloader ~]# dnf install epel-release
実行時には epel-release のほか、依存関係として SELinux 関連のパッケージもインストールされた。
インストール:
epel-release
依存関係のインストール:
selinux-policy-targeted-extra
弱い依存関係のインストール:
selinux-policy-extra
完了しました!
実際の出力では、EPEL 10 用のパッケージが導入されていることを確認できた。
2.4. RPM Fusion を追加する
次に、RPM Fusion の Free リポジトリを追加する。
以下のコマンドでは、現在の RHEL 互換 OS のメジャーバージョンを rpm -E %rhel で取得している。
[root@youtubedownloader ~]# dnf install --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm
実行時には rpmfusion-free-release がインストールされた。
インストール:
rpmfusion-free-release
完了しました!
注意: 上記のコマンドでは GPG 署名の検証を無効にしている。セキュリティを重視する環境では、署名を無効にする必要性を確認し、可能な限り署名を検証できる方法で導入することを推奨する。
2.5. リポジトリのメタデータを更新する
リポジトリを追加したら、メタデータを更新する。
[root@youtubedownloader ~]# dnf makecache
AlmaLinux 10 - AppStream
AlmaLinux 10 - BaseOS
AlmaLinux 10 - CRB
AlmaLinux 10 - Extras
Extra Packages for Enterprise Linux 10 - x86_64
RPM Fusion for EL 10 - Free - Updates
メタデータキャッシュを作成しました。
出力に RPM Fusion のリポジトリが表示されていれば、追加したリポジトリが認識されていることを確認できる。
2.6. FFmpeg をインストールする
準備ができたので、改めて FFmpeg をインストールする。
[root@youtubedownloader ~]# dnf install ffmpeg
今回はパッケージが見つかり、インストールが進んだ。
インストール:
ffmpeg 7.1.5-1.el10
トランザクションの概要
インストール 208 パッケージ
完了しました!
これで FFmpeg の準備は完了。
3. yt-dlp をインストールする
3.1. GitHub の公式リリースから取得する
次に、YouTube から動画を取得するための yt-dlp を導入する。
Fedora では dnf install yt-dlp でインストールできる場合があるが、パッケージの提供状況は OS のバージョンや有効化しているリポジトリによって異なる。
今回は DNF からインストールする方法ではなく、yt-dlp の GitHub 公式リリースから実行ファイルを直接取得する方法を採用した。
[root@youtubedownloader ~]# curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
ダウンロードが完了したら、実行権限を付与する。
[root@youtubedownloader ~]# chmod a+rx /usr/local/bin/yt-dlp
3.2. バージョンを確認する
インストールできたかどうか、バージョンを確認する。
[root@youtubedownloader ~]# yt-dlp --version
2026.10.21
このようにバージョンが表示されれば OK。
今回取得したバージョンは 2026.10.21 だった。
yt-dlp は YouTube 側の仕様変更などによって、以前は動作していたコマンドが突然失敗することもある。その場合は、まず yt-dlp を最新版に更新してみる。
公式の実行ファイルを使用している場合は、次のコマンドで更新できる。
[root@youtubedownloader ~]# yt-dlp -U
※ 更新機能が利用できる配布形態であることを前提とする。利用中のバージョンで更新できない場合は、公式リリースから新しい実行ファイルを取得する。
4. FFmpeg が認識されているか確認する
yt-dlp が FFmpeg を認識しているか確認する。
-v オプションを指定すると、デバッグ情報が表示される。
[root@youtubedownloader ~]# yt-dlp -v
今回の環境では、次のような情報が出力された。
[debug] Command-line config: ['-v']
[debug] Encodings: locale UTF-8, fs utf-8, pref utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2026.10.21 from yt-dlp/yt-dlp [8cdf4fea4] (zip)
[debug] Python 3.12.13 (CPython x86_64 64bit) - Linux-6.12.0-211.7.3.el10_2.x86_64-x86_64-with-glibc2.39
[debug] exe versions: ffmpeg 7.1.5 (setts), ffprobe 7.1.5
[debug] Optional libraries: requests-2.32.4, sqlite3-3.46.1, urllib3-1.26.19 (unsupported), yt_dlp_ejs-0.8.0
[debug] JS runtimes: none
[debug] Proxy map: {}
[debug] Request Handlers: urllib
[debug] Plugin directories: none
[debug] Loaded 1747 extractors
このうち、確認したいのは次の行。
[debug] exe versions: ffmpeg 7.1.5 (setts), ffprobe 7.1.5
FFmpeg と ffprobe のバージョンが表示されているので、yt-dlp から両者を認識できていることがわかる。
なお、URL を指定せずに yt-dlp -v を実行したため、最後には URL が必要だというエラーも表示される。
Usage: yt-dlp [OPTIONS] URL [URL...]
yt-dlp: error: You must provide at least one URL.
Type yt-dlp --help to see a list of all options.
これは URL を指定していないことによるエラーであり、上記のデバッグ情報が取得できていれば、FFmpeg の認識確認自体はできている。
5. 実際に動画をダウンロードしてみる
ここまで準備できたので、実際に動画をダウンロードしてみる。
今回はテストとして、YouTube の動画 URL を指定して実行した。
[root@youtubedownloader ~]# yt-dlp 'https://www.youtube.com/watch?v=RE_AlDzUgMM'
実行すると、次のようなログが出力された。
[youtube] Extracting URL: https://www.youtube.com/watch?v=RE_AlDzUgMM
[youtube] RE_AlDzUgMM: Downloading webpage
WARNING: [youtube] No supported JavaScript runtime could be found. Only deno is enabled by default; to use another runtime add --js-runtimes RUNTIME[:PATH] to your command/config. YouTube extraction without a JS runtime has been deprecated, and some formats may be missing.
[youtube] RE_AlDzUgMM: Downloading visionos player API JSON
[youtube] RE_AlDzUgMM: Downloading m3u8 information
[info] RE_AlDzUgMM: Downloading 1 format(s): 401+251
[download] Destination: 動画タイトル [RE_AlDzUgMM].f401.mp4
[download] 100% of 143.99MiB in 00:00:17 at 8.12MiB/s
[download] Destination: 動画タイトル [RE_AlDzUgMM].f251.webm
[download] 100% of 10.22MiB in 00:00:01 at 6.32MiB/s
[Merger] Merging formats into "動画タイトル [RE_AlDzUgMM].webm"
※ 動画タイトルなど、一部の表示は読みやすさのために省略している。実際にはタイトルを含むファイル名が表示される。
5.1. 映像と音声が別々にダウンロードされる
ログを見ると、映像と音声がそれぞれ別のファイルとしてダウンロードされていることがわかる。
[download] Destination: 動画タイトル [RE_AlDzUgMM].f401.mp4
[download] Destination: 動画タイトル [RE_AlDzUgMM].f251.webm
その後、次のログが表示された。
[Merger] Merging formats into "動画タイトル [RE_AlDzUgMM].webm"
これは、取得した映像と音声を FFmpeg で結合していることを示している。
結合後は、通常、元の一時ファイルが削除される。
今回のケースでは最終的なファイルが .webm 形式になった。
高画質で動画を取得できても、必ずしも MP4 形式で保存されるわけではない点に注意したい。
5.2. JavaScript ランタイムの警告について
今回の実行では、次の警告も表示された。
WARNING: [youtube] No supported JavaScript runtime could be found.
これは、yt-dlp が利用可能な JavaScript ランタイムを検出できなかったことを示している。
今回の環境では警告が出た状態でも動画の取得には成功したが、取得可能な形式が制限されたり、今後の仕様変更で正常に取得できなくなったりする可能性がある。
そのため、動画を取得できたからといって、この警告を無視してよいとは限らない。
必要に応じて、yt-dlp の公式ドキュメントに従って対応する JavaScript ランタイムを導入する。
参考:
6. 保存形式を MP4 に固定する
毎回 WebM 形式になったり、保存形式が動画によって変わったりするのは少し面倒。
というわけで、MP4 の映像と M4A の音声を優先して取得するようにする。
6.1. ダウンロード時に形式を指定する
以下のコマンドを実行する。
[root@youtubedownloader ~]# yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" 'https://www.youtube.com/watch?v=RE_AlDzUgMM'
指定している形式の意味は以下のとおり。
| 指定 | 意味 |
|---|---|
bestvideo[ext=mp4] |
MP4 形式の映像から最良のものを選ぶ |
bestaudio[ext=m4a] |
M4A 形式の音声から最良のものを選ぶ |
/best[ext=mp4] |
上記の組み合わせが利用できない場合、MP4 形式の単一ファイルを選ぶ |
/best |
それも利用できない場合、利用可能な最良の単一ファイルを選ぶ |
今回の実行では、次のような結果になった。
[info] RE_AlDzUgMM: Downloading 1 format(s): 401+140
[download] Destination: 動画タイトル [RE_AlDzUgMM].f401.mp4
[download] Destination: 動画タイトル [RE_AlDzUgMM].f140.m4a
[Merger] Merging formats into "動画タイトル [RE_AlDzUgMM].mp4"
最終的に MP4 形式のファイルが生成された。
ただし、指定した形式が存在しない場合には、フォールバック先の形式が選択されることがある。常に MP4 で保存されることを保証する指定ではない点には注意したい。
7. MP4 の設定をデフォルト化する
毎回 -f オプションを指定するのは面倒なので、設定ファイルに記述しておく。
7.1. 設定ファイルを作成する
まず、設定ファイルを配置するディレクトリを作成する。
[root@youtubedownloader ~]# mkdir -p ~/.config/yt-dlp
続いて、設定ファイルに形式の指定を記述する。
[root@youtubedownloader ~]# echo '-f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best"' > ~/.config/yt-dlp/config
これで設定は完了。
7.2. 設定ファイルを利用してダウンロードする
以降は、通常どおり URL を指定するだけでよい。
[root@youtubedownloader ~]# yt-dlp 'https://youtu.be/T1AW8Gj1Xyg?si=vfRhrCahEK3HFk_z'
今回の実行でも、MP4 の映像と M4A の音声が選択された。
[info] T1AW8Gj1Xyg: Downloading 1 format(s): 616+140
[download] Destination: 動画タイトル [T1AW8Gj1Xyg].f616.mp4
[download] Destination: 動画タイトル [T1AW8Gj1Xyg].f140.m4a
[Merger] Merging formats into "動画タイトル [T1AW8Gj1Xyg].mp4"
これで、毎回形式を指定する手間が省ける。
なお、~/.config/yt-dlp/config は実行ユーザーのホームディレクトリを基準に読み込まれる。今回のように root で実行する場合は /root/.config/yt-dlp/config が対象になる。
別のユーザーで実行する場合は、そのユーザーのホームディレクトリに設定ファイルを用意する必要がある。
8. ダウンロードしたファイルを確認する
最後に、ファイルが保存されていることを確認する。
[root@youtubedownloader ~]# ls -lh
合計 410M
-rw-------. 1 root root 1.3K 10月 24 13:54 anaconda-ks.cfg
-rw-r--r--. 1 root root 155M 10月 24 22:54 '動画タイトル [RE_AlDzUgMM].mp4'
-rw-r--r--. 1 root root 155M 10月 24 22:50 '動画タイトル [RE_AlDzUgMM].webm'
-rw-r--r--. 1 root root 102M 10月 24 22:59 '動画タイトル [T1AW8Gj1Xyg].mp4'
実際の環境では、MP4 と WebM のファイルがそれぞれ保存されていることを確認できた。
なお、これは異なるコマンドでダウンロードした結果であり、同じ動画を MP4 と WebM の両方で保存している場合もある。
9. 番外編:AlmaLinux 9 で yt-dlp が動かない場合
ここからは AlmaLinux 9 で発生した問題についても触れておく。
AlmaLinux 10 とは別の話になるが、同じ手順を AlmaLinux 9 で試した際、Python のバージョンが原因で yt-dlp が起動できなかった。
9.1. 発生したエラー
通常の yt-dlp ファイルをダウンロードして実行すると、次のようなエラーが発生した。
# yt-dlp --version
Traceback (most recent call last):
File "/usr/lib64/python3.9/runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib64/python3.9/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/usr/local/bin/yt-dlp/__main__.py", line 14, in <module>
File "<frozen zipimport>", line 259, in load_module
File "/usr/local/bin/yt-dlp/yt_dlp/__init__.py", line 4, in <module>
ImportError: You are using an unsupported version of Python. Only Python versions 3.10 and above are supported by yt-dlp
エラーメッセージを見ると、Python 3.10 以上が必要だとわかる。
9.2. 原因
AlmaLinux 9 の標準 Python 環境は、今回の環境では Python 3.9 だった。
一方、取得した yt-dlp は Python 3.10 以上を要求していたため、実行に失敗した。
つまり、問題は yt-dlp 自体のインストールではなく、実行環境の Python のバージョンにあった。
9.3. スタンドアロン版を利用する
解決方法として、OS 標準の Python 環境を無理に変更するのではなく、Python 実行環境を同梱した Linux 向けスタンドアロン版を利用する。
# curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux -o /usr/local/bin/yt-dlp
# chmod a+rx /usr/local/bin/yt-dlp
通常版とは異なり、yt-dlp_linux を取得して配置するのがポイント。
これにより、OS 標準の Python のバージョンに依存する問題を回避できる。
ただし、スタンドアロン版も対応アーキテクチャや実行環境などの条件があるため、利用する環境に適合しているか確認してほしい。
まとめ
今回は AlmaLinux 10.2 で FFmpeg と yt-dlp を導入し、YouTube の動画を MP4 形式で保存するまでの手順をまとめた。
今回のポイントは以下のとおり。
- FFmpeg は EPEL・CRB・RPM Fusion を準備してからインストールする。
- yt-dlp は GitHub の公式リリースから取得できる。
-
yt-dlp -vで FFmpeg と ffprobe が認識されているか確認できる。 -
-fオプションを使えば、MP4 の映像と M4A の音声を優先して取得できる。 -
~/.config/yt-dlp/configに設定を書いておけば、毎回オプションを指定する必要がない。 - AlmaLinux 9 では Python のバージョンによって通常版が動作しないことがあり、スタンドアロン版が解決策になる場合がある。
- JavaScript ランタイムの警告が出た場合は、公式ドキュメントを確認して必要な対応を行う。
実際に環境構築をしてみると、パッケージの提供状況や Python のバージョンなど、ディストリビューションによって違いがあることを改めて実感した。