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してみると以下のエラーが出た。
これは以下のインストールで解消する。多分直接は足りてないけど依存性で入れてもらえる。
依然、以下のエラーは残る。
nvidiaのドライバを入れたのでライブラリも入ってるはずなのだが、探してみて確かめる。
と出ていてパスが通ってそうに見えるんだが、実際はうまく行かない。
LD_LIBRARY_PATHに /usr/lib/nvidia-384 を設定してもできない。
解凍したVideo_Codec_SDK_8.0.14/Samples/NvEncoder/Makefileなどに
とあるんだが、
としてみたらコンパイルが通った。
前にこんなことしたっけ? どちらにしても/usr/lib64 なんてディレクトリはUbuntuにはありゃせん。
とりあえず/usr/lib/nvidia-384 の部分は各自入れたドライバによるので読み替えてください。
これからはNvEncoderに限って見る。どうせ使うのこれだけだろうし。
できたファイルはmp4なのでVLCを入れておく。デフォルトのアプリでも見られるのかもしれないけど、プラグインが上手く入らなかったりめんどうなので。
これでmp4ファイルは見られるようになる。拡張子の関連づけとかはしないとだけども。
あとYUVのファイルをmp4にするので、元になる動画ファイルとffmpegを入れておく。そして動画ファイルをYUVのファイルに変換して、mp4にNvEncoderの実行ファイルにてまたエンコーディングする。音はなくなるし、なんかバカやっているみたいだけど検証には仕方がない。
YUVのファイルはでかくなるので、Webから落としてくるってわけにも行かない。前には添付されていた気がしたが、変換がうまく行かなかった覚えがある。手持ちのファイルからYUVを作っちゃったほうが早い。
これで既存のビデオファイルをYUV形式に変換することができる。
ファイルができているものの、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の説明文章を英語で読まなくてはならない。面倒臭いな…。
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