google tag

My Soundcloud Channel --- Testing :D

Sunday, September 30, 2007

今日のffmpegでニコニコ動画用エンコのナゾ

YouTubeが火を付けた視聴者投稿型オンラインオンデマンド動画配信サービス...というか、動画サイトでるが、YouTubeを始め大小多数のサイトが乱立している状況になっているが、日本ではニコニコ動画というのが人気らしい、と思ったら、このニコニコ利用者は国内のYouTube利用者を越えたらしい。YouTubeその他と違ってサイト内の閲覧はアカウントが必要という事なのだが、最近いろんな所にリンクが貼られていたりして、それらを見られないのもなんだかな、と言う事でアカウントを取ってみたりしていた。

で、見るのはともかく、upする場合はどうなのだろうか、と言う事もあってこんなまとめサイト を参考にしながら実験してみたので、現時点で気がついた事、まとめをメモとして書いておこうと思う。もちろんLinuxで動画をエンコしてupするのが前提である。

あくまで、主にffmpegの使い方の自分用メモなのでそのつもりで...
---
  • ニコニコはYouTubeと同様 Flashのプレーヤーで動画配信するので、配信される動画フォーマットはflvである。
  • 今のところニコニコのflvの画像サイズは 512 x 384 である。
  • ニコニコは、mpg, mp4, aviなど複数のフォーマットに対応しており、何を投げてもニコニコ側のサーバーで 512 x 384 の flvにリサイズ、再エンコードされる。
  • 試しに mp4などをupしてみたが、非常にブロックノイズの目立つ、荒い動画に変換されてしまった。
  • どうもニコニコ側でリサイズ、再エンコがかかると、場合によってはYouTubeもびっくりの低画質になってしまう。
  • なので、あらかじめ512x384にリサイズしたファイルをupするのが良さそうである。
  • 高画質を狙うなら VP6 2pass で flv4 にエンコするのがよいらしい...がなんのこっちゃ?
  • flvをupする場合、そのビットレートは 600kbps (max 650k ?) が最大で、それを越えるとニコニコ側のエンコードで弾かれる。flvの場合はファイルサイズ制限40MBというのもある。
  • Linuxでも ffmpegで各種動画ファイルを直接flv (flv1)に変換できるので、これを使ってみる。
---
と言う事で以下 ffmpegの 使い方の例


元ファイル音声が mp3でレート等に問題なければそのまま copyで使える。

ffmpeg -i test21.avi -vcodec flv -b 500k -r 24 -s 512x384 -acodec copy test21.flv


単純なflv変換; あらかじめ avidemuxとかで編集してリサイズを済ませておくと楽かも。

ffmpeg -i test9.avi -vcodec flv -r 24 -b 400k -ab 128k test9.flv

音声は44.1k とか 22.05kとかでないとflvにならない様だ。 音声と映像のレートの合計を600k未満にする必要がある。 ffmpegはデフォルトで -b と -ab を設定しないとえらく低ビットレートになって画像音声共に不満足な結果になる。 -r は、まぁ 15とかでもさほど問題ないかもしれない... -ab 128ってのは音質優先、音がどうでもよければもっと下げて -bの数値を上げる。

ffmpeg -i test9.avi -vcodec flv -r 24 -b 400k -acodec mp3 -ab 128k test9.flv

とでもよいのか。 元ファイルが mp3で そっくりそのまま使うなら -acodec copy でもよい。

320x240、デジカメの動画サイズ、YouTubeサイズをupする場合、 そのまま512x384にリサイズしてもよいのだけど、やはりちょっと粗が目立つ。そういう場合は元の大きさのまま黒枠、ブランクを入れてやると動画にリサイズがかからないから劣化が目立たない。 -s オプションで元のままのサイズを指定して、-padtop -padbottom -padleft -padright で 512x384に満たない部分を埋めてやるわけである。

16:9な元ファイルだとこうなる

ffmpeg -i test23.avi -vcodec flv -b 500k -r 24 -s 512x288 -padtop 48 -padbottom 48 -acodec mp3 -ab 128k test23.flv

-b 500k ってのは微妙で、 -ab 128k と組み合わせると600kを越える... 場合によってはダメかも。

YouTubeサイズに黒枠を付加して別に編集した wav音声をlameでmp3に変換しておいてから合わせて flvに出力する...

ffmpeg -i onsei.mp3 -i douga.avi -vcodec flv -b 450 -r 24 -s 320x240 -padtop 72 -padbottom 72 -padleft 96 -padright 96 -acodec copy test25.flv

---
で、こうやって ffmpegで flvに変換してニコニコにupしてみると、確かに aviをそのままupするより綺麗にはなる...が、 600k というビットレートだとやはり 早い部分、細かい部分でかなり荒れてしまうのは避けられない。 まあしかし、遊びで使うぐらいなら、この程度でよいか、とも思う。

びっくりする程綺麗な動画を見る事もあるが、とてもかなわない。あれはやはりflv4とか、エンコの方法が違う、のだろう。linux上でああいう高画質をどうやって実現できるのか、はよくわからない。mencoder使えば出来る?
---
という事でupdateを...Debianでマルチメディア系を使うに当たって避けて通れない定番パッケージ群のおいてある..

http://www.debian-multimedia.org/

ここのmencoderを入れてみた...けど、mencoder 最大の欠点...オプションその他が多過ぎ、複雑過ぎてわけがわからん!...いちおう vp6のflv の 1passは出来た、けど画面下に緑の筋が入る、とか、エンコがやたら遅い、とか画質も良くない!...と言う事になった。2passにすれば改善はするのだろうけど、やりかたわからん... 比較してみると、 ffmpegで2passは簡単だしエンコ時間も1passあたりほぼ動画の実時間よりちょっと少ない、ぐらいなので、無理にmencoder使うこともなさそう、と言うのが今の所得られた感触だ。 正直mencoderはよくわからん。 あと非公式パッケージを入れたらライブラリー類がいくつか入れ替わって...その影響か、ffmpegがうまく動かなくなって..結局ffmpegも上記の非公式版に入れ替えるはめになってしまった... もっとも Sarge時代から引き継いでる DVDそのたの関係で 非公式パッケージも部分的に入り込んでるわけで、いまさら純潔を守れるはずもない...

と言う事で、今のところ、 音声128kb 映像500kb ぐらいで、15fps、ffmpeg 2passで flv1でのエンコが音質画質での妥協点かなぁ...( 元々 どんな形式使っても600kbってのはかなりつらい...最低1000kぐらい欲しい)