NVEnc 3.00

もう2か月近くやっていた作業をやっと終わらせた。NVEncの抱えていたいろいろなよくわからない制限を撤廃して、ついでにGPUフィルタ機能を大幅に拡張。

ざっと書くと

・avcuvid読み込みでも10bit深度/YUV444出力に対応。
・avcuvid読み込み以外でもリサイズを可能に。
・左cropが動作しないのを解消。
・さまざまなリサイズアルゴリズムを追加。(--vpp-resize)
・透過性ロゴフィルタを追加。(--vpp-delogo)
・Knn(K nearest neighbor)ノイズ除去を追加。(--vpp-knn)
・正則化PMD法によるノイズ除去を追加。(--vpp-pmd)
・ガウシアンフィルタを追加(x64のみ)。(--vpp-gauss)
・音声処理のエラー耐性を向上。

変更・追加機能多すぎて、バグとかあったらごめんなさい。だいぶじっくり確認はしたつもりだけど…。

詳細は続きに。

もともとNVEncはavcuvid読みなときしかできない処理とかがあった。例えばGPUでのリサイズとか、cropとか。

なんでそんなことになっていたかというと、avcuvid読みなとき(GPUでデコードするとき)とそうでないとき(CPUでデコードするとき)で、全然違う処理になっていて、片方にしか実装してないとかいう機能もあったせいでそういうよくわからないことになっていた。

図にするとこんな感じ。
nvenc_2.xx_enc_flow

読み込み方法によって、処理の流れが違って、avcuvidの時はhw resizeはできるけど、yuv444とか10bitとかは使えないので、そういうことがしたければavsw経由で流してね…ということになっていた。逆にavswとかavsとかから読み込むとリサイズができない…。

今回フィルタ処理を入れてみようかなあ、と思ったときに、このavcuvidとそうでないときで分かれている処理のところをさわる必要が出てきたので、このあたりをいっそ全部書き直してみた。かなり時間がかかったけど、おかげでいろいろな機能を追加することができた。

で、新しい流れはこんな感じ。
nvenc_3.xx_enc_flow

処理の合間にCUDAによるフィルタ処理ができるようにして、yuv444/10bitとの変換や、リサイズ・delogo・ノイズ除去ができるようにした。

なので、今回追加したフィルタ処理は、一応全部GPUで動作する。QSVだと、SDKにフィルタ処理が用意されていて便利なのだけど、NVENCの場合はnppライブラリというのを使用するか、あとは自分で書くしかない。nppライブラリはx64版しか用意されていないという欠点があって、そのせいで基本的には全部自分で書くはめになった(リサイズは32bit版ではできませんとかなったら大変だ…)。

というわけでほとんどのGPUコードはわたしがCUDAで適当に書いのだけど、速いのかなあ?

まあ、一応リサイズとかはnppライブラリを呼べるように作ったので、使ってみたい方はNVEncC64.exeのあるフォルダに、別途nppi64_80.dll/nppc64_80.dllを入れて使ってみてください。(nppの再頒布可能なdllは重いので、別途npp64_80_dll.zipとしてあげておきます)



変更点



[NVEncC]
・音声処理のエラー耐性を向上。
"failed to run bitstream filter for AAC audio."のようなエラーが出てしまった場合でも処理を(ある程度)継続できるように。

・avcuvid読み込みでも10bit深度/YUV444出力に対応。
・avcuvid読み込み以外でもリサイズを可能に。
・avcuvid読み込み以外でもtrimを可能に。
・左cropが動作しないのを解消。

・透過性ロゴフィルタを追加。(--vpp-delogo)
--vpp-delogo <string>
ロゴファイルを指定する。".lgd",".ldp",".ldp2"に対応。
通常、複数のオプションを組み合わせて使用する。(ファイルにロゴがひとつの".lgd"なら不要)

例:
--vpp-delogo "logopack.ldp2" --vpp-delogo-select "TBS 1440x1080"
ロゴパックファイル "logopack.ldp2" からロゴ "TBS 1440x1080" を使用。

--vpp-delogo-select <string>
ロゴパックの場合に、使用するロゴを以下のいずれかで指定する。
・ロゴ名(完全一致!)
・インデックス (1,2,...)
・自動選択用iniファイル
下記の書式に従って、入力ファイル名から自動的にロゴを選択する。

書式
[LOGO_AUTO_SELECT]
logo<連番数字>=<マッチパターン>,<リストに表示されているロゴ名(完全一致!)>

設定ファイルの例

[LOGO_AUTO_SELECT]
logo1= (NHK-G).,NHK総合 1440x1080
logo2= (NHK-E).,NHK-E 1440x1080
logo3= (MX).,TOKYO MX 1 1440x1080
logo4= (CTC).,チバテレビ 1440x1080
logo5= (NTV).,日本テレビ 1440x1080
logo6= (TBS).,TBS 1440x1088
logo7= (TX).,TV東京 50th 1440x1080
logo8= (CX).,フジテレビ 1440x1088
logo9= (BSP).,NHK BSP v3 1920x1080
logo10= (BS4).,BS日テレ 1920x1080
logo11= (BSA).,BS朝日 1920x1080
logo12= (BS-TBS).,BS-TBS 1920x1080
logo13= (BSJ).,BS Japan 1920x1080
logo14= (BS11).,BS11 1920x1080 v3


この場合、入力ファイル名が"響け!ユーフォニアム #13 「さよならコンクール」 (BS11).ts"なら、ロゴ名"BS11 1920x1080 v3"が使用される。

--vpp-delogo-pos <int>:<int>
1/4画素精度のロゴ位置の調整。Aviutlで言うところの <位置 X>:<位置 Y>。

--vpp-delogo-depth <int>
ロゴの透明度の補正。デフォルト128。Aviutlで言うところの <深度>。

--vpp-delogo-y <int>
--vpp-delogo-cb <int>
--vpp-delogo-cr <int>
ロゴの各色成分の補正。Aviutlで言うところの <Y>, <Cb>, <Cr>。



[NVEnc.auo/NVEncC共通]
・さまざまなリサイズアルゴリズムを追加。(--vpp-resize)
リサイズアルゴリズムを選択。

--vpp-resize <string>

標準で使用可能なもの
default自動的に適切なものを選択
bilinear線形補間
spline366x6 Spline補間
nppi64_80.dll導入で追加されるもの(x64のみ)
nn最近傍点選択
npp_linearnppの線形補間
cubic4x4 3次補間
cubic_bspline4x4 3次補間 (B=1, C=0)
cubic_catmull4x4 3次補間 (B=0, C=1/2)
cubic_b05c034x4 3次補間 (B=1/2, C=3/10)
supernppのsuper sampling(詳細不明)
lanczonsLanczos法 (参照点数不明)


・Knn(K nearest neighbor)ノイズ除去を追加。(--vpp-knn)
K nearest neighborなる方法によるノイズ除去。強めのノイズ除去を行いたいときに使用する。

--vpp-knn [<param1>=<value1>][,<param2>=<value2>],...

パラメータ
radius=<int>
適用半径。1-5の範囲で指定、デフォルトは3。

strength=<float>
フィルタの強さ。0.0-1.0の範囲で指定、デフォルトは0.08。

lerp=<float>
ノイズ除去ピクセルへのオリジナルピクセルのブレンド度合い。0.0-1.0の範囲で指定、デフォルトは0.2。

th_lerp=<float>
エッジ検出の閾値。0.0-1.0の範囲で指定、デフォルトは0.8。

使用例(すこし強め): --vpp-knn radius=3,strength=0.10,lerp=0.1


・正則化PMD法によるノイズ除去を追加。(--vpp-pmd)
--vpp-pmd [<param1>=<value1>][,<param2>=<value2>],...
正則化pmd法によるノイズ除去。弱めのノイズ除去を行いたいときに使用する。

パラメータ
apply_count=<int>
適用回数。デフォルトは2。

strength=<float>
フィルタの強さ。0-100の範囲で指定、デフォルトは100。

threshold=<float>
フィルタの閾値。0-255の範囲で指定、デフォルトは100。

使用例(すこし弱め): --vpp-pmd apply_count=2,strength=90,threshold=120

・ガウシアンフィルタを追加(x64のみ)。(--vpp-gauss)
--vpp-gauss <int>
nppi64_80.dll導入が必要。
適用サイズを指定してガウスフィルタをかける。サイズは3,5,7のどれか。

・エンコード終了時に各フィルタの平均所要時間を表示するオプションを追加。
--vpp-perf-monitor
これを使用するとエンコード全体としては若干遅くなるので注意。



フィルタ実行速度



入力
MPEG2 1920x1080 29.97fps

環境
OSWin10 x64Win10 x64
CPUi7 5960Xi7 4770K
Core4.2GHz4.2GHz
UnCore3.6GHz4.0GHz
GPUGTX 1060GTX 960
 コア数1280コア1024コア
 ベースクロック1506MHz1177MHz
 ブーストクロック1709MHz1240MHz
 メモリクロック8008MHz7010MHz
 メモリ帯域192.2GB/s112.1GB/s


フィルタ速度 (1フレームの処理時間 [単位: us ( = 1/1000 ms)])
GTX 1060GTX 960
copyHostToDevice327.2518.6
copyDeviceToDevice48.886.8
vpp-resize1080p→720pspline36379.0637.7
bilinear57.291.4
nn218.5770.7
npp_linear163.1783.4
cubic297.61066.1
lanczos639.41661.9
vpp-delogoBS118.814.8
vpp-knnradius1374.2624.9
2838.71443.7
31524.82553.2
vpp-pmdapply_count1838.41416.3
21101.61876.6
31356.72271.5
vpp-gausssize3198.7890.5
5339.21106.0
7404.21117.8


という感じで"--vpp-perf-monitor"でとりあえず測定してみたけど、速いのかな、これ。1000us割ってれば、1秒間に1000フレーム処理できると考えればたしかに速いかもしれない。あと、Pascal (GTX1060)がMaxwell (GTX960)に圧勝しているのが目を引く。

まあ、NVENCのエンコーダーより速ければ、「フィルタかけても遅くない」が実現できるので、それでいい気がする。



ダウンロード>>
ダウンロード (ミラー) >>
OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。同じものです。

ソースはこちら>>


スポンサーサイト



コメントの投稿

非公開コメント

画像が大きすぎてスマホじゃ綺麗に(見やすく)表示出来てないので画像の"最大幅"を100%にしてみてはどうでしょうか???

No title

ゲーム以外での処理性能比較を行うサイトってほとんど見かけないので
今後のグラボ購入の検討にとても役立ちます
copyHostToDeviceの時間も1060で結構短くなるんですね

--vpp-perf-monitor素敵です

No title

おおついにcuda対応きましたね、すばらしい
vpp-waifu2x...はさすがに厳しいかw
nvencの画質にはもったいないし

No title

>Shun様
ああ、なるほど。たしかにおっしゃる通りですね。スマホでもPC版表示にしているので気づきませんでした。この記事は修正しましたが、以前の記事はさすがに多いので…。

今後は100%を使わせていただきます。

>zof様
たしかにこういう画像処理系の速度の比較はあまりされないので、よくわからないですよね。--vpp-perf-monitorを使うと若干遅くなってしまいますが、ベンチマーク用には面白いと思っています。

copyHostToDeviceの時間は意外でしたが、このあたりはhost側の違い(i7 5960X+X99とi7 4770K+Z97)の違いが出ているのかもしれません。

>vpp-waifu2x
いやあ、あれはさすがに重いです…。
なにか手ごろな軽いフィルタとかを追加していければと思っています。

No title

> なにか手ごろな軽いフィルタとかを追加していければ

cuda toolkitが必要だけど、nvrtcでユーザー定義のフィルターを
組み込めるようにするとか…
初期パラメタの汎用的な渡し方まで考えるとめんどうだけど、
単純なピクセルシェーダーくらいならいけるかな?

No title

はじめまして。
初めてNVEncを利用しようと思ったのですが、どうやらNVEncがGPUを認識できておらず、エラーを吐いてしまっています。

x86\NVEncC.exe --check-features > nvenc_features.txt
を実行したログは

--------
Environment Info
OS : Windows 7 (x64)
CPU: Intel Core i7-6700K @ 4.00GHz [TB: 4.19GHz] (4C/8T)
RAM: Used 3424 MB, Total 16330 MB
GPU: Unknown (error on OpenCL clGetDeviceInfo)

No NVEnc support.
--------

で、実際にはGeForce GTX960を積んでいます。
ドライバのバージョンは353.90になります。

OpenCL clGetDeviceInfoでおきているエラーの対処方法が分かりませんでしたので、こちらで質問させていただくことをお許しください。

お忙しいところ申し訳ございませんが、よろしくお願い致します。

No title

>nvrtcでユーザー定義のフィルターを組み込めるようにするとか…
nvrtcというのがあまりよくわかってませんが、プラグインみたいな感じでしょうか? ただ、いまのところそこまで汎用的なつくりにしていないので、難しいかもですね。

>mii様
NVEncは2.08以降、 368.69以降のドライバが必要です。最新のドライバに更新し、再度お試しいただければと思います。
プロフィール

rigaya

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先: rigaya34589@live.jp
github twitter

最新記事
最新コメント
カテゴリ
月別アーカイブ
カウンター
検索フォーム
いろいろ
公開中のAviutlプラグインとかのダウンロード

○Aviutl 出力プラグイン
x264guiEx 3.xx
- x264を使用したH264出力
- x264guiExの導入紹介動画>
- x264guiExの導入
- x264guiExのエラーと対処方法>
- x264.exeはこちら>

x265guiEx
- x265を使用したH.265/HEVC出力
- x265guiExの導入>
- x265.exeはこちら>

QSVEnc + QSVEncC
- QuickSyncVideoによるHWエンコード
- QSVEnc 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC
- NVIDIAのNVEncによるHWエンコード
- NVEnc 導入/使用方法>
- NVEncCオプション一覧>

VCEEnc + VCEEncC
- AMDのVCE/VCNによるHWエンコード
- VCEEnc 導入/使用方法>
- VCEEncCオプション一覧>

svtAV1guiEx
- SVT-AV1によるAV1出力
- svtAV1guiExの導入>
- SVT-AV1単体はこちら>

VVenCguiEx
- VVenCによるVVC出力
- VVenCguiExの導入>

ffmpegOut
- ffmpegを使用した出力
- ffmpegOutの導入>


○Aviutl フィルタプラグイン
自動フィールドシフト (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: aji様

clfilters 
- OpenCLベースの複数のGPUフィルタ集
- 対応フィルタの一覧等はこちら

エッジレベル調整MT (ミラー)
- エッジレベル調整の並列化/高速化
- SSE2~AVX512対応
- オリジナル: まじぽか太郎様

バンディング低減MT (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: まじぽか太郎様

PMD_MT
- SSE2~AVX512による高速化版
- オリジナル: スレ48≫989氏

透過性ロゴ (ミラー)
- SSE2~FMA3によるSIMD版
- オリジナル: MakKi氏

AviutlColor (ミラー)
- BT.2020nc向け色変換プラグイン
- BT.709/BT.601向けも同梱

○その他
Amatsukaze改造版
- AmatsukazeのAV1対応版

rkmppenc
- Rockchip系SoCのhwエンコーダ

x264afs (ミラー)
- x264のafs対応版

aui_indexer (ミラー使い方>)
- lsmashinput.aui/m2v.auiの
 インデックス事前・一括生成

auc_export (ミラー使い方>)
- Aviutl Controlの
 エクスポートプラグイン版
 エクスポートをコマンドから

aup_reseter (ミラー)
- aupプロジェクトファイルの
 終了フラグを一括リセット

CheckBitrate (ミラー, 使い方, ソース)
- ビットレート分布の分析(HEVC対応)

チャプター変換 (使い方>)
- nero/appleチャプター形式変換

エッジレベル調整 (avisynth)
- Avisynth用エッジレベル調整

メモリ・キャッシュ速度測定
- スレッド数を変えて測定
- これまでの測定結果はこちら

○ビルドしたものとか
L-SMASH (ミラー)
x264 (ミラー)
x265 (ミラー)
SVT-AV1 (ミラー)

○その他
サンプル動画
その他

○読みもの (ミラー)
Aviutl/x264guiExの色変換
動画関連ダウンロードリンク集
簡易インストーラの概要

○更新停止・公開終了
改造版x264gui
x264guiEx 0.xx
RSSリンクの表示
リンク
QRコード
QR