bokumin.org

Github

古い激重PCでもYoutubeをみる(Linux/FreeBSD)

Watching YouTube on a Potato PC with Linux/FreeBSD

はじめに

昨年、2017年に発売されたWyse 3040を入手しました(Amazonの商品ページはこちら)。
これまではなんちゃって監視カメラとして運用するなど一通り遊び倒したのですが、そろそろ普通のクライアントPCとして使ってみようと思い、デスクトップ環境を整えてみました。

しかし、FirefoxでWebサーフィンをするだけでメモリがカツカツ・・特にYouTubeなどの動画サイトは壊滅的で、再生しようとするものならメモリ2GBを食い尽くし、SWAP領域まで溢れてフリーズ寸前になります。動画をみようとしていたのに、スライドショーをみているのかなと勘違いする程度でした。

2017年当時ですら低スペック扱いだった機種なので、実際仕方ないですが・・個人的にこの低スペック機で動画がサクサク見れたらロマンがあると感じ、数時間格闘しました。
その結果、ある程度は実用的な方法にたどり着いたので共有します。

実行環境

  • 機器名:Dell Wyse 3040 Thin Client
  • CPU :Atom x5-Z8350 (4コア/1.44GHz)
  • メモリ:2GB (DDR3 / 増設不可)
  • OS :FreeBSD v14.3
    ※本記事の内容は 大体のLinuxでも同様 に使えます。

画像のように、2.5インチ外付けHDDから起動している状況です。

ブラウザ+Youtube

この環境で、実際にブラウザでYouTubeを再生した時の負荷状況がこちらです。
※Youtubeライブ動画を720pで再生しています

画像をみると、総メモリ使用量が1.87GB中1.64GB・SWAPが265MB使用・ロードアベレージが2以上と、スラッシングが発生している状態であることがわかります。
この動画では、CPU負荷的にまだまだ余裕がありそうですが、描画の多い動画だと張り付きレベルになり、動画はカクカク・操作も受け付けない激重状態になってしまいます。CPU、メモリの両者がボトルネックになっているという感じです。

解決策

ブラウザで見るから重いというのが結論です。軽量ブラウザのfalkonやmidoriを使ったとしても同様だと思います。
特にYoutubeは動画のデコード処理に加え、JavaScriptの実行、広告の読み込み、コメント欄の描画などでリソースが浪費されています。

そこで、軽量メディアプレイヤーの mpv と、バックエンドで動画URLを解析する yt-dlp を組み合わせる方法を採用しました。
以下は先程のライブ映像を同じ画質でmpvから視聴している様子です。

画像をみてもらうとわかりますが、総メモリ使用量が1.87GB中800MB・mpvの物理メモリ使用量が167MBとかなり抑えられている状態です。タブ一つで500MB〜1GB持っていかれる現代のブラウザに比べてかなり軽い状態であることがわかります。

まとめるとこんな感じです。

項目ブラウザmpv
メモリ使用量1.64GB (残り42MB)800MB (残り1GB以上)
SWAP265MB なし
CPU(ロードアベレージ)2.341.15

以下、mpvでYoutube動画を視聴するやり方について説明していきます。


1. 必要なツールのインストール

まずは動画プレイヤーの mpv、動画処理ライブラリの ffmpeg、そしてツールを動かすための python3 をインストールします。
※今回FreeBSDで環境構築をしていますが、Linuxでも大差なく同じことができると思います。

FreeBSDの場合

sudo pkg install mpv python3 ffmpeg

Linux (Ubuntu/Debian系) の場合

sudo apt update
sudo apt install mpv python3 ffmpeg

※以後、ダウンローダーとして、FreeBSDでは標準の fetch を使いますが、Linuxの方は wgetcurl に読み替えてください。

2. yt-dlp の導入

OS標準のリポジトリ(aptやpkg)に入っている yt-dlp はバージョンが古いことが多く、YouTube側の仕様変更ですぐに使えなくなります。
※FreeBSDの標準のものは、Androidクライアントに偽装しないと取得ができませんでした。
そのため、GitHubから直接最新バイナリを取得し、ユーザーのローカル環境に配置します。これが一番トラブルが少ないです。

ダウンロードと配置

ホームディレクトリの下に ~/.local/bin を作成し、そこに配置します。

# 保存場所を作成
mkdir -p ~/.local/bin

# fetchを使用してインストール
fetch -o ~/.local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp

# 実行権限を付与
chmod +x ~/.local/bin/yt-dlp

Linuxの場合はwgetを使用したり、Curlを使ったり、gitコマンドなどなど様々ありますが、一応例としてwgetを載せておきます。

wget -O ~/.local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp

パスを通す

ターミナルから yt-dlp コマンドを直接叩けるようにパスを通します。

bash / zsh の場合(Linuxや最近のFreeBSD)
~/.bashrc または ~/.zshrc に以下を追記します。

export PATH="$HOME/.local/bin:$PATH"

csh / tcsh の場合(FreeBSD標準)
~/.cshrc に以下を追記します。

set path = ($path $HOME/.local/bin)

設定ファイルを保存したら、一度ログアウトするか source コマンドで再読み込みしてください。
以下のコマンドを実行して日付が表示されれば成功です。

yt-dlp --version 

3. 再生方法

使い方は簡単で、ターミナルで mpv コマンドの後ろにYouTubeのURLを渡すだけです。

mpv "https://www.youtube.com/watch?v=動画ID"

このコマンドだけで動画の再生が始まります。
操作はキーボードのみで行うことが可能です。

  • Space: 一時停止/再開
  • / : 5秒スキップ
  • 9 / 0: 音量調整
  • q: 終了

4. 低スペックPC向けの最適化

デフォルト設定だと、mpvは最高画質(4K等)を読み込もうとして結局カクつくことがあります。また、ライブ配信の視聴時にはキャッシュ(巻き戻し用データ)がメモリを圧迫し、2GB環境ではすぐにクラッシュします。

以下のオプションを指定することで、この問題を回避できます。

画質を制限する(通常動画)

720p以下に制限することで、CPU負荷を劇的に下げられます。

mpv --ytdl-format="bestvideo[height<=720]+bestaudio/best[height<=720]" "URL"

ライブ配信を見る場合(超軽量化・キャッシュ無効)

低スペPC活用の肝ですが、長時間配信を見ていると、mpvは巻き戻しできるように過去の映像をメモリに溜め込みます。これを防ぐためにキャッシュを無効化します。

# 画質を480pまで落とし、過去データをメモリに残さない
mpv --ytdl-format="best[height<=480]" --demuxer-max-bytes=100KiB --demuxer-max-back-bytes=0 --cache=no "URL"

毎回打つのが面倒な場合は、.bashrc などに alias を登録しておくと便利です。


5. 動画を保存したい場合

回線が細い場合や、後でゆっくり見たい場合は yt-dlp コマンドでダウンロードします。ffmpeg が入っていれば、映像と音声を自動で綺麗に結合してくれます。

# 720p以下を指定
yt-dlp -f "bestvideo[height<=720]+bestaudio/best[height<=720]" -o "test.%(ext)s" "URL"

6. エラーが出る時の対処法

たまに403 Forbiddenなどで再生できない動画があります。これはYouTube側のBot対策ですが、スマホアプリとして振る舞うオプションをつけると回避できることが多いです。古いバージョンのyt-dlpでもこの方法ならダウンロードが可能でした。
※ただし、Androidスマホ画質になってしまいます。無理やり画質を上げようとしても403エラーが返ってきてしまいます。

# Androidクライアントとして振る舞う
mpv --ytdl-raw-options=extractor-args="youtube:player_client=android" "URL"

また、突然見られなくなった場合は yt-dlp のバージョンが古い可能性が高いです。以下のコマンド一発で自己アップデートできます。

yt-dlp -U

まとめ

数日間、メモリ不足と格闘しましたが、ブラウザをやめてmpvyt-dlpを使うだけで、激重だったWyse 3040が大分マシになりました。

これなら動画をみながらある程度の負荷の作業でしたら大丈夫(?)ですね。

2GBしかないメモリでも、工夫次第でまだまだ遊べそうです。押し入れに眠っている低スペックPCやLinuxマシンがある方は、ぜひ試してみてください。

おわり