2008年8月12日火曜日

ffmpegでニコニコ動画用のmp4動画を作る

一昨日のエントリで愚痴をこぼしましたが、あとあとmp4で再エンコせずにしっかりアップ出来ました。

参考にしたのはこちら↓

エンコード設定(中画質~高画質) - ニコニコ動画まとめwiki: ffmpegを用いてmp4(H.264、AAC)で2passエンコードする
http://nicowiki.com/%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A%EF%BC%88%E4%B8%AD%E7%94%BB%E8%B3%AA%EF%BD%9E%E9%AB%98%E7%94%BB%E8%B3%AA%EF%BC%89.html#teeca4db

「まとめWikiじゃねぇか!」と怒らないで orz
わかってます。基本目を通すべきだってのはわかってます。でも、素で見逃してました('A`)

んで、本題。
上記ページに、ffmpegを用いてmp4で2passエンコードする場合のコマンドの例が書かれています。
コーデック指定にlibx264・libfaacと指定していますが、Ubuntu 8.04のaptでインストールできるffmpegのversionでは、そのままh264・aacと指定できます。("$ ffmpeg -formats"の出力結果参照)

<20081222追記>
Ubuntu8.04のリポジトリでなく、正確にはMedibuntuのUbuntu8.04向けリポジトリだったかと

(以降のコマンドラインの例は、私が実際に行ったものとはちょっと違っています。入力動画を切り分けるために-tオプションを使いましたが、一般例としては必要ないので割愛しました。また、ファイル名もわかりやすく変えてあります。)

私はとりあえず普通に1passで試してみました。
$ ffmpeg -i input.mpeg -i input.mp3 -s 512x384 -vcodec h264 -b 300k -r 25.00 -acodec aac -ab 64k -ar 44100 output.mp4
ビットレートが 動画300k + 音声64k = 364k となるかと思いきや、この結果出てきたファイルは570kbpsでした。
どうやら、実際に指定している値より高めになるようです。このために、初め動画のビットレートを500kと指定した時には700kbps台のファイルが出来てしまい、ちょうど良いbpsになるように何度も繰り返す羽目に。(そういうもんなのかな?)

それと2passの場合。
$ ffmpeg -i input.mpeg -vcodec h264 -r 25.00 -b 500k -s 512x384 -pass 1 -passlogfile "./passlog" -an "./1pass.mp4"
$ ffmpeg -i input.mpeg -vcodec h264 -r 25.00 -b 500k -s 512x384 -pass 2 -passlogfile "./passlog" -i input.mp3 -acodec aac -ar 44100 -ab 64k "./2pass.mp4"

こちらの場合は、動画のビットレートが指定したとおりにエンコードされました。

1passも2passもニコニコ動画に再エンコード無しでアップロード出来ました。
ただし、いずれも実際にうpした後のデータをダウンロードしてみると、元のファイルと少しファイルサイズやヘッダが違っているようです。bpsも少しだけ食い違っています。
ですが、大幅に画質が落ちたりしていないので、再エンコードはされていないと判断してます。ニコニコ動画の仕様で、適切なエンコードを行っていたとしても、うpされたデータは必ずエンコード処理に通されます(エンコードしています、とページに表示される)。その時に、実際には再エンコードされていなくても、ヘッダファイルの内容だけ書き変えたりしているのかも。

ちなみに、テストでうpしたその動画は短い上に元の映像も私のデスクトップをキャプチャした少し質の悪いものだったので、1passと2passの差がまったく分かりませんでした orz
再生時間がそれなりに長い動画でなければ違いは出てこないんじゃないかと思うので、よほど質を気にしなければ1passで十分です。

実際にうpした動画のスクリーンショット。

flvでエンコードしたが、再エンコされてしまった場合。


1passのmp4+aacで、再エンコ無しの場合。


やはり、後者の方が圧倒的に綺麗です。文字もくっきり見えて読めます。(当たり前か)


それと最後に注意事項。私と同じ轍を踏む方が一人でもいなくなるように。。。

エンコードする際には必ず、-s -b -r(画面サイズ・映像ビットレート・映像フレームレート)などの値を指定しましょう。オプション指定せずにffmpegのデフォルト値のままでエンコードして40MB以下/600kbps以下になるとしても、ちゃんと指定しないと何故かうpしたときにエンコード処理の時点でエラーで弾かれます。
一昨日あたりに失敗した時は、元の動画を作成する時点(デスクトップのキャプチャ)でサイズが512x384になるようにしていたので、ffmpegによるエンコード時点では-sオプションを使いませんでした。また、フレームレートもデフォルトのままで良いと思い、-rを指定しませんでした。
確証はありませんが、これが失敗した原因だと思います。デフォルト値と同じ値だったとしても、指定した場合としなかった場合では書き出されるヘッダが違っているのではないかと私は思っています。

それと、エンコードした動画を確認するのにTotemは使わない方が良いでしょう。Totemに限らずGstreamerを使っているプレイヤーではAdobeの純正のflash playerに比べ再生時の画質がかなり落ちるようです。
Linux上のブラウザでflashを再生するのにGnashなど使っている方もいると思うのですが、私はAdobe純正のプラグインを使っています。
http://www.adobe.com/go/gntray_dl_getflashplayer_jp
Gnashなど他のプレーヤーのプラグインと比べた訳ではないので、純正が1番と言うつもりはないですが。

兎に角、これで良画質でニコニコ動画にうpできるようになりました^^

<追記>
Ubuntuのバージョン間違えてました。この記事書いた時点では8.10は出てない出てない。

0 件のコメント: