Handbrake CLIをWindows 10の"Bash on Ubuntu on Windows"でビルドしてみる

ランサムウェアなどで古いWindowsが危険な事が周知されてきたと思います。とはいえ最新のWindowsにして何かメリットがあるかというと・・・実感できないですよね。

今回はWindows 10の新しい機能 "Bash on Ubuntu on Windows" を使ってビデオエンコードソフトウエアのHandbrake CLIをビルドしてみます。


せっかくの最新のWindows。無理やり機能を使ってみます。

Bash on Ubuntu on Windowsを使う

今回はWindows 10の新しい機能 、"Bash on Ubuntu on Windows"と呼ばれる機能を使います。UbuntuとはOSの名称、bashとはLinuxのコマンドプロンプトみたいなものです。WindowsでUbuntuが簡単に動くようになりました。
まぁ、ほとんどに人には関係ない機能です。使う事は無いでしょうけど。

これで何が良いかというとLinux系のプログラムのビルドが簡単になる(かも)という点です。最近はオープンソースソフトウエアが増えてきています。クロスプラットフォームに対応していればWindows,Linux,iOS,Androidなどで動かせるものも多いです。それらの開発環境はLinuxを使うものがあるでしょう。そういったソフトウエアの最新版を試したいと思った時にLinux環境を作るのは面倒でした。
Linux専用パソコンを用意するのもばからしいです。WindowsでLinuxの開発環境を作る事もできますが、環境作りとメンテナンスは面倒です。なら仮想マシンで…やはり面倒くさい。
こんな感じで面倒くさがりな私のような方は手を出さないですよね。

ところが、Windows 10でUbuntuの環境が標準で動いてしまうようになりました。素のUbuntuを使う感じで動いてしまうのです。さすがにGUIは動かないですがオープンソースソフトウエアをビルドするにはうってつけのような気がします。

一番便利だと思う事はUbuntuの環境がコマンド一発でアンインストールでき、コマンド一発で真っ新なUbuntu環境がインストールできる事です。良く知らないOSで何をやってるかもわからず動かして遊ぶにはもってこいです。

Bash on Ubuntu on Windowsを使えるようにする

Windows 10でbashを使えるようにする手順は他のサイト様にお任せです。すぐに見つかるでしょう。難しい所はありません。
【2017/7/12 追記】
Windowsストアからインストールできるようになりました。
Ubuntu https://www.microsoft.com/store/apps/9nblggh4msv6
Windowsの機能の有効化または無効化でWindows Subsystem for Linuxを有効にしておく必要があります。

Windowsに機能を追加してbash用ユーザーを追加しパスワードを設定してください。

ここではユーザー名を "User1" として説明していきます。以後、ご自分のユーザー名と置き換えてください。

最初の設定が終わればBash on Ubuntu on Windowsというアイコンが追加されます。次回からはこのアイコンから動かせます。
Windows PowerShell(管理者)から”bash”コマンドで起動すると、ユーザーのホームディレクトに移動しないようです。system32ディレクトリにいるので何かコマンドを入れるのは危険ですので注意しましょう。

Ubuntuのバージョンの確認

バージョンの確認をしてみます。
$ uname -a
Linux xxx 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
でした。

ホームディレクトリの場所

Ubuntuで使うディレクトリやファイルの実態はどこにあるのでしょうか?
C:\Users\[Windowsのユーザー名]\AppData\Local\lxss\
にありました。
lxssフォルダはエクスプローラーでは表示されませんでしたが、パスを直接入力するとlxss以下に入れます。
ホームディレクトリは
C:\Users\[Windowsのユーザー名]\AppData\Local\lxss\home\User1
でした。
Ubuntuのシステムファイルは"rootfs"以下にあるようです。

Windowsのファイルエクスプローラで普通にファイルのやり取りができます。一番のメリットかも。

Handbrake CLIをビルドしてみる

実際に何かビルドしてみましょう。Linux環境でWindows用プログラムを作るクロスコンパイルを試してみます。
今回はビデオエンコーダソフトウエアのHandbrakeをビルドしてみます。
Handbrake
”HandBrake is a tool for converting video from nearly any format to a selection of modern, widely supported codecs.”
https://handbrake.fr/
これのコマンドラインバージョンのビルドをします。
公開されているWindowsバイナリではデコードで映像が壊れる事があったので開発版をビルドしたいと思っていました。開発版のバイナリーはLinux用しかありません。Windowsで動く実行ファイルは自分でビルドする必要がありました。
あれ?Ubuntu用バイナリがそのまま動かせるのかな…?と思いつつもパス指定が面倒なのでWindows版をビルドしてみます。

ビルド手順はここに書いてありました。
https://handbrake.fr/docs/en/1.0.0/developer/build-windows.html

それではやってみましょう。
まずはレポジトリとパッケージの更新です。
sudo apt-get -y update
sudo apt-get -y upgrade
レポジトリとはLinux用のプログラムライブラリのようなもので、いろいろなプログラムやライブラリを簡単にネットワークからインストール・アンインストールする仕組みです。

必要なパッケージをインストールします。
sudo apt-get install cmake curl gcc git intltool libtool m4 make patch python tar wget yasm
ビルド環境は何も入ってないんですね。
これも必要でした。
sudo apt-get install bison flex g++ pax

作業はホームディレクトリ下にDownloadsディレクトリを作って、そこで行います。
cd ~
mkdir Downloads
cd Downloads

Handbrakeのソースコードを取得します。
git clone https://github.com/HandBrake/HandBrake.git
cd HandBrake

mingw-w64 toolchainsをビルドします。
scripts/mingw-w64-build x86_64 /home/User1/Downloads/toolchains/
数分かかると書いてありますが…
1時間半かかりました。
終わると最後にメッセージが出ています。
  add to your shell startup script (usually .bashrc or .bash_profile):
    export PATH="/home/User1/Downloads/toolchains//mingw-w64-x86_64/bin:${PATH}"
complete.
~/.bashrcファイルの変更をしておきます。最後の行に追加すれば良いでしょう。
export PATH="/home/User1/Downloads/toolchains//mingw-w64-x86_64/bin:${PATH}"
ファイルへの追加では今作業しているターミナルセッションに反映されないので、コマンドとして上の行を実行しておきます。
ところで、先ほどパッケージを追加しましたが、パッケージが足りないとこんなエラーがでちゃいます。
$ scripts/mingw-w64-build x86_64 /home/user1/toolchains/
dependencies: bison bzip2 curl flex g++ gcc gunzip m4 make pax yasm
unable to find command(s): bison flex g++ pax
親切ですね。問題が起きたら指示されたパッケージをインストールすればいいでしょう。

ビルドとエラーの回避

それではビルドをします。
./configure --cross=x86_64-w64-mingw32 --enable-x265 --enable-qsv --launch-jobs=$(nproc) --launch

15分ほどで終わりましたがエラーでした。
ターゲット 'contrib/libdvdnav/.stamp.configure' のレシピで失敗しました
make: *** [contrib/libdvdnav/.stamp.configure] エラー 1
なんのエラー?良くわかりません。
このエラーメッセージはフォーラムの古い書き込みでも出てきます。Handbrakeのソースの問題というよりは開発環境の問題のようです。直接の解決策は見つけられませんでしたが、ライブラリをビルドする際のconfigureに失敗している事はわかりました。

Linuxでは良くある問題のようです。プログラム開発に必要そうなパッケージを入れてみます。先ほど入れたパッケージの他に追加で入れてみます。handbrakeやffmpegなどの巨大なプロジェクトでは様々なライブラリを使っています。それらが使うパッケージが足りない場合があります。
今回はこれが怪しいようです。
sudo apt-get install pkg-config
場合によってはautoconf、build-essentialとかも。

パッケージのインストールが終わったらもう一度トライします。
-------------------------------------------------------------------------------
time end: Wed May 31 14:51:38 2017
duration: 20 minutes, 51 seconds (1251.25s)
result: SUCCESS
-------------------------------------------------------------------------------
Build is finished!
You may now cd into ./build and examine the output.
やったー! 成功です。20分ほどかかりました。

動作確認をする

ビルドに成功するとbuildディレクトリにHandBrakeCLI.exeができています。
バージョンを確認してみます。出来上がった実行ファイルはWindows用です。普通にコマンドプロンプトかPowerShellから動かします。
HandBrakeCLI.exe --version

無事に最新版ができていそうです。

早速エンコードしてみると…動きました。
さて、ちゃんとエンコードできなかったファイルをエンコードしてみますが、以前と同じく画面が壊れてしまいます。
QSVでh.264化したビデオファイルなのですが、解像度を落として再エンコードしようとするとデコード時点でおかしくなっているようなのです。デコードにQSVを使うと確実に壊れ、ソフトウエアデコードにすると大きなブロックノイズが次のキーフレームが現れるまで生じます。最初のキーフレームを読めてない感じ。VLCやMPCでの再生は問題ないんですけど。まぁ、放っておこう。

あとがき

Windows 10のBash on Ubuntu on Windowsを使ってHandbrake CLIをビルドしてみました。

Bash on Ubuntu on Windowsは簡単にアンインストールと再インストールができるので、環境の再構築が簡単にできます。Ubuntuのお勉強にも便利です。おかしくなったら簡単に作りなおせます。
開発環境がWindowsではないオープンソースソフトウエアのビルドも手が出しやすくなったと思います。

Windowsでbashが使えるようになるとは聞いていましたが、互換コマンド程度の使い道がないものだと思っていました。ですがこれは大きな間違えでした。
素のUbuntuのコマンドライン環境が動きます。Windowsの実行ファイルも動かせます。
何よりファイルのやり取りが簡単です。Ubuntu専用マシンを作るとファイルのやり取りができる環境を作るだけで疲れてしまいます。完全なWindowsの上でUbuntuが動いてしまうのですからWindowsに慣れた方にもいじりやすいでしょう。
ただし、テキストファイルの改行コードと文字コードに注意しましょう。WindowsはCR+LFとS-JIS、UbuntuはLFとUTF-8です。

オープンソース系のプログラムのビルドでエラーが出るとものすごく面倒です。たいていのエラーは開発環境によるものです。
自分と同じ環境・同じバージョンの解決策が見つからないともうどうしたら良いかわかりません。Linux系はディストリビューションによっても対策が異なるので検索結果にノイズが増えてさらに面倒です。関連しそうなフォーラムを見つけても何やら暗号めいた単語で会話してるし・・・初心者はこれだけで挫折しますね。

Creators Update後のBash on Ubuntu on Windowsの環境はUbuntu 16.04.2 LTSになったそうです。学習用小型コンピュータボード Raspberry Pi の標準OS RASPBIAN JESSIEと同じくDebian 8 jessieがベースですので使い方がほぼ一緒です。
ラズパイで遊んでみたい方にも良いかも。

Bash on Ubuntu on WindowsでLinux開発者をWindowsへと取り込みたいようですが、これは逆効果では・・・と思ってしまうほどUbuntuがしっかり動きます。
Microsoftすごい!
GUIを含めUbuntuがWindowsのサブセットになるまで開発を続けてもらいたいものです。

コメント

最近のコメント

Threaded Recent Comments will be here.