SSブログ

Ubuntuでnvenc久しぶりにやった [Linux]

新しいマシンでNVENCをやるやる言っときながら全然やっていなかったので、コンパイル通って動くところまではやる。つまったところの再度メモ書きなど。

SDKとかはここで落としてくる。前にやった時は最新バージョンが使えなかった。
https://developer.nvidia.com/nvidia-video-codec-sdk


nvidia-384-devとか、nvidia-cuda-toolkitとか、nvidia-cuda-devとかは入れた状態にしてある。あと他も入れた気がしたんだけど分かんね、忘れた。Video Codec SDK 8.0を解凍してmakeしてみると以下のエラーが出た。

/usr/bin/ld: cannot find -lGLU
/usr/bin/ld: cannot find -lXmu
/usr/bin/ld: cannot find -lglut


これは以下のインストールで解消する。多分直接は足りてないけど依存性で入れてもらえる。

sudo apt install freeglut3-dev libxmu-dev


依然、以下のエラーは残る。

/usr/bin/ld: cannot find -lnvidia-encode


nvidiaのドライバを入れたのでライブラリも入ってるはずなのだが、探してみて確かめる。

$ ldconfig -p | grep nvidia-encode
	libnvidia-encode.so.1 (libc6,x86-64) => /usr/lib/nvidia-384/libnvidia-encode.so.1
	libnvidia-encode.so.1 (libc6) => /usr/lib32/nvidia-384/libnvidia-encode.so.1
	libnvidia-encode.so (libc6,x86-64) => /usr/lib/nvidia-384/libnvidia-encode.so
	libnvidia-encode.so (libc6) => /usr/lib32/nvidia-384/libnvidia-encode.so

と出ていてパスが通ってそうに見えるんだが、実際はうまく行かない。
LD_LIBRARY_PATHに /usr/lib/nvidia-384 を設定してもできない。

解凍したVideo_Codec_SDK_8.0.14/Samples/NvEncoder/Makefileなどに

LDFLAGS += -L/usr/lib64 -lnvidia-encode -ldl

とあるんだが、
LDFLAGS += -L/usr/lib/nvidia-384 -lnvidia-encode -ldl

としてみたらコンパイルが通った。

前にこんなことしたっけ? どちらにしても/usr/lib64 なんてディレクトリはUbuntuにはありゃせん。
とりあえず/usr/lib/nvidia-384 の部分は各自入れたドライバによるので読み替えてください。


これからはNvEncoderに限って見る。どうせ使うのこれだけだろうし。
できたファイルはmp4なのでVLCを入れておく。デフォルトのアプリでも見られるのかもしれないけど、プラグインが上手く入らなかったりめんどうなので。

sudo apt install vlc


これでmp4ファイルは見られるようになる。拡張子の関連づけとかはしないとだけども。

あとYUVのファイルをmp4にするので、元になる動画ファイルとffmpegを入れておく。そして動画ファイルをYUVのファイルに変換して、mp4にNvEncoderの実行ファイルにてまたエンコーディングする。音はなくなるし、なんかバカやっているみたいだけど検証には仕方がない。

YUVのファイルはでかくなるので、Webから落としてくるってわけにも行かない。前には添付されていた気がしたが、変換がうまく行かなかった覚えがある。手持ちのファイルからYUVを作っちゃったほうが早い。

sudo apt install ffmpeg


これで既存のビデオファイルをYUV形式に変換することができる。

$ ffmpeg -i source.m4v out.yuv
$ ./NvEncoder -i out.yuv -o test.m4v -size 674 440 -codec 1
Encoding input           : "out.yuv"
         output          : "test.m4v"
         codec           : "HEVC"
         size            : 674x440
         bitrate         : 5000000 bits/sec
         vbvMaxBitrate   : 0 bits/sec
         vbvSize         : 0 bits
         fps             : 30 frames/sec
         rcMode          : CONSTQP
         goplength       : INFINITE GOP 
         B frames        : 0 
         QP              : 28 
       Input Format      : YUV 420
         preset          : DEFAULT
  Picture Structure      : Frame Mode
         devicetype      : CUDA

Input Filesize: 4438613520 bytes
NvEncoder.cpp line 971: nvEncoder.exe Warning: -endf 2147483647 exceeds total video frame 9978, using 9978 instead
Encoded 9978 frames in 4367.54ms
Avergage Encode Time :   0.44ms

ファイルができているものの、VLCでは開けない。そういやVLCで開けない問題があったのを思い出した。

http://miff.blog.so-net.ne.jp/2017-07-01-1

MP4のコンテナに乗ってない(たぶん)問題であった。上のリンクにあるようにVLCではダメだが、もともと入っている「ビデオ」アプリにプラグインみたいなのを入れると見られる。なので、普通に使えるようにするにはmp4boxあたりからソースを取ってきて、mp4コンテナに入れてあげないとダメなんだろう。大したことやっていないのだろうけど、そこのところのフォーマットってのはきっちりできているのでこういう時には困ったものだ。

この現象はNvTranscoderにも出てくる。要するにビットストリームでしか出力しないよんという立場で作っている。確かにmpeg4の形式にするか、matroskaにするかってのは自分で選べないと後々面倒だろうしな。というわけで、そこまで作り込んでくれていない。


そんなこんなで、SDKのサンプルをコンパイルできて動作も確認できた。一度やったことなので、このブログを検索すれば断片は確認することはできたのだよね。さて、今度はHandBrakeのソースを見て、主にMakefileなどと格闘することになる。それとNVENCのSDKのAPIの説明文章を英語で読まなくてはならない。面倒臭いな…。

タグ:NVENC
コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0