FLVファイルのヘッダ

FLV形式

FLVファイルについてここを参考にまとめてみる
以下はFLVファイルの先頭48Byte

46 4c 56 01 01 00 00 00 09 00 00 00 00 09 00 00
02 00 00 00 00 00 00 01 52 00 00 00 00 0d 09 00
65 6a 00 00 00 00 00 00 01 12 00 00 84 2e 81 9f

意味を順番にまとめると
46 4c 56 'FLV'
01 常に1
01 Video
00 00 00 09 常に9
00 00 00 00 PreviousTagSize(先頭は常に0)
09 Video
00 00 02 BodyLength
00 00 00 TimeStamp
00 TimestampExtended
00 00 01 StreamId
52 00 Body(この例では2Byte)
00 00 00 0d PreviousTagSize(前のTagとBodyサイズの合計)
あとは繰り返し

orbitでダウンロードしたニコ生FLVファイルのヘッダを実際に以下のスクリプトで見てみる

#!/usr/bin/ruby

def add_char_be(r, c)
  r *= 0x100
  r += c
  return r
end

open(ARGV[0], 'r') {|f|
  i = 0
  f.each_byte {|c|
    i += 1
    printf("%02X ", c)
    if i == 13
      break
    end
  }
  puts ''

  status = 0
  body_length = 0
  i = 0
  f.each_byte {|c|
    i += 1
    if status == 0
      printf("%02X ", c)
      if i >= 2 and i <= 4
        body_length = add_char_be(body_length, c)
      end
      if i == 11
        puts 'body_length ' + body_length.to_s
        status = 1
        i = 0
      end
    elsif status == 1 and i == body_length
      body_length = 0
      status = 2
      i = 0
    elsif status == 2
      if i == 4
        status = 0
        i = 0
      end
    end
  }
}

出力結果はこんな感じ

46 4C 56 01 01 00 00 00 09 00 00 00 00
09 00 00 02 00 00 00 00 00 00 01 body_length 2
09 00 1F 52 00 00 00 00 00 00 01 body_length 8018
09 00 00 02 00 00 00 00 00 00 01 body_length 2
08 00 02 01 00 00 00 00 00 00 01 body_length 513
08 00 02 01 00 00 2E 00 00 00 01 body_length 513
08 00 02 01 00 00 5D 00 00 00 01 body_length 513
08 00 02 01 00 00 8B 00 00 00 01 body_length 513
08 00 02 01 00 00 BA 00 00 00 01 body_length 513
09 00 11 BA 00 00 D5 00 00 00 01 body_length 4538
08 00 02 01 00 00 E8 00 00 00 01 body_length 513
08 00 02 01 00 01 17 00 00 00 01 body_length 513
08 00 02 01 00 01 45 00 00 00 01 body_length 513
08 00 02 01 00 01 73 00 00 00 01 body_length 513
08 00 02 01 00 01 A2 00 00 00 01 body_length 513
08 00 02 01 00 01 D0 00 00 00 01 body_length 513
08 00 02 01 00 01 FF 00 00 00 01 body_length 513
08 00 02 01 00 02 2D 00 00 00 01 body_length 513
08 00 02 01 00 02 5C 00 00 00 01 body_length 513
08 00 02 01 00 02 8A 00 00 00 01 body_length 513
08 00 02 01 00 02 B9 00 00 00 01 body_length 513
08 00 02 01 00 02 E7 00 00 00 01 body_length 513
08 00 02 01 00 03 15 00 00 00 01 body_length 513
09 00 11 69 00 01 A7 00 00 00 01 body_length 4457

VideoとAudioのデータが順に並んでいるようだ
TimeStampに入れるべき数字がよく分からない