「PC関係」カテゴリーアーカイブ

ffmpeg hevc_nvencエンコード再考

暫く使ってんですが、どうも画質に納得してなかったので、改めてオプションを見直して、現在はこんな感じに落ち着きました。

ポイントはこんな感じ。

  • ビット深度を10ビットに拡張(何もしなければ8ビット)
  • 平均ビットレート指定のVBRから品質固定に。(以前のものにも-cr付けてましたが、実際は平均ビットレートでやってました)
  • yadifからbwdifに変更して、インターレース解除による60fps化(以前はframerateで60に引き上げてた。)

変わらないのは、NVENC使ってること。これはCPUがCorei5 2500kなので、パワーが足りないんです。

ffmpeg 
	-hide_banner \
	-ignore_unknown \
	-dn \
	-y \
	-vsync 0 \
	-hwaccel cuvid \
	-analyzeduration 200M -probesize 200M \
	-c:v mpeg2_cuvid \
	-deint adaptive \
	-drop_second_field 1 \
	-i "INPUT.ts" \
	-movflags faststart \
	-sn \
	-c:v hevc_nvenc \
	-pix_fmt p010le \
	-vf hwdownload,format=nv12,bwdif=1:-1:0 \
	-preset slow \
	-b_ref_mode 2 \
	-rc vbr_hq \
	-cq 35 \
	-b:v 0 \
	-af "volume=7.2dB" \
	-c:a aac -ar 48000 -ab 192k -ac 2 -bsf:a aac_adtstoasc \
	-fflags +discardcorrupt \
	"OUTPUT.mp4"

旧鯖の終了

トラブルに備えて、新鯖の裏でこっそりクローン稼働していた旧鯖が本日でお役目ごめんとなりました。

旧鯖はHP ProLiant MicroServer N54L PROLIANT-500をつかっていたのですが、当時、Amazonで15000円程度でした。調べてみたら、2014年9月に購入してたので、6年間の稼働ってことですね。

うん、想像よりも短かったな。予定では10年ほど使う予定だったのですが、技術の進歩が大きかったと言うことですな。

しかし、この6年で、メンテ、OSアップグレードで再起動はしましたが、連続する電源OFFは有りませんでした。そんな中でも一度も故障せず稼働したというのはすごいですね。録画サーバーも兼ねているので、結構な頻度でHDDも動くし、H264エンコードもしてたので、CPU100%に近い時間も結構あったと思いますが。

さて、旧鯖は本日から実験鯖に移行します。この筐体で上手く行ったら、新鯖に実装するための実験台ですね。それまではゆっくり休めてあげましょう。

あ、GROWIってのが気になってるんだった・・・(爆

H265 NVencが固まってきた

暫く試行錯誤してましたが、大体固まってきました。

目的は、録画したTSファイル、過去に録画して、あまあま(低圧縮H264)mp4を再エンコードして、容量を圧縮、保存すること。

本当なら、リサイズして1280か720位にしてビットレートを稼ぐのが良いのでしょうが、リサイズは嫌いなので、放送字のサイズを保ったままのエンコードを行います。

音声についても、基本は放送のママ。字幕なんかは切り捨ててますけど。

と言う条件でやっております。

読みにくいので、改行を挟みながらの記載にします。

/usr/local/bin/ffmpeg \
-hide_banner \
-ignore_unknown \
-dn \
-y \
-vsync 0 \
-hwaccel cuvid \
-analyzeduration 200M -probesize 200M \
-c:v h264_cuvid \
-deint adaptive -drop_second_field 1 \
-i input.mp4 \
-sn \
-c:v hevc_nvenc \
-vf hwdownload,format=nv12,yadif=0:-1:0,hwupload_cuda \
-preset slow \
-b_ref_mode 2 \
-rc vbr_hq \
-cq 30 -qmin 20 -qmax 40 -qcomp 0.6 \
-b:v 2M -maxrate 20M \
-rc-lookahead 50 \
-i_qfactor 0.75 -b_qfactor 1.1 -spatial_aq:v 1 -aq-strength 15 \
-c:a copy -fflags +discardcorrupt \
output(H265ReEncode).mp4

オプションの説明らしきモノ(誤解してる内容があると思うので、信用度は低いですよ)

  • -hide_banner:ffmpegを実行したときに出てくるVer情報とか、enableにしてるオプションの情報なんかを表示させない。
  • -ignore_unkown: 不明なストリームタイプを無視,
  • -dn: データを無効。
  • -y:出力ファイルが存在する場合、上書きする。
  • vsync 0: 映像の同期方法。 フレームをドロップ・コピーしてタイムスタンプをあわせることで映像を同期する。 (0,1,2を選べる。詳細はffmpeg Documentationを参照)
  • -hwaccel cuvid: HWエンコードでcuvidを明示.
  • -anaryzeburation 200M -probesize 200M
  • -c:v h264_cuvid(インプットファイルの前に書いてあるヤツ):入力ファイルをデコードするデコーダーを指定。
  • -deint adaptive -drop_second_field 1
  • -i input.mp4 :入力ファイル。
  • -sn:字幕出力しない。
  • -c:v hevc_nvenc:出力ファイルのエンコードをH265のNVEncで行うように、エンコーダーを指定。
  • -vf hwdownload,format=nv12,yadif=0:-1:0,hwupload_cuda:hwdownloadでハードウェアフレームをシステムメモリへダウンロードする。hwupload_cudaで システムメモリフレームをハードウェアサーフェスにアップロードする。 らしいが、詳しくは解らん。 format=nv12は色空間の指定。 yadif=0:-1:0は、インターレース解除で有名なヤツ。オプションは”一番メジャーなインターレース解除フィルタ yadif | ニコラボ”を参照して下さい。
  • -preset slow:11種類あるので、好きなのを選ぶ。詳細は”ffmpeg -h encoder=hevc_nvenc”を参照すればOK。
  • -b_ref_mode 2:Bフレーム対応のGPUだと有効にできます。(1660Superより上位のRTXシリーズだと対応してるっぽい。”ASCII.jp:GeForce RTX&新NVENC、OBSで高画質ゲーム配信できるって本当? (2/8)“を参照
  • -rc vbr_hq:プリセットのレートコントロールを上書きする。
  • -cq 30 -qmin 20 -qmax 40 -qcomp 0.6: 品質指定(0-51)、最低品質、最高品質を指定、 q値をどのくらい変動させてよいかの尺度らしい。
  • -b:v 2M -maxrate 20M:ビットレートを指定。0に設定するとcqに沿って行う(ビットレートは最大値までの間でcqを満たす値でエンコードされる)が、0以外の値を指定すると、こっちが優先で、cq値が合わなくなってくる。(主にビットレートが足りないときには指定したcq値よりも大きくなる。)
  • -rc-lookahead 50 :レート制御のために先読みするフレームの数。
  • -i_qfactor 0.75 -b_qfactor 1.1 -spatial_aq:v 1 -aq-strength 15
  • -c:a copy -fflags +discardcorrupt
  • output(H265ReEncode).mp4:出力ファイルの名前、適当にどうぞ。

追記:綺麗に再エンコできないことが多いので、完全にcqに従うように変更。それとオプションの見直しをした記事を記載しました。 → http://ponkotu.org/?p=2991

自宅サーバーのエンコード現状

2月中旬から自宅サーバーをリニューアルし、(と言っても、眠ってた第2世代インテルcore-i5 2500なんだけれど)録画サーバーもEPGStationに変更し、いろいろと設定していました。

何をしていたかというと、録画した番組をH265で圧縮するのに、CPUが貧弱なので、グラフィックボードのGPUを使ってある程度の速度を確保しながらのエンコードをしようと挑戦してました。

んで、現在の結論としては、H264のエンコードを考えなければ、保存用には向かないけど、大分良い感じだね。

という、元も子も無い(h264よりも同ビットレートなら画質が良いという理由でh265を選択している)結論に落ち着きました。

ってか、H264でも十分保存できるなぁと思ってしまったのが、運の尽き。かもしれません。

とまぁ、そういうことで、EPGStationにはH265_nvencのエンコードを実装するのを諦め、ある程度貯まってきたら、パワーのある、メインPCでTMPEGEncを使って圧縮することにします。

自動で保存するほどの設定でH265圧縮するには、サーバーのCPUを良いのにするしか無いかな。

wordpressのイベントトラッキング

ちょいと質問が来たので、わかる範囲でお答えしましょう!

イベントトラッキング:訪問者(ユーザー)がどのような行動をしているかを記録、測定するための手段。

と理解しています。(間違ってたら恥ずかしいなw

以前は、JAVAスクリプトなどを使っていたみたいですが、最近では、グーグル先生がAPIなんかを出してくれてたり、PHPやRubyなんかでもできるのかな。 まぁ、選択肢が増えてるってことだけ押さえてればOKかと。

今回は、Wordpress(以下WP)のサイドバーのリンクに埋め込みたいんだけど、html編集ができねーぞ。って話を持ち込まれたので、その点にのみ焦点を当てると、次のような解決法があります。

タグ打ちを表示するプラグインの導入!

まぁ、一番簡単な方法を。。。。

たとえば、次のようなタグを打ち込むとすると。。。

<a href=”~” onClick=”hogehoge”>~</a>

WPの管理画面から、ウィジェットの編集画面に行き、「テキスト」というウィジェットを追加したのち、そこのテキストエリアに張り付けるだけ!。。。。だったりします。Javaスクリプトくらいなら、これで動くので、問題ないでしょう。PHPとかRuby、Google APIなんかを使いたいなら、別の方法を使う必要がありますが。

TmpegEncのH265オプション

TmpegEncの話がでましたので、ついでにH265のオプションも気になったので調べてみました。
調べてみた、というよりも、先人たちの記事を丸写しした、といったほうが正しい。

参考にしたのは「私的x265解説まとめ:Nothing Here – ブロマガ」。

表の左側はTmpegEncで出力したMP4ファイルをMediainfoで設定を引っ張ってきたもの。
右にその解説。ただ、この設定がTmpegEncのどの設定項目なのかはまだ確かめていない。

wpp WPP(Wavefront Parallel Processing)、波状並列処理。
ctu=32 HEVCは動画をCTU(Coding Tree Unit:四分木型符号化単位)という正方画素ブロック単位にわけ、さらにそれをCU(Coding Unit:符号化単位)単位に分割して様々な処理を行う。PU(Prediction Unit:予測単位)とTU(Transform Unit:変換単位)が扱う領域の平坦なところをまとめて処理すればその分圧縮できるので、これの最大値が大きいほどビットレート当りの画質を稼ぎやすい。逆に複雑な部分にはより細かなCUを割り当てる。減らしたぶんだけエンコードも早くなる.
tu-intra-depth=1 ブロック階層はCUの四分木分割の回数
tu-inter-depth=1 ブロック階層はCUの四分木分割の回数
me=1 動き予測アルゴリズム。4:Full Searchは3:Starに毛が生えた程度で時間に見合うだけの出力が得られないので1:Hexか2:Umhでいいと思う。 Umhで満足できない画質なら、他の設定が悪いかソースが悪いの2択なので無理に上げる要素ではない。
subme=1 サブピクセル動き予測。数値を上げた分だけ画質も上がるがかなりエンコ時間が増える。3が実用的な値だと思う。5以上は時間が有る時にしたほうが良い。
merange=44 動き検索範囲。再生時間にもよるが増やしたぶんだけ効果はある。けど4桁5桁に設定するとエンコードが終わらないので57~99の範囲で設定するのがいいと思う。最大値にするとエラー吐いて止る。
no-rect CUに分けて処理する際に予測ブロックを正方形以外の形や長方形などにも分解できるようにする。
no-amp rectがオフだとampはオンにしても働かない。
max-merge=2 動き保障予測の範囲を決める。隣接するブロックの動き情報が似ていればそれを流用し、その位置情報を代わりに送る事で1つに統合して符号量を減らす。HEVCの強力な機能の1つで、動きの激しい動画では特に有効的。常に5でいいと思う
temporal-mvp
early-skip 最大サイズのCUを分析して省けそうな計算を取り除く。出力にほぼ差は出ないがエンコードが早くなる・・・・・・らしい。
no-fast-cbf Disable Cbf fast mode
rdpenalty=0 penalty for 32×32 intra TU in non-I slices. 0:disabled 1:RD-penalty 2:maximum
Default: 0
no-tskip Disable intra transform skipping
tskip-fast 唯一のN×Nイントラ予測(4×4ブロック)のスキップ変換を評価するパラメータ(解読不能)。
no-strong-intra-smoothing Disable strong intra smoothing for 32×32 block
no-lossless ロスレスの名のとおり超低圧縮(元の半分ぐらいの容量)でエンコしてくれる。
no-cu-lossless
no-constrained-intra Disable constrained intra prediction (use only intra coded reference pixels)
fast-intra イントラ予測では隣接する上左ブロックからの補間で予測画像を作成し、その差分を符号化することで容量を削減する初期値では有効になっており合計で10モードチェックする。–no-fast-intraで無効にすると合計で33モードチェックする。オフにしても劇的な画質向上はないけれどもエンコ時間は微増加.
open-gop
interlace=0
keyint=300
min-keyint=1
scenecut=80
rc-lookahead=10 レート制御先行検査フレーム数。先読みするスライス型フレームの最大数を決める。上げた分だけ効果はあるが最小値はbframesまでで、最大値はkeyframeを超えると効果が減る。
bframes=1 最大Bフレーム連続数。値が少ないほどエンコが早くなる。当たり前だけどb-adaptの値で効率が変化する。
bframe-bias=0 Bフレーム挿入傾向。値を増やせばよりBフレームを使うようになる。
b-adapt=0 適応的Bフレーム挿入。
ref=6 L0の最大参照数を決める。最大16まで使えるけどx265の方式ではBフレームを使用すると7までで、b-pyramidをオンにすると6までしか使用できない。それ以上にするとprofile none 、level none扱いとなりエラー吐いて止るので実質6まで。どうしても7以上使いたい場合はallow-non-conformanceをオンにする事で使える。アニメ素材や定点録画なら6にして、それ以外なら3以下でいいと思う。
no-weightp 重み付き予測を有効にする。Pスライスは1枚の画像から復号されるスライス
no-weightb 重み付き予測を有効にする。Bスライスは複数の画像から復号されるスライス
aq-mode=0 適応的QP(AQ)。複雑な部分ではビットレートを増やし、平坦な部分では減らす。 0でオフ。 1でAQをオン。 2でauto-variance AQをオン。
aq-strength=0.00 AQ強度。0にするとAQオフ。実写やゲーム以外のソースでは上げる必要はないと思う。
cbqpoffs=0 Chroma Cb QP Offset
Default: 0
crqpoffs=0 Chroma Cr QP Offset
Default: 0
rd=2 RDO(Rate Distortion Optimization)、レート歪み最適化のレベルを決める。3から5のどれかでいいと思う。
psy-rd=0.30 画質の視覚的な調整をする。人の視覚的に細かいと感じる部分をぼかす事で画質を稼ぐ。使うなら初期値か上げても1.00未満。
psy-rdoq=0.00 psy-rdのぼかしを防ぐことができる機能。rdoq-levelが1か2で使える。(?)実写や細かい粒子が漂う動画なんかでは、この値を高くすることで元の画質を保持できる。psy-rdと共に動きの激しい部分で効果がある。
signhide hide sign bit of one coeff per TU (rdo)
lft Enable Loop Filter
Default: Enabled
no-sao 画素適応オフセット(Sample Adaptive Offset)。エッジ・オフセット処理とバンド・オフセット処理で構成される。デブロッキングフィルタがブロックの境界の歪みを減らしてくれるのに対し、SAOはブロック内部のリンギング歪み、グラデーションの縞々の劣化を減らしくれる。
no-sao-non-deblock
no-b-pyramid ピラミッド参照。再生規格の問題で、PC以外で利用予定がないならオンでいい。
no-cutree x264のmbtreeのような物。動きが少なく参照数も少ないところはビットレートを少なく割り当て、頻繁に参照される部分には多く割り当てる。激しく動く動画では効果がある。オフにするメリットはエンコ時間が減らせるぐらい。
rc=2
pass
bitrate=2816
qcomp=0.60 ビットレート変動量。高い値にしておけばcqp(固定量子化量)の品質が改善する。
qpmin=0
qpmax=51
qpstep=4 最大QP変動幅。知らぬ間にコマンドから消えた。
cplxblur=20.0
qblur=0.5
vbv-maxrate=50000
vbv-bufsize=50000
ipratio=0.71
pbratio=1.30

使い慣れたと思ったら,すぐに更新ですか・・・

win7が浸透して,使い慣れてきたこの時期にメインサポート終了ですか.@5年は使えるようですが,早めに次のOSに乗り換えてくださいとのこと.

Windows 7のメインストリームサポートが1月13日終了、全サポート終了まであと5年 -INTERNET Watch.

 

さて,そろそろ真面目にLinuxに移行する時期かな・・・

ゲームをしなくなったら,windows に拘る必要も無くなってきたしね.