2012年8月25日土曜日

httpDynamicStreamingの解析(mp4の構造はこんな感じ?)

httpDynamicStreamingをOSMFのフレームワークのプログラムとadobeが出しているf4v、flvのフォーマット情報からどうなっているか、理解していきたいと思います。

そのメモ書き

まず、フォーマット情報から
http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf
ここにあります。

この情報には、httpStreamingについての情報もあるみたいです。
httpDynamicStreamingではmp4のフラグメントストリーミングという形で構成されているみたいです。

各ボックスは次のような感じになってるみたいです。

先頭4バイトがボックスサイズ(この4バイトも含む)
その後4バイトの各BoxType記述(ftyp moov mdat等々)
と、そのボックスの内容定義

というのが基本的な構成になっているようです。ここが超基本ですね。

フラグメントのデータをいくつかダウンロードしてみましたが、mp4の形式にはなっている模様です。
tcpでやりとりしているので、mpegtsみたいな中途でデータが落ちたときのことは考えていないみたいですね。

とりあえずあとで、flazrのプログラムをみておこうとおもいます。あれもf4v対応しているので、参考になるはず・・・

2012年8月19日日曜日

さっそくCプログラミングに手をだしてみる。

eclipseのCDTをダウンロードしてきたので、さっそくCプログラミングに手をだしてみることにします。

久しぶりすぎるし、勝手がわからないので、とりあえずやったこと。
Eclipse CDTをダウンロード
eclipse-cpp-juno-macosx-cocoa-x86_64.tar.gz

CProjectのExecutable Hello World ANSI C ProjectでToolchainをMacOSXGCCに設定し、Hello worldが動作することを確認。

とりあえずxuggleで入ったライブラリを使いたいので、パスだけ確認。
/usr/local/libにはインストールしていなかったようで、
~/xuggletest/xuggle/java/xuggle-xuggler/dist/stage/usr/local/lib/の中に
libmp3lame.a
libmp3lame.dylib
libx264.a
libx264.dylib
があった。
~/xuggle-test/xuggle/java/xuggle-xuggler/dist/stage/usr/local/include/の中に
x264_config.h
x264.h
lame/lame.h
等発見。

さて、いろいろいじってみようかな・・・

2012年8月18日土曜日

ネットがきたので今後したいこと

やっと家にネットがきました。

なので、またネットでの活動を再開したいですね。
さて、やりたいことを羅列しておきます。

ちなみに興味のある順です。

1つ目。放送するアプリケーションを作りたいです。一応前に、会社でパパっとJavaで組んだことはあります。たしか、v4l4j(カメラの取り込み) + xuggle(カメラ映像→flvに変換) + red5(rtmpに直して配信)でubuntu上につくりました。
今回はlibx264 + libmp3lame + (c言語で書き込む適当なrtmp化するプログラム)で作りたいなと思っています。

2つ目。HttpDynamicStreamingの動作を解析して、live用の変換プログラムをつくりたいです。openSourceMediaFrameworkのプログラムをちょっと読んでみたところ、どうやら、netStream.appendBytesで追記する形で実行しているようですので、案外簡単にできあがるかも・・・

3つ目。httpTakStreamingを拡張していきたいです。具体的には再度rtmfp経由の動作を作り直して適当なサービスを立ち上げたいですね。こちらでは、ついでにiphone用の非フルスクリーン再生のやつも作り上げたいです。

この3つやりたいですね。


で、余談は一番興味がある放送アプリケーションをつくる件について。
とりあえず想定しているマイルストーンは次のような感じ。
0:javaでとりあえず作ってみる。
v4l4jかデスクトップの画像をキャプチャ→xuggleにかける(flvに変換する)→flazrに取り込んでrtmpサーバーに放送として流す。
(動作するものができるのは楽しいけど、作る意義はないと思う。ffmpegをつかうわけではないため。)

1:映像を取り込んでflvで出力するプログラムをつくる。
libx264の練習。プログラムの作り方等はdoomの掲示板をあさったらあるみたい。
どうやらYUVの画像をx264に変換してくれるみたいです。

2:音声を取り込んでflvで出力するプログラムをつくる。
libmp3lameをつかって変換するみたい。生音声データ→mp3に変換してくれるみたいです。
mp3は先頭のデータをみれば、どういう長さのデータであるか等がわかり、かつ特定の設定の場合はflvのコンテナに含めることが可能なので扱いやすさからこれを採用したいところ。
余力があったらlibfaacとかつかってもいいですけど。

3:1と2を合体させて、動画(flv)を保存するアプリをつくる。

4:flazrを参考にしつつ、3を拡張させてrtmpの放送を実行するアプリをつくる。
ここまでこれれは御の字

5:tcpではなくudpをつかった低速な回線でも利用できるあたらしいプロトコルをつくる。
ここが一番やりたいところ、tcpは無駄がおおいプロトコルなので、無駄の少ないプロトコルを開発すれば、回線が早くないユーザーでも、映像配信ができるようになるかと思っています。

とかいうことを、1ヶ月くらい考えていました。