iPhoneは現状Flashに対応してないため、ニコニコ動画をSafariから
見ることが出来ないのは周知である。
一応公式のアプリが開発されているとのアナウンスがあったが、現状
まだ出てきてない。
・
http://www.itmedia.co.jp/news/articles/0810/30/news063.html(itmedia)
一方、iPhoneにはQuickTimeが載っていて、SafariからWeb上のmp3やmp4などの
動画や音声ファイルをストリーム再生が出来る。(DLは出来ない)
見たい動画を公開サーバー上に置けば、iTunesで同期することなく
そのファイルを見ることが可能になる。
これを利用して、自分で用意したサーバーでダウンロード&エンコードの
キャッシュ動作をさせて、公開Webアプリケーションからアクセスする
mmNicoβ、mmNicoβキャッシュサービスがある。
・
http://moto-maka.net/touch/mmnicohelp/index.html(mmNicoβサポートページ)
実は以前からPSPのWifiで同様に、サーバーで再エンコードをしてPSP側で
ダウンロードしPCを経由しなくても済む仕組みを用意したいと考えていた。
そこで、今回はiPhone、PSP、MP3それぞれに変換する仕組みを
perl+ffmpeg作ってみた。
perlを書いた経験がまったく無かったので、
コード量は全然無いのになかなか難儀な事に。
なのでソースはちょっと見せられるレベルじゃないんで公開しませんが、流れだけ。
基本はmmNicoβcsと一緒で、リクエストを受け付けたらその
ファイルをDLしてffmpegに渡してデコードするといった感じです。
1.フォームから動画ID(sm~)をCGIスクリプトにPOSTする。
複数のフォーマットに対応する場合はそれも併せて送る。
2.フォームの入力を調べて、動画IDと対応機種(mp3やiphone等)をそれぞれ
変数に代入しておく。
3.forkで子プロセスを生成。(
ポイント?)
forkする理由は、動画データのダウンロードとffmpegのエンコードに
時間がかかるため、タイムアウトしてしまう事を防ぐ関係から。
・
http://www.nabe.bne.jp/programing/backgraund.html(参考URL)
4.親プロセスはリクエストを受け付けたことを通知して終了する。
5.子プロセスは動画IDに基づいて動画をDLする。
perlでのDLの方法は以下サイトのソースを参考に。
・
http://yusukebe.com/tech/archives/20070803/124356.html・
http://blog.livedoor.jp/dankogai/archives/50885358.html・
http://blog.livedoor.jp/dankogai/archives/50900305.html6.if-elsif-if文でフォーマット毎に分岐
7.systemでffmpegを呼び出しエンコード。
この時、エンコード先は公開www鯖になるようにパスを設定する。
8.変換済みリストhtmlにエンコードが済んだファイルのパスとリンクを追加
分かり辛いですがこんな感じです。
ちなみに、一般会員の場合混雑中は当然エコノミーになります。
必要なのはApache、Perl、ffmpeg、libfaac(AACライブラリ)、
libx264(H.264エンコーダ)、libmp3lame(lame・MP3エンコーダ)など。
もう少しコード整理が出来たら公開するかもしれません。
サポートは一切しません...セキュリティとかエラー処理が考慮されてないので
もし試してみる奇特な方がいたら自分で追加した方が良いと思います。
てか、mmNicoβあるから需要なさそうだ。
ちなみに、Sempron LE-1100だと途轍もなく遅くて残念な感じですw
PenDC E5x00とかAthlonX2くらいあればボチボチ使えそうな感じがします。
MP3は割と現実的に使えそうな感じです。
もひとつ、subversionでffmpegの最新版をcheckoutしたソースから
コンパイルしたものと、libx264の最新版ソースからコンパイルした
組み合わせを利用した時、特にエコノミーモードのflvをH.264に変換した場合、
libx264がnon monotone timestamps~というエラーを
吐いて止まることがあります。
このエラーについては以下のようにソースを変更し、コンパイルを
し直してみてください。
ffmpeg/libavformat/utils.c
2570行付近
if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n",
st->cur_dts, pkt->dts);
削除 return -1;
追加 //return -1;
}
if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
・
http://www.abclinuxu.cz/blog/mirek/2008/3/ffmpeg-patch-pro-chybu-error-non-monotone-timestamps(より)
エラーが発生した場合の戻り値return -1;をコメントアウトするだけです。
エラーを無視するので、生成する動画データがおかしくなってる
可能性がありますが、iPhoneやPSP等での再生は問題ありませんでした。
ただ、デコーダーやエンコーダーによっては弾くファイルが出来る可能性もあります。
そろそろ、ちょっとコメント欄解放して様子みてみます。
だめそうなら、再度しめるかも。