FFmpegで動画をアップコンバートしてちょっと綺麗にする

DNNを用意するのは面倒だったのでやっていない / 2023-02-16T00:00:00.000Z

先日「海底にも地形はあるという」という記事を投稿しました。その記事の中ではUSGSが作成したロサンゼルス周辺の海底地形図に関する動画をアップコンバートし、フレーム補間を行ったものを掲載させていただきました。というわけで今回はどのように動画をアップコンバートしたのかについて簡潔に書いていきたいと思います。

結論

  1. 低画質の入力の画素を補って高画質に
  2. 入力の特性に合わせて様々なフィルターがある

アップコンバート on FFmpeg

そもそも「アップコンバート」とは何でしょうか。簡単に言えば「低画質の入力を適切に補ってより高画質な出力にすること」です。例えば360pの動画を1080pにすることなどが挙げられます。単に低画質の入力を高画質の出力とすることは-vf scale=を用いて簡単に行うことが出来ます。しかしこれでは画素数が増加するだけで、動画としてのクオリティは低画質のままです。場合によっては圧縮の都合により細部が潰されることで、クオリティが悪化してしまうことさえあります。

しかしながら適切に画素を補ってあげることによって、高画質で制作されたものには当然ながらかなわないもののそれに近づけることは出来ます。そのためのアルゴリズムは様々なものが提案されており、そのうちのいくつかはFFmpegで利用することが出来ます。

今回は「 xBR 」と呼ばれるフィルターを用いて高画質化していこうかと思います。処理の映像はこちら処理の映像はこちらです。入力する映像はアニメーションに近しい特性を持っており、本来ならば深層学習を活用したsrフィルターを用いるべきでしょう。しかしながらWindows向けに一般公開されているビルド( ffmpeg version 6.0-full_build-www.gyan.dev )では学習済みモデルが組み込まれておらず、これを用いるためには自前でビルドを行う必要があります。それをすればいい、と言えばそれまでなのですが極めて面倒であるため、最初から使用できるxBRフィルターを使用することにしました。ではコマンドを紹介していこうかと思います。

ffmpeg -i input.mov -an
\ -vf xbr=n=4 -pixfmt yuv420p
\ -c:v h264_qsv -tune animation -qmin 18 -q 23
\ -preset slower -movflags +faststart output.mp4

一番初めの入力と最後の2行は(人によって大きく異なるでしょうが)もはや「お決まり」といえるコマンドでしょう。ファイルサイズとクオリティのバランスを考え、扱いやすいようなものとなっています。肝心なものは上から2行目の-vf xbr=n=4という部分です。これは何倍に拡大するかということを指定するもので、2倍から4倍、すなわちnの値に2から4をしていすることが可能です。このようなフィルタはあまりに大きな拡大率を指定してしまうとあまり良好な結果が得られないことが知られています。求めるクオリティと画素数を考えて指定することを強くおすすめします。今回はお試しなので、4倍にするように指定しておきました。

このフィルターを適用すると自動的に出力されるものの縦横の画素が自動的に定まります。例えば360:480の動画を4倍にアップコンバートすると1080:1920のものが出てきます。当たり前と言えば当たり前なのですが、気になる人は-vf scale=で調整してください。

また念のため色域を具体的に指定してあります。これは万一SDRで扱える色を超えてしまったとしてもそれを無理やり補正するという保険という意味と、扱いづらい色域にされては困るという現実的な意味があります。普段は適当に指定してもいい感じになりますが、念には念を入れてこのようなものとしました。

Direct link of this video on YouTube

というわけで出来た動画は上のものになります。この動画には今回の記事で紹介した処理に加えてフレーム補間を行っているため、きちんとした紹介にはなっていないかと思いますが、元の動画と比較してどのような効果があるのかの参考にしていただければ幸いです。

関連リンク

最後に

基本的にピクセルアートをアップコンバートすることに適したフィルターであるため、思ったより微妙な効果しか得られませんでした。といっても明らかに与えた素材が悪いので、フィルター側が想定している素材を与えてあげましょう。