「Linux」カテゴリーアーカイブ

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"

QSV、NVENC、とはなんぞや。(エンコード関連)その3

しばらく使いながら、少しづつ変更しながら、やっと落ち着いたエンコードが次になります。

基本は、リサイズせず、大きな画像崩壊を起こさない程度で、30分で400MB程度に収まるように(大体ビットレートが1500kbpsくらい)しています。

最初はCQ(品質指定)で行う予定でしたが、私の理解が追い付かず、細かい指定がうまくできなかったのでビットレート指定でのVBRで行っています。

/usr/local/bin/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 入力ファイル /
	-movflags faststart /
	-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 23 /
	-qmin 15 /
	-qmax 40 /
	-qcomp 0.6 /
	-b:v 1.5M /
	-maxrate 20M /
	-rc-lookahead 50 /
	-i_qfactor 0.75 /
	-b_qfactor 1.1 /
	-spatial_aq:v 1 /
	-aq-strength 15 /
	-af volume=0dB -c:a aac -ar 48000 -ab 192k -ac 2 -bsf:a aac_adtstoasc /
	-fflags +discardcorrupt /
	出力ファイル

解説は必要ないと思いますが、数か所あります。

  • -vf:インターレース解除をするために、yadifを指定しています。hwdownload/hwuploadの意味がいまだに解ってないので、実際に動かしてエラーが出なかったこの書き方になってます。間違っているかも知れません。引数なんかは、 ニコラボ | niconico と ffmpeg のことを中心に書いてる を参考にしました。
  • -af:音声についてですが、音量が小さいものもあったので、ffprobeをつかって、音量をなるべく大きくできるようにしてます。今回は0dBに固定してますが、実際は変数にして放り込んでます。
  • -b:v 1.5M -cq 23 -qmin 15 -qmax 40 -qcomp :本来なら、cqを指定した場合は、品質指定モードなので、ビットレートは指定せず、0を引数で与えるのが正しいそうですが、それでは希望通りにいかなかったので、やむを得ずビットレート1.5Mを指定しています。この場合、cq、qmin,qmax,qcompはお飾りとなって、意味を持ちませんが、おまじないとして残しています。意味はないです。

ちなみに、cq38くらいにすれば、ビットレート2Mくらいになりました。

メモ代わりのwikiに変わって

今までPukiWikiで一般公開しない情報を整理してメモ代わりに使っていたのですが、10年も経てばもっと良い物が出てるだろうと思って、代わりになる物を探してみました。

行き着いた先はGROWI。よく分からないうちに始めましたが、使ってみると使い心地がかなり良いですよ。markdown記法と言うのがpukiwiki記法に比べて楽というのもあるのでしょうが。

システム自体はdockerというのを使ってるっぽいのですが、まっっっったく解ってませんw。IT技術者じゃないからね!

ということで、暇になったらdockerってヤツを少し勉強してみようかと思ってるところ。

その前に、本業の生涯学習しないといけないんだけどね! ま、こちらは後回しにして(ぉぃ

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:出力ファイルの名前、適当にどうぞ。

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

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

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

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

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

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

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

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

Ubuntu 18.04.4 LTS にTV録画環境をインスト その2

タイトル通りです。忘れても良いように、メモとして残すだけなので、正確じゃ無いと思いますが、気にしないように。ココの内容を再利用する方は自己責任でお願いします。私は責任取りませんので悪しからず。

以下のソースコード中に出てくる「&」が「&」に置き換わってしまっているので、コピペするときは十分注意すること。

viでの痴漢コマンドは、

%s/&/&/g

でよかったはず・・・たぶん。バックスラッシュ必要だったっけな・・・・(汗

続きを読む Ubuntu 18.04.4 LTS にTV録画環境をインスト その2

Ubuntu 18.04.4 LTS にTV録画環境をインスト その1

TV環境だけじゃ無くて、wordpressなんかも入れるので、以下にリストを書いておこう。

  • wordpress
  • tt-rss
  • pukiwiki
  • syncthing
  • mirakurun
  • EPGStation
  • ffmpeg EVENC可能Ver
  • fail2ban
  • plex

不精者なので、bashファイルとしてソースをのせていくが、信じないで下さい、致命的なエラーが含まれているかもしれません。私は責任とれませんので、信用しないように。

Ubuntu 18.04.4 LTS にTV録画環境をインスト その2 に続く

サーバー復活

あちこちにガタが来ているようです。諦めて、新しい筐体を準備しないといけないようですね。hddは定期的に交換してたんですが、マザーボードが疲れてきているようです。メモリもね。

ってことで、家中からかき集めてもう一台くみ上げて新しいサーバーにすることにします。

さて、何日かかるやら・・・・

温度の不思議

仕事中に簡易懸濁法について話をすることがあります。そのときに使用するお湯の作り方で、ポットのお湯(95度)と水道水(約18度)を等量混合で55度程度のお湯が出来ますよ。と説明するんですが、学生時代にやってた家庭教師の時の学生からの質問をいつも思い出します。

中学2年生「100度のお湯と氷を同量混ぜても50度にならないのはなぜ?」 -> 大凡10度の水になるはず。(氷の融解熱が大凡333J/gとすれば、前記の値くらいになるはず・・・)(1)

この質問は、理科の授業で反応熱を勉強し始めた頃に出て来てた気がします。たぶん・・・。んでもって、ちゃんと説明して理解してもらった後に、次の問題を出すとチンプンカンプンになってしまうという罠があります。皆さんご注意を・・・

「100度のお湯と0度の水を同量混ぜると50度になる?」 -> 50度の水(お湯)、ただし水とお湯以外に熱が逃げなかったとする。(2)
「質量100gの0度の水と-15度の氷を同重量混ぜたら何になる?」 -> 0度の氷水、ただし(以下略 (3)

 

 

つまり、氷と水の違いが液体、固体だけじゃなくて、エネルギーが違うんだぞってのを教える難しさがよくわかる内容なんですよ。うん。今だから、難しいのが解るw

 

続きを読む 温度の不思議