Youtube にアップロードする時に注意する colormatrix の設定

Youtube は動画をアップロードすると必ず再エンコードされるので、入力動画の色設定に合わせて入力し、出力の色設定を BT.709 に指定してエンコードする。

簡単なまとめ


    AviUtlで作る動画
  • x264、ffmpeg どちらでも可
    1. x264 は色変換の設定を入力は素材に合わせ、出力の設定を BT.709 に指定して、colormatrix bt709 を指定する
    2. ffmpeg も色変換の設定を入力は素材に合わせ、出力の設定を BT.709 に指定して、コマンドに -x264-params colormatrix=bt709 を付ける

    すでにある動画
    MediaInfo で matrix_coefficients の部分が BT.601 か BT.709 か 未設定のどれかを確認する

  • x264をAviUtlで使ってエンコードする場合
    1. BT.601 の場合 色変換の設定の入力を BT.601 に、出力を BT.709 に指定して、colormatrix bt709 を指定する
    2. BT.709 の場合 色変換の設定を入力・出力の設定を BT.709 に指定して、colormatrix bt709 を指定する
    3. 未設定の場合 AviUtl で読み込んで色変換の設定の入力を BT.601 と BT.709 とで AviUtl の画面で比較して正しい色のデコード方法を確認する。確認できたら上のBT.601 の場合か、BT.709 の場合の通りにする

  • ffmpegをAviUtlで使ってエンコードする場合
    1. BT.601 の場合 色変換の設定の入力を BT.601 に、出力を BT.709 に指定して、コマンドに -x264-params colormatrix=bt709 を付ける
    2. BT.709 の場合 色変換の設定を入力・出力の設定を BT.709 に指定して、コマンドに -x264-params colormatrix=bt709 を付ける
    3. 未設定の場合 AviUtl で読み込んで色変換の設定の入力を BT.601 と BT.709 とで AviUtl の画面で比較して正しい色のデコード方法を確認する。確認できたら上のBT.601 の場合か、BT.709 の場合の通りにする

  • ffmpeg単体の場合
    1. BT.601 の場合 -vf colormatrix=bt601:bt709 -x264-params colormatrix=bt709 をつける
    2. BT.709 の場合 -x264-params colormatrix=bt709 をつける
    3. 未設定の場合 AviUtl で読み込んで色変換の設定の入力を BT.601 と BT.709 とで AviUtl の画面で比較して正しい色のデコード方法を確認する。確認できたら上のBT.601 の場合か、BT.709 の場合の通りにする


  • 注意点


    • 色変換の設定を間違えた場合
      • AviUtl の色変換の設定の入力をその動画の色の設定にあわせて、出力を正しい色の設定にする
      • ffmpeg 単体でエンコードする場合は -vf colormatrix=in:out で in にその動画の色の設定にあわせ、out に正しい色の設定にする
    • AviUtl で異なる色設定の動画を編集する場合(追加読み込み、拡張編集の場合)
      予め BT.601 か BT.709 に再エンコードして統一し入力をそれに合わせて、出力を BT.709 に指定する。方法は上の『ffmpeg単体の場合』を参照
    • AviUtl の拡張編集で画像と音声、トランジションなどで動画を作る場合(動画を読み込まない場合)
      色変換の設定を入力・出力共に BT.709 に指定する

    色変換の設定方法
    AviUtl_irosettei.png


準備


必要なのが、AviUtl の環境と x264・x264guiEx か ffmpeg・ffmpegOut、ALACエンコーダー、MediaInfo、SpotColor。

AviUtlのお部屋

OSのバージョンに合わせて8bit-depthを保存する
x264.nl

右のサイドバーから x264guiEx 1.xx をクリックして保存する
rigayaの日記兼メモ帳 x264guiEx

OSのバージョンに合わせて(Static)の(Latest) を保存し、binフォルダのffmpegを使う
Zeranoe FFmpeg - Builds

右のサイドバーから ffmpegOut をクリックして保存する
rigayaの日記兼メモ帳 ffmpegOut 0.02

.7z が解凍できない場合は7-Zipを使う
7-Zip - sourceforge.jp

ALACエンコーダーはqaac_1.43.zip(2012年10月18日時点)を保存し、64bitOSならx64フォルダの中身を、32bitOSならx86フォルダの中身を使う
cabinet - qaac

動画情報を調べるツール
インストールして起動し、表示(Y)からHTMLを選択すると見やすい表示になる
MediaInfo - Download

動画の色の確認にSpotColorを使う
SpotColorのダウンロード : Vector ソフトを探す!

AviUtlでx264を使ってエンコードする


動画を AviUtl で読み込む前に MediaInfo で matrix_coefficients の部分が BT.601 か BT.709 か 未設定のどれかを確認して、色変換の設定の入力をその動画の色設定に、出力を BT.709 に指定し拡張 x264 出力(GUI)Ex でエンコードする。

音声のエンコーダーは容量に余裕があれば音声 WAV の .mkv 出力。余裕がなければ音声 NeroAacEnc の AAC-LC 320kbps の .mp4 出力にする。音声Flac で .mkv に入れると音ズレしたので非推奨。

mkvコンテナに入れる場合はWindowsの欄の a 7zip archive から保存し、mkvmerge を指定する
mkvtoolnix -- Matroska tools for Linux/Unix and Windows

mp4コンテナに入れる場合は左のサイドバーからMP4Boxを選択してダウンロードをクリック、OSのバージョンに合わせてMP4Boxを指定する
POP@4bit

Youtube は申請しなければ16分未満の動画で2GB制限があるが、ニコニコのようにビットレートを心配することはほとんどないので品質指定(crf)でエンコードし、極力高画質で且つエンコード時間の短い設定にしている。

アップロードに関するヘルプ - YouTube ヘルプ

設定は図のように変更する
AviUtl_x264_setting1.png
AviUtl_x264_setting2.png
AviUtl_x264_setting3.png

AviUtlでffmpegを使ってエンコードする


Pluginsフォルダにプラグインを入れてプラグインを使えるようにし、動画を AviUtl で読み込む前に MediaInfo で matrix_coefficients の部分が BT.601 か BT.709 か 未設定のどれかを確認して、色変換の設定の入力をその動画の色設定に、出力を BT.709 に指定。

プラグイン出力で「ffmpeg / avconv 出力」を選択。ビデオ圧縮から左の映像のコマンド欄に以下のコマンドをコピペする。次に音声エンコーダーは Youtube は強制再エンコードなので劣化のない ALAC を使う。そして出力拡張子は.m4vを指定し、OK < 保存 を選択しエンコードを開始する。

詳しい ffmpeg の libx264 の設定は Windowsのffmpegで生放送する方法 : libx264のオプション を参照。

映像のコマンド欄のコピペ例
-vcodec libx264 -preset fast -crf 20 -bf 2 -qmax 51 -qmin 10 -keyint_min 0 -x264-params colormatrix=bt709
-acodec copy


クリックして別窓表示
youtubeup_colormatrix4.png

すでにある動画のエンコード


動画の作者の場合、プロジェクトファイルから x264 か ffmpeg でエンコードする。すでに動画しかない場合は colormatrix を確認して必要ならば再エンコードする。

ffmpeg はコマンドから操作するので以下のようなバッチファイルを作り、ffmpeg と同じフォルダにおいて入力ファイル名と拡張子をテキストエディタで書き換えてバッチファイルを実行する。音声コピーで音ズレする場合は音声ALACエンコードにする。

バッチファイル例:元動画がBT.601の場合 音声コピー(ffmpeg-bt601-acodec-copy.bat)
ffmpeg -i "入力ファイル名.mp4" -vcodec libx264 -preset fast -crf 20 -bf 2 -qmax 51 -qmin 10 -keyint_min 0 -vf colormatrix=bt601:bt709 -x264-params colormatrix=bt709 -acodec copy "out.mp4"

バッチファイル例:元動画がBT.709の場合 音声コピー(ffmpeg-bt709-acodec-copy.ba)
ffmpeg -i "入力ファイル名.mp4" -vcodec libx264 -preset fast -crf 20 -bf 2 -qmax 51 -qmin 10 -keyint_min 0 -x264-params colormatrix=bt709 -acodec copy "out.mp4"

バッチファイル例:元動画がBT.601の場合 音声ALACエンコード(ffmpeg-bt601-acodec-alac.bat)
ffmpeg -i "入力ファイル名.mp4" -vcodec libx264 -preset fast -crf 20 -bf 2 -qmax 51 -qmin 10 -keyint_min 0 -vf colormatrix=bt601:bt709 -x264-params colormatrix=bt709 -acodec alac "out.m4v"

バッチファイル例:元動画がBT.709の場合 音声ALACエンコード(ffmpeg-bt709-acodec-alac.bat)
ffmpeg -i "入力ファイル名.mp4" -vcodec libx264 -preset fast -crf 20 -bf 2 -qmax 51 -qmin 10 -keyint_min 0 -x264-params colormatrix=bt709 -acodec alac "out.m4v"

バッチファイル配布先

colormatrix がわからない動画は色の差異を比較することになる。比較する色はRBGの(0.255.0)(16.180.16)と言った緑系の色をカメラで映し、AviUtl で読み込んで色変換の設定の入力を BT.601 と BT.709 とで AviUtl の画面でSpotColorを使って比較して正しい色のデコード方法を確認する。確認できたら上のBT.601 の場合か、BT.709 の場合の通りにする。

関連記事
HTML5のvideoタグによるH.264(MP4)動画の再生テスト(色の見え方テスト): さまよう金の髭

追記 2012年10月19日
コメント欄よりx264での指定方法がわかったので大幅に修正した
追記 2012年10月20日 0時28分
まだ私の理解が足りず記事が間違っていて書きなおすのに時間がかかるので、正確な情報はコメント欄を参照してください。
追記 2012年10月21日 12時39分
3度めの修正をしました。Youtube-HTML5やwebm は後日追記します。
追記 2012年10月22日 0時12分
拡張編集プラグインで異なる色設定(BT.601とBT.709)の動画を混在させると色がおかしくなる点についても後日直します。
追記 2012年10月23日 22時54分
拡張編集プラグインで異なる色設定の部分の追記と細部の修正。Youtube-HTML5やwebm はまだ不明要素が多いので後日追記予定。
関連記事

コメント

-

Youtube側での再エンコードは--colormatrixの指定は無関係に--colormatrixは未指定でエンコードされ、FlashPlayerでの再生時にBT.709でデコードされる。
よって「色変換の設定」は自動にせずにBT.709にしてエンコードしさえすればx264等の--colormatrixは未指定でもなんでもおkです。

ffmpegはちょっとわからないですが上記の事を理解した上で設定すれば問題ないかと。

ロベルト

Re: タイトルなし
コメントありがとうございます。記事を書き直しました。

-

上でコメントした者ですが伝わってないようなので再度。
x264でのエンコードの場合
FlashPlayerはcolormatrix未指定だと解像度に関わらず常にBT.709でデコードします。
YouTube側のエンコードは解像度もcolormatrixの指定も全く関係なく、すべてcolormatrix未指定でエンコードします。

なので720p以上でも720p未満でも色変換の設定、出力はBT.709でないと正しくなりません。
さらに色変換の設定の入力側はソースに合わせて正しくなるように変える。解像度のみで判断するのではなくほかの要素も含めて判断すべきです。

金の髭

とりあえずsmpte240mは使っては駄目です。以前のこちらのコメントを参照。
使うならbt709ですね。ただ「-vf colormatrix=~」は使い方に注意が必要です。後述します。
  http://looooooooop.blog35.fc2.com/blog-entry-903.html#comment505

Youtubeにアップする場合に色を正しくするために大事になるのは、

  条件1.「投稿動画の映像の色データ(YUV,YCbCr)そのもの」をBT.709にすること。

  条件2.カラーマトリクスフラグ(x264で言うところの--colormatrix)は、
      Youtube的には付けても意味はないので別にいらないが、
      一応 --colormatrix bt709 に相当するオプションをつけておくとよい。

  条件3.条件1、2は動画の解像度には関係なく、どのようなサイズの動画でも
      これらの条件を満たす必要がある。

の3条件になると思います。
Youtube(ニコニコ動画の再エンコードもそうですが)は、
  1.「元動画の映像の色データ(YUV)」をそのまま流用して再エンコードを行う。
    つまり元動画がBT.709ならBT.709になるし、BT.601ならBT.601になる。
  2.再エンコードを行う際、カラーマトリクスフラグはつけない。
という方法で再エンコードを行うためです。
更に、FlashPlayer11.4では
  「カラーマトリクスフラグの指定がない場合は、BT.709としてデコードする」
というデコード仕様になっていますので、これらを踏まえると、Youtubeでは
  「投稿動画の映像の色データがBT.709でないと正しい色で再生できない」
ということになります。
以下、AviUtlとffmpeg(コマンドライン)の場合に分けて説明します。

金の髭

----------------------------
Aviutlでエンコードする場合
----------------------------
AviUtlを使う場合の手順は以下のようになります。

  手順1.うまいこと元動画や元映像を読み込み、プレビュー画面で
      正しい色になっていることを確認する。
      ポイントになるのは「入力プラグイン」「設定→色変換の設定→入力」の2つ。
      入力プラグインはL-SMASH Worksを使っておけばたいていはOKのはず。
      色変換の入力設定は、解像度によって色空間が決まっているわけではないので、
      「720P以上ならBT.709」といった判断はしないほうがよい。
      例えばニコニコ動画から落としたMP4は解像度に関わらず
      BT.601になっていることが多いはずです。
      (過去の経緯からニコニコ動画まとめWikiでそう推奨していたので。)
      MP4の場合はMediaInfoで「matrix_coefficients」がBT.601かBT.709を調べ、
      それにあわせるとよいでしょう。
      (matrix_coefficientsはカラーマトリクスフラグのことです)
      matrix_coefficientsの指定がない場合は正しい色空間が不明なので、とりあえず
          「720P以上だから多分BT.709かなあ」
          「720P未満だから多分BT.601かなあ」
      という推測でやってみて、おかしいならもう一方に変えるなどしてみる。
      とにかくプレビュー画面で正しい色に見えればそれでよいです。
  手順2.「設定→色変換の設定→出力」を、解像度に関係なく「BT.709」にする。
      (これによりAviUtlは「BT.709のYUVデータ」を出力してくれる)
  手順3.出力プラグインの設定を行い、出力する。

     ●x264guiExを使う場合
       3-1.colormatrixの指定を「bt709」としてカラーマトリクスフラグを設定する。
           (なくてもいいけど一応)
       3-2.他のオプションは自分が求める品質にあわせて適当に設定する。

     ●ffmpeg/avconv出力を使う場合
       3-1.オプションに
             -vf colormatrix=bt601:bt709
           をつける必要はない。というかつけてはいけない。これは
             「渡されたBT.601の色データをBT.709に変換するよ」
           というオプションだが、そもそも手順2によってAviUtlが
           BT.709のYUVデータを渡してくれるので、ffmpegで変換してはいけない。
       3-2.念のためオプションに
             -x264opts colormatrix=bt709
           をつけてカラーマトリクスフラグを指定しておくとよい。
           (なくてもいいけど一応)
       3-3.他のオプションは自分が求める品質にあわせて適当に設定する。

金の髭

-------------------------------------------
ffmpeg(コマンドライン)でエンコードする場合
-------------------------------------------
ffmpeg(コマンドライン)の場合も
  「元動画がBT.601かBT.709か」
を最初に判断しておく必要があります。
AviUtlの手順1にあるのと同様、MediaInfoでmatrix_coefficientsを調べるとか。
それによってバッチファイルの内容が変わります。

  バッチファイル例1.元動画がBT.601の場合(音声コピー)
   ffmpeg -i "入力ファイル名.mp4" -vcodec libx264 -preset fast -crf 20 -bf 2 -qmax 51 -qmin 10 -keyint_min 0 -vf colormatrix=bt601:bt709 -x264opts "colormatrix=bt709" -acodec copy "out.mp4"

  バッチファイル例2.元動画がBT.709の場合(音声コピー)
   ffmpeg -i "入力ファイル名.mp4" -vcodec libx264 -preset fast -crf 20 -bf 2 -qmax 51 -qmin 10 -keyint_min 0 -x264opts "colormatrix=bt709" -acodec copy "out.mp4"

元動画がBT,601の場合は、「-vf colormatrix=bt601:bt709」によって
  「BT.601のYUVデータをBT.709に変換する」
という処理が必要ですが、元動画がBT.709であれば変換は不要です。
「-x264opts "colormatrix=bt709"」はカラーマトリクスフラグの指定なので
無くてもいいのですが一応つけています。

あと色のチェックにはSpotColorというツールも便利かも。

金の髭

★追記
  上の3つのコメントはYoutubeでFlashPlayerで見る場合の話ですが
  HTML5プレーヤーを有効にしてみると、またちょっと話が違う模様。
  BT.709で投稿した場合、HTML5だと色がおかしくなることがあるような・・・。
  HTML5プレーヤーでの詳細は調査中です・・・。

金の髭

★追記2
 YoutubeでHTML5プレーヤーを有効にした場合、多くの環境ではWebM形式の動画を再生することになると思います。
 しかしWebMは、BT.601形式しかサポートしていないらしく、デコードもBT.601で行われます。
 本来なら、BT.709で投稿された元動画をYoutube側でBT.709→BT.601変換したうえで
 WebM動画を作っていれば問題ないはずなのですが、Youtubeは現時点では
 この変換を行っていないようで、BT.709のデータのままWebM動画を作成しているようです。
 そのため、HTML5プレーヤーを有効にしてWebM動画を視聴した場合、
 BT.709のデータをBT.601としてデコードしてしまうため色が変わって見えてしまいます。

要するに
   ●FlashPlayerで正しい色で見るためにはBT.709で投稿する必要がある
   ●しかしBT.709で投稿するとWebM動画の色はおかしくなってしまう。
   ●BT.601で投稿すればWebMでの見え方は正しくなるがFlashPlayerでの見え方はおかしくなってしまう。
というのがYoutubeの現状のようです。

WebMで見る人は割と少ないでしょうし、FlashPlayerでの見え方を優先して
BT.709で投稿するしかないのかなと思います。

金の髭

★追記3
 なお、「HTML5プレーヤーを有効にして、なおかつWebMではなくH.264動画を再生させる方法」が
 よくわからなかったのでその場合に実際にどうなるかはわかっていませんが、
 実験的に、HTML5のvideoタグでH.264のMP4を並べたページを作ってみました。
    http://goldenhige.cocolog-nifty.com/html5/html5videotagtest.html
 少なくともWinXP SP3+Google Chrome 22.0.1229.94mの環境で見た限りでは、
 BT.601のMP4のほうが正しい色で見えているようです・・・。
 つまりBT.601でデコードされてるってことですね・・・。
 ということはYoutubeでHTML5プレーヤーを有効にして、なおかつ
 WebMではなくH.264で再生できたとしても、BT.601でデコードされるため、
 BT.709で投稿した動画は色がおかしくなってしまうかもしれません・・・。

 他の環境でどうなるかはわかりませんが、ややこしいですね・・・。
 とりあえず現状ではFlashPlayerで正しく見えるようにBT.709で投稿し、
 HTML5についてはある程度あきらめて様子を見るしかないでしょうか・・・。

 私もHTML5の対応状況等はよくわからないので詳しい方がいれば教えていただきたいです。

金の髭

修正予定とのことなので重複してしまうかもですがコメントを。


●「簡単なまとめ」の最初にある「AviUtlで作った動画」で
 「色変換の設定を入力・出力の設定を BT.709 に~」とありますが
 BT.709にするべきなのは出力側だけで、
 入力のほうは「素材にあわせる」ではないかと。
 (「AviUtlで作った動画」とは「拡張編集等でゼロから動画を作る場合」のことでしたっけ?)

●「720P未満の~」の部分は関連性がなくなったので削ってもよいかもと思いました。

●「注意点」の最初のほうにある「拡張編集の時は色変換を全てBT.709」というのは
 出力を必ずBT.709にするだけでよく、入力は素材にあわせる形になるかと思います。
 (おそらくこれは修正予定項目だと思いますが念のため)

-

現在のffmpegでは「-x264opts」から「x264-params」に変更されているようです。
詳細は「ffmpeg -h encoder=libx264」にて確認してください。

ロベルト

Re: タイトルなし
報告ありがとうございます。修正しました。
非公開コメント

プロフィール

ロベルト

お問い合わせはこちらまで
robelt2525[at]gmail.com

中の人 @nico_lab

広告リンク
Amazon
楽天市場

ブログ更新用 @blo_nico_lab

詳しいプロフィールはこちら

当ブログは、Amazonアソシエイトに参加しています。