FLV (Flash Video) のフォーマットを眺める

ニコニコ動画のFLVからMP3を取り出したくて調べてた. 巷にはそんなソフトがたくさん転がっているのだけれど, Linuxでもできる! というのは少なそうだし.

OpenFlash の FLV Format を眺めてみた.

簡単には, まずFLVファイルであることを示す[FLV Header:9byte]があり, 4byteのPreviousTag(0x00 00 00 00)と音声, ビデオ, メタデータのタグ(11byte)にそれぞれのデータが続く.

今はMP3の取り出しが目的なので音声についてだけ. FLVに含まれる音声データは, 圧縮されていない生データか, ADPCM, MP3, Nellymoser という形式で, 何バイトかずつぶつ切りのブロックのまま送られてくる. そのため, 圧縮の形式だけ確認したら, そのまま送られてきた順に書き足していくだけでよいらしい. ただ, データの1byte目は圧縮形式やコーデックなどの情報が納められているので注意.

実際, FLVExtractのソースを見てもMP3については, なにも考えずにファイルへ書き足していっているだけだ. Uncompressed についてはRIFF WAVEの形式に直して書き出しているけれど, 面倒なので今はMP3だけ. (それともrawとして変換できるのかな?)

音声データであることは, タグの1byte目が0x08かどうかで判断. 圧縮の形式は, データの1byte目から.

unsigned char mediaInfo = [dataの1byte目];
switch((mediaInfo & 0xf0)>>4){
case 0x00: /* Uncompressed */ break;
case 0x01: /* ADPCM */ break;
case 0x02: /* MP3 */ break;
case 0x05:
case 0x06: /* Nellymoser */ break;
default: /* Unknown */ break;
}

ところで, ニコニコ動画からFLVをダウンロードしたいのだけど, Pythonではうまくいくのに, RubyFirefox(!) で403 Errorが出る. なにが違うのだろう?

urllib2のopenerって何をやっているのかしらん?