FLV体长

时间:2012-04-24 11:44:03

标签: c# audio stream bit-manipulation flv

我正在制作自己的FLV音频下载器而不使用外部库。 我正在关注此文档:

http://osflash.org/flv

在FLV标签类型中,有三个有趣的值:

BodyLength 时间戳 StreamId 属于uint24_be类型。怎么看? 我在这里找到了答案:

Extract Audio from FLV stream in C#

但是我不了解一些事情:

如果时间戳 StreamId 都是uint24_be(也是uint24_be?)那么为什么

reader.ReadInt32(); //skip timestamps 
ReadNext3Bytes(reader); // skip streamID

究竟ReadNext3Bytes到底是做什么的?为什么不读下面这样的3个字节:

reader.ReadInt32()+reader.ReadInt32()+reader.ReadInt32();

1 个答案:

答案 0 :(得分:1)

你不能使用reader.ReadInt32()+reader.ReadInt32()+reader.ReadInt32()因为,首先它是12个字节而不是3个字节,而在第二个它是不够简单地汇总这些字节 - 你应该使用24位值。这是ReadNext3Bytes函数的更易读的版本:

int ReadNext3Bytes(System.IO.BinaryReader reader) {
    try {
        byte b0 = reader.ReadByte();
        byte b1 = reader.ReadByte();
        byte b2 = reader.ReadByte();
        return MakeInt(b0, b1, b2);
    }
    catch { return 0; }
}
int MakeInt(byte b0, byte b1, byte b2) {
    return ((b0 << 0x10) | (b1 << 0x08)) | b2;
}