ffmpegの新しいencoding設定がようやく固まってきた感。今回はこれまでのH.264+AACという出力からAV1+OPUSへと世代交代させることが目的なのでそれをゴールとして同等以上の結果を目指した。
順番は逆になってしまうけれど最終段のencoder設定から見ると、libsvtav1のoptionは「-crf 30 -preset 9 -svtav1-params “lp=4:pin=1”」、libopusは「-b:a 128k」だけ指定してます。
libsvtav1のcrfは28~34くらいの間で比較してみたけれど、30を超える値だとやはり全体的な画質劣化(画面が濁る感じ)が気になり、逆に30未満の方はそこまでメリットを感じなかったのでとりあえず30で。presetはCPUをlimitした状態でギリギリ我慢できる処理時間から。
H.264と違いAV1はinterlace出力できないのでそこをどう解くかが今回の設定の肝ですが、以前書いたようにfilter chainはfieldmatch+decimate+yadif+fpsが基本。具体的な設定としては(続)
-vf “fieldmatch=combmatch=full:cthresh=10,decimate=dupthresh=3.0:mixed=1,yadif=1:-1:1,fps=60000/1001”
こんな感じ。
fieldmatchは60i/30p/24pソース混在の60iが対象なのでcombmatch=fullで、cthreshをdefaultの9から1つだけ上げて10としています。9のままだとテレシネソースでもstill interlaced表示が出ることが多々あり10でほぼ消えました。
decimateはテレシネソースやそれ以外が混在しているのでmixed=1は必須で、その場合に重要となるdupthreshはdefaultの1.1だと明らかに小さすぎる(テレシネソースでもほとんど重複判定されない)ので現物合わせで3.0に。これでほぼ綺麗にdetelecineできました。
なお-loglevel debugをつけてdecimateの挙動を確認したりソースを読んだりしている中でひとつ気になる挙動があったので、下記のような小さいpatchを作って当てています。これでほぼ完璧にdetelecineできるようになった。
https://github.com/gitune/decimate-patch
上記のような設定で画質としては同等以上になった(特にテレシネソースではdeinterlaceではなくdetelecineしているので画質は向上している)と思うんだけど、出力file size…というかbitrateはほぼ半減しています。
実際使ってみて、やはりAV1はH.265/HEVCとだいたい同じくらいの効率に思えますね。オープンであるが故の取り回しの良さ(Chromeで再生できる)とか、今だとSVT-AV1がある分、AV1の方が使いやすいかな、って感じか。libx265も悪くないけどね…
そういや1080/60pなAV1+OPUSな動画、MediaTek Helio G99なミニタブでもほぼ問題なく再生できるんですね。このチップ、AV1のハードウェアデコーダは積んでなかったはずなので再生の方はそんなに重くはない、ってことか。
この時期の群発地震というとどうしても13年前のことを思い出してしまうな。
そういやSVT-AV1をCPU core固定で使っていると、半分とはいえそのcoreを占有して動くので(realtimeじゃなく時分割スケジューリングにしてるのに!niceも19なのに!w)、他のprocessの影響をほとんど受けないのが面白い。エンコード時間の均一性が高い。
CGアニメのガールズバンドもの、というともはや定番化したジャンルな気もするけれど、この作品はリミテッドアニメに寄せるのではなくCGアニメとしての良さを追求しているように見えてちょっと気になってる。
https://www.youtube.com/watch?v=fONC92G3nNE
このアニメ、9か月も前から↓のようなMVをずっと上げつづけてて、実はすごく力の入った作品なのかもしれない。
https://youtu.be/dDwN4MgcIlU?si=yiWOICwztGIrJX2q
crf 30だとやっぱりちょっとbitrate足りてないかなぁ。28にしてみる。
あと、fieldmatchが画面に文字がたくさん表示されているような時に櫛を誤判定してstill interlacedと言っていたので、blocky=64:combpel=320を追加してみた。櫛状態判定ブロックの縦サイズを4倍にして閾値も4倍に。はてさて。