開発者でも何でもない素人によるサイト

Ubuntu16.04(amd64)でnvencを使えるようにffmpegをbuild

  • このエントリーをはてなブックマークに追加

最近撮り溜まった動画がHDDを圧迫しつつあるので、Ubuntu16.04(amd64)でnvidiaのnvencを使ったh.264エンコードをすべく、ffmpegビルドに挑戦してみました。

結論から言うと、nvenc、めっちゃ早い…

持て余してた感があったグラボを有効活用できそうです。

なお、以下の作業はほぼNVIDIAの公式ガイドを参照して行いました。

とても丁寧な解説だったので、英語が面倒で無い人は、そっちを参考にしたほうが良いかと思います。

FFMPEG WITH NVIDIA ACCELERATION ON UBUNTU LINUX

以下は、素人がとりあえず動かせたという手順です。

英語がわからない方、僕と同じく知識は無いけどffmpegで高速エンコードしたい方・ビルドに挑戦したい方などの手がかりになればと思います。

環境

パッケージインストールしているffmpegのアンインストール

aptで入れていたffmpegを念の為設定ファイルごと消しました。

sudo apt purge ffmpeg
sudo apt autoremove

ビルドに必要なパッケージのインストール

ビルドに必要なパッケージを入れます。

最後のは海外のどこかのフォーラムで見かけたため、念の為入れましたが、本当はいらないかもしれません。

sudo apt install build-essential git yasm unzip wget sysstat nvidia-cuda-toolkit

NVIDIAドライバの導入

公式のPDFでここが唯一わかりにくかった、というより、14.04の情報でちゃんと手順を踏めなかったので正しい作業が行えていないと思うのですが、結果動いているので良しとします。

僕のUbuntuはGUIで動いているので、GUIでプロプライエタリなドライバに切り替えます。

「設定」→「ソフトウェアとアップデート」→「追加のドライバ」で、プロプライエタリなドライバを選びます(下図)。

Screenshot from 2016-07-26 23-53-30

終わったら、lightdmを再起動します。

sudo service lightdm restart

最後に、念の為PCごと再起動しました。

これでとりあえずドライバの導入は終えたことにしましたが、後々問題はなかったので良かったと思います。

作業用ディレクトリの作成

作業中にいっぱいファイルとかディレクトリが発生するので、作業場を作り移動します。

mkdir work
cd work

NVENC SDKのダウンロード

NVIDIAのサイトでは最新版は7.0ですが、PDFに出てくる、バージョンが古いものと同じファイルが見つからず、結局PDFのリンクから落として解凍しました。

wget http://developer.download.nvidia.com/compute/nvenc/v5.0/nvenc_5.0.1_sdk.zip
unzip nvenc_5.0.1_sdk.zip

適切な場所にファイルを配置します。

sudo cp nvenc_5.0.1_sdk/Samples/common/inc/*.h /usr/local/include

cuda utilityのダウンロード、ビルド

cuda utilityというライブラリをダウンロード・ビルドします。

wget
http://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/cudautils.zip
unzip cudautils.zip
cd cudautils
make

終わったら作業ディレクトリに戻ります。

cd ../

x264のダウンロード・ビルド

フリーのエンコーダ、x264をダウンロード・ビルドします。

git clone git://git.videolan.org/x264.git
cd x264
./configure \
 --disable-cli \
 --enable-static \
 --enable-shared \
 --enable-strip
make -j 10

エラーなくビルドできたら(worningは無視して良い)、インストールして作業ディレクトリに戻ります。

sudo make install
sudo ldconfig
cd ../

ffmpegにNVIDIAのパッチを当ててビルド・インストール

いよいよffmpeg本体のビルド・インストールにとりかかります。

まず、ffmpegとNVIDIAのパッチをおとし、ffmpegディレクトリに移動します。

git clone git://source.ffmpeg.org/ffmpeg.git
wget http://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/ffmpeg_NVIDIA_gpu_acceleration.patch
cd ffmpeg

次にパッチを当てるのですが、ここで3分くらいつまづきました。

このNVIDIAのパッチは、過去のあるバージョンに対するもので、そのままパッチを当ててもエラーが出てうまくいきません。

従って、PDFにあるコミットのバージョンに戻します。

git checkout b83c849e8797fbb972ebd7f2919e0f085061f37f
git apply ../ffmpeg_NVIDIA_gpu_acceleration.patch

これでうまくパッチがあたったので、ビルドします。

PDFに従って、作業ディレクトリ直下にffmpeg_buildというディレクトリを作り、そこにビルドします。

mkdir ../ffmpeg_build
cd ../ffmpeg_build
../ffmpeg/configure --enable-nonfree \
 --enable-nvenc \
 --enable-nvresize \
 --extra-cflags=-I../cudautils \
 --extra-ldflags=-L../cudautils \
 --enable-gpl \
 --enable-libx264
make -j 10

数分待つとビルドが完了します。

ガイドの通り、NVENCとx264がうまく組み込めたか、確認します。

./ffmpeg -encoders | grep 264

nvencとかlibx264とか見えてればOKです。

もうひとつ、nvresizeというフィルターも確認します。

./ffmpeg -filters | grep nvresize
...
... nvresize         V->N       GPU accelerated video resizer.

上の文字列が見えればOKのようです。

インストール!

最後にインストールします。

sudo make install
sudo ldconfig

以上で完了です。

実際の使い方

h.264でエンコードする際に、-vcodec libx264とするかわりに、-vcodec nvencとするだけでエンコードが爆速になります。

僕の環境だと、2時間くらいのmpeg2tsが、15分くらいで終わったように思います。とても早いです。