x264での動画配信

Tomohiro Matsuzawa
FRESH LIVE developers Note
11 min readFeb 19, 2018

OBSStreaming with x264というブログが面白かったので翻訳してみました。この日本語訳を公開することにより、FRESH!で配信して頂いている方に、少しでもお役て立てれば幸いです。

原著者の許可取得済み。(Thank you, Fenrir!)

はじめに

動画エンコードについてもっと知りたいですか? 限られたPCハードウェアとネットワーク通信の下、できるだけ良い品質で配信するためにどのように設定すべきでしょうか?まずTom Scottの動画を見てみましょう。

雪と紙吹雪がどうしてYouTubeの画質を台無しにするのか

(*訳注 カーソルを動画上に置いて、”設定”アイコンをクリックし、”字幕”→”日本語”の順に選択してください。)

彼は動画エンコードの仕組みを手短によく説明しており、これから話す内容と用語についての理解に役にたつと思います。見終わりましたか?それでは始めましょう!

詳細に入る前に、ここでは対象外のことについて先に述べておきます。まず、ここでx264の仕組みを技術的に解説するつもりはありません。その目的のためには、もっと良い解説書がたくさんあります。x264のコアな部分に興味があるなら、doom9 forumsFFmpeg docsx264 websiteなどから始めるといいでしょう。また、これは「最高の設定」のガイドブックではなく、特別この設定を勧めるということはしません。読者が動画エンコードの一般的な仕組みについて理解し、設定関係で起こり得る問題を特定して、どこを直したら良いかが分かるようになるためにこれを書きました。

繰り返して言いますが、「最高の設定」のようなものは存在しません。設定は、個々のユースケースによって変わってきます。例えば、私は配信するものに応じて、3つの異なる設定を使い分けています。一つ目が動きが激しいゲームを配信するための設定で、二つ目がデスクトップアプリケーションを配信するための設定で、三つ目は生の映像を配信するための設定です。OBSを使うこと、もしくは配信すること自体が初めてなら、「ツール」メニューから見つかるOBS Studioの自動構成ウィザードと呼ばれる機能を使うとよいでしょう。これを使えば、お使いのシステムやインターネット接続をテストして、エンコードと通信安定性の両方の観点から、処理能力を判定することができます。しかし、最高の設定を見つけるためには、何度もテストを繰り返すしか方法がありません。

ここでは、x264エンコーダでのストリーミングに絞っています。ほとんどのOBSユーザーは配信用にx264を使っています。ローカル録画の用途では、実際に使われているものよりはるかに良いエンコーダの選択肢があり、大抵の場合は、ハードウェアエンコーダがより適しています。ローカル録画については、ここが参考になります。
http://obsproject.com/forum/resources/obs-studio-high-quality-recording-and-multiple-audio-tracks.221/

動画エンコードは非常に高負荷の処理です。特にリアルタイムでエンコードする場合は、そのことを理解することが重要です。Nvidia NVENC、Intel QuickSync、AMD VCEのようなハードウェアエンコーダを使うと、動画エンコード用に特別なハードウェアを使うことができるので、負荷を軽減することができます。一方、x264のようなCPUベースのエンコーダに比べると大抵の場合、同じビットレートでの画質は悪くなります。動画配信では、ビットレートが制限されることが多いので、今のところx264が最高の品質で配信するための最も良いオプションとなります。

市販のPCが動画をエンコードして生配信できるほど性能が向上したのは、ここ数年の話です。8年前のデュアルコアのPentium CPUを使って、1080p 60fpsの動画がうまくエンコードできないのはなぜかと思ったら、このことを心にとめておいてください。市販の最高性能のCPUでさえ、高解像度、高フレームレートで配信するのは、なかなか難しいのです。

これからx264エンコーダの2つの重要な要素について見ていきましょう。プリセットとビットレートです。

プリセット

x264にはいくつかのプリセットが存在します。CPU負荷が低いものから高いものへと順番に並べると、ultrafast、superfast、veryfast、faster、fast, medium、slow, slower、veryslow、placeboとなります。

プリセットとはまさにその名の通り、x264用に前もって調整された設定値の組み合わせのことで、それを使うことにより手動で細かい調整をする必要がなくなります。これらの設定値の組み合わせは、多くの人にテストされており、一般的用途で、エンコーダの性能を十分に引き出すことができます。設定値の詳細はここに書かれています。
http://dev.beandog.org/x264_preset_reference.html

基本的に、(ビットレートなどが)全て同じなら、CPU使用量が低ければ画質は悪くなり、CPU使用量が高ければ画質はよくなります。使用するプリセットにより、エンコーダがそれぞれの動画フレームを圧縮して画質を良くするために費やす時間が変わってきます。パフォーマンス向上のために、時々CPU使用量を抑える必要があります。平均的な市販のCPUでは、高負荷のプリセットを効率的に使えないことが多いです。

最後に注目してほしいのは、mediumより低いプリセットはどれも、CPU使用量に対する画質向上効果が低く、余っているCPUサイクルを動画配信のために使う価値は低いのです。2つの映像を並べて目を凝らして見ない限り、違いが良く分かりません。とはいっても、(電気代は別として)使用しているCPUで処理できるのなら、それらのプリセットを使わない理由はありません。

実際にどのくらい見た目が変わるかの比較例をいくつか以下に示します。

x264、1920x1080、60fps、2500kbpsビットレート, 高精細で動きが少ないシーン

x264、1920x1080、60fps、2500kbpsビットレート、動きの激しいシーン

これらすべての試験は、全く同じソース動画とビットレートの組み合わせで、プリセットだけを変更して実行されたものです。

しかし、これらの結果はエンコードしようとするプリセットと解像度/フレームレートの組み合わせが、PCの処理能力を超えていないことが前提になっていることを知っておくことは重要です。もしPCの処理能力を超えてしまうと、映像がスキップされたり、画像が歪んだりすることに気づくでしょう。この時OBSにEncoding overload!と表示されます。この問題を簡単に解決する方法は、解像度やフレームレートを下げることにより負荷を落とすことです。下位のプリセットに変更する必要があるかもしれません。エンコード問題へどう対処したらよいかの詳細なガイドが下記に書かれています。
https://obsproject.com/wiki/General-Performance-and-Encoding-Issues

ビットレート

CPUがそれぞれの動画フレームを圧縮するのに費やすエネルギー量だけが、画質を決定する要因というわけではありません。ビットレートも重要なのです。ビットレートにより、それぞれの映像フレームにどれだけの情報をつぎ込めるのかが決定されます。もしそれぞれの映像フレームにより多くのデータをつぎ込めるのなら、圧縮するのにそんなにCPUを使う必要はないのです。ビットレートを上げるだけで、それぞれの動画フレームの見た目をよくすることができるのです。Tom Scottが他の設定はそのままで、ビットレートだけを下げて、映像の見た目がどのように変わっていったか覚えていますか?同じことが逆にも言えます。ビットレートをあげれば、画質を上げることができるのです。

(superfastのような)低CPU負荷プリセットを使って、CPUリソースをそんなに使わなくても、高画質の映像を得ることができるのです。必要なビットレート量は、配信しようとする映像の解像度とフレームレートに依存することに注意してください。ultrafastプリセットを使って1080p 60fpsの映像を4000kbps程度のビットレートで配信すれば、画質はそんなに良くなりません。まずは、YouTubeのエンコーダの設定を参考にすると良いでしょう。下記のリストは若干異なっていて、私の個人的なお勧めのスタート値です。

╔═══════════╦════════════════════╦═══════════╗
║ 解像度 ║ ビットレート ║ フレームレート ║
╠═══════════╬════════════════════╬═══════════╣
║ 853x480 ║ 800 - 1200 kbps ║ 30 ║
║ 1024x576 ║ 1000 - 3000 kbps ║ 30 ║
║ 1280x720 ║ 3000 - 5000 kbps ║ 30 ║
║ 1920x1080 ║ 5000 - 8000 kbps ║ 30 ║
║ 2560x1440 ║ 8000 - 12000 kbps ║ 30 ║
║ 3840x2160 ║ 12000 - 20000 kbps ║ 30 ║
╚═══════════╩════════════════════╩═══════════╝

これらはx264エンコーダでveryfastプリセットを使い、動きは少な目のものから真ん中くらいのシーンであることを想定しています。(ファーストパーソン・シューティングゲームのように)1080p 60fpsで動きが激しい場合は、スムーズに再生するためにはveryfastでは、8000kbps以上のビットレートが必要になるでしょう。逆に、(リアルタイムストラテジーゲームやPhotoshopでのお絵かき配信のように)動きの少ない映像であれば、そんなにビットレートを高くしなくても大丈夫かもしれません。この表は、どの程度の値から調整を始めたらよいかの目安です。

低負荷エンコーダプリセットでビットレートを上げる場合と、高負荷プリセットでそれ相応のビットレートを使う場合では、最終的な結果は若干異なってくるかもしれません。しかし、目的は、CPU負荷とネットワーク帯域をトレードしてだいたい同じ画質を得ることです。画質、CPU負荷、自分とストリーミングサービス間で出せる通信速度のすべての観点からどの設定がうまくいくのか試してみることをお勧めします。

以下に、動きが少ない高精細シーンと、動きが激しいシーンの両方の場合で、x264のveryfastで同じシーンをエンコードした場合の比較を示します。

x264、1920x1080、60fps、veryfastプリセット, 高精細で動きが少ないシーン

x264、1920x1080、60fps、veryfastプリセット、動きの激しいシーン

先のプリセット試験と同様に、これらは全く同じソース動画とプリセットの組み合わせで、ビットレートだけを変更して実行されたものです。

これを読むことにより、動画エンコードの基本的な仕組み、ビットレートの重要性、OBSでこれらの設定を変更することにより映像とPCパフォーマンスに与える大まかな影響をより理解していただくことを期待しています。もう一度繰り返しますが、配信する映像の完璧な設定を見つけるためには、とにかくテストを繰り返すことです。質問があれば、私たちのフォーラムチャットサポートがいつでも利用できます。

それでは、よい動画制作を!

--

--

Tomohiro Matsuzawa
FRESH LIVE developers Note

Software engineer at Twitch/Amazon IVS. Specializing in Live video streaming.