Windows10のWSLを使ってHandBrakeをコンパイルしてみる

自分でHandBrakeをコンパイルする必要があるのですが、環境構築の敷居がかなり高めです。そこで先人の知恵+オリジナル要素でなるべく簡単に実現する方法を考えてみました。

1.経緯

以下の理由で最新のHandBrakeを自分でコンパイルすることにしました。

  1. AACのエンコードに高音質なFDKを使いたいため
  2. 16コア CPUをフルに活用してエンコードできるようにするため

もう少し詳しく説明すると、現在利用しているHandBrakeはFDK AACを利用したいがためにFDK組込最終配布バージョンの0.10.3で止まってます。
今のところ困ってはいませんが1.1系以前のものは10コア以上のCPUに対応していないらしいですね。Ryzen 9 3950Xを運よく入手できたとしても性能を発揮できないのでは意味がないので、メニーコア対応の1.2系でFDK AACを使えるようにしたい!というのが今回の動機。

2.コンパイル環境準備はWSLで

いつもならVMware PlayerでUbuntuの仮想マシンを用意してコンパイルするところですがインストーラのダウンロードもインストール作業も意外と時間がかかります。そこで今のWindows10には簡単にLinux環境を構築できるWSL(Windows Subsystem for Linux)が組み込まれているので、この機能を使ってお手軽にUbuntuを導入してみます。

3.Ubuntu導入

WSLはデフォルト無効のため最初に有効化します。
PowerShellを管理者権限で起動して以下のコマンドを実行し、Windowsを再起動。

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

再起動完了後、Microsoft Storeを起動し「Ubuntu」で検索すると複数のアイコンが出てきます。「無印」のUbuntuは常に最新版、「LTS」は長期サポート版。ネットで情報がそろいやすいのはLTS版です。

ということでLTSの新しい方、Ubuntu 18.04 LTSを導入することにします。画面中央の「入手」をクリック。この時、Microsoftアカウントでログインすることを求められますが「必要ありません」で問題ありません。

このダウンロードはそこそこ時間がかかりますのでおとなしく待ちましょう。

ダウンロード終了直後はストアの「起動」でUbuntuを起動できますが、以降はスタートメニューから起動できます。

4.コンパイル環境の準備

Ubuntu初回起動時、これから利用するユーザとパスワード名の入力を求められます。メイン使いするOSではないので、ユーザ名はシンプルにuserとしておきました。

ここからは先人の知恵を借りて作業を行うことにします。参考にしたのはこちら。
https://www.apollomaniacs.com/ipod/howto_video_handbrake_build_hb.htm
まずはapt-get updateでパッケージを最新にしますが、先ほど作成したuserは一般ユーザなのでシステムに影響を与えるコマンドはsudoで実行します。

user@pc:~$ sudo apt-get update
[sudo] password for user:[登録したパスワード]

コンパイルに必要なパッケージを導入します。

user@pc:~$ sudo apt-get install automake autoconf build-essential cmake curl gcc git intltool libtool libtool-bin m4 make nasm patch pkg-config python tar yasm zlib1g-dev
After this operation, 229 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

再起動が必要なサービスは自動再起動しますよ?というダイアログが表示されましたが、かまわないので「Yes」を選択。

UbuntuでWindows用のプログラムをコンパイルする「MinGW-w64」を導入(コンパイル)するためのパッケージを導入。

user@pc:~$ sudo apt-get install bison bzip2 flex g++ gzip pax
Need to get 1086 kB of archives.
After this operation, 3104 kB of additional disk space will be used.
Do you want to continue? [Y/n] y

これで準備が終わりました。

5.HandBrakeのソースコード入手

まずgitでHandBrakeのソースコードをダウンロードします。

user@pc:~$ git clone https://github.com/HandBrake/HandBrake.git 

次にコンパイルするバージョンを指定します。
まずはカレントディレクトリ直下のHandbrakeディレクトリに移動し・・・

user@pc:~$ cd HandBrake

「git tag –list」コマンドで選択可能バージョンを表示。以下のようにすれば絞り込みも可能です。

user@pc:~/HandBrake$ git tag --list | grep ^1\.2\.
1.2.0
1.2.1
1.2.2

1.2.2を利用したいので以下の通り入力します。

user@pc:~/HandBrake$ git checkout -b 1.2.2
6.MinGW-w64のコンパイル

準備はまだ続きます。Windows用HandBrakeをUbuntuでコンパイルするための「MinGW-w64」のソースダウンロードとコンパイルを行います。
なおこの工程が一番時間がかかり、Ryzen 7 1700 3.7GHzで約1時間でした。

user@pc:~/HandBrake$ scripts/mingw-w64-build x86_64 /home/user/toolchains/
※userの部分は作成したユーザ名に置き換えてください

コンパイルが終わると以下のようにcomplete.で終了します。
コメント内容はざっくりと「mingw-w64のパスを通せ」とのこと。

  run the following command and add it to your shell startup script
  (e.g., .bashrc or .bash_profile) to make persistent across sessions:
    export PATH="/home/user/toolchains//mingw-w64-x86_64/bin:${PATH}"
complete.
user@pc:~/HandBrake$
7.MinGW-w64のpathを通す

MinGW-w64が完成したのでHandbrakeのコンパイルに利用できるよう、.bashrcファイルに「export~」を追記してpathに通します。

user@pc:~/HandBrake$ vi ~/.bashrc
export PATH="/home/user/toolchains/mingw-w64-x86_64/bin:${PATH}"

.bashrcファイルに追記しただけでは反映されないので、sourceコマンドをお忘れなく。

user@pc:~/HandBrake$ source ~/.bashrc
8.いよいよHandBrakeをコンパイル

ここからがHandBrakeコンパイルの本番です。今回の目的はFDK AACを利用可能とするためなので「–enable-fdk-aac」を忘れずに。

user@pc:~/HandBrake$ ./configure --cross=x86_64-w64-mingw32 --enable-fdk-aac --enable-qsv --enable-vce --enable-nvenc --launch-jobs=$(nproc) --launch

またコンパイルに利用するCPUに最適化されたHandBrakeを欲しい場合は、この通り2行追加します。

export CFLAGS="-O2 -march=native -pipe"
export CXXFLAGS="${CFLAGS}"
./configure --cross=x86_64-w64-mingw32 --enable-fdk-aac --enable-qsv  --launch-jobs=$(nproc) --launch

Build is finished!でコンパイル完了。Ryzen 7 1700@3.7GHzで約5分でした。

-------------------------------------------------------------------------------
time end: Mon Oct 14 22:36:22 2019
duration: 4 minutes, 46 seconds (286.97s)
result: SUCCESS
-------------------------------------------------------------------------------
Build is finished!
You may now cd into ./build and examine the output.
user@pc:~/HandBrake$

9. コンパイルしたHandbrakeの取り出し

最後にHandBrakeを取り出します。
方法としては2つ。Ubuntuの/mnt/c(WindowsのCドライブ)にファイルをコピーするか、UbuntuのディレクトリにWindows上からアクセスするか。今回は後者を試します。

まずはユーザーディレクトリのWindowsアプリが格納されているフォルダにアクセス。

%USERPROFILE%\AppData\Local\Packages

この中の「CanonicalGroupLimited.Ubuntu……」フォルダの中にUbuntuが保存されています。

さらに進み「\LocalState > \rootfs > \home > \user > \HandBrake > \build」と行くとBATファイルなどで利用できる「HandBrakeCLI.exe」があります。

もう一つ配下の「\libhb」に進むと通常のHandBrakeが利用するdllファイル「hb.dll」があるので、これを公式サイトからダウンロードしたHandBrakeのインストールフォルダに上書きコピーします。

HandBrakeを起動すると利用可能なコーデックに「AAC(FDK)」と「HE-AAC(FDK)」が増えています。