>我正在制作自己的FLV音频下载器,而无需使用外部库。我正在遵循此文档:
http://osflash.org/flv
在 FLV 标签类型中,有三个有趣的值:
BodyLength, Timestamp, StreamId 属于uint24_be
类型。如何阅读它们?我在这里找到了答案:
在 C# 中从 FLV 流中提取音频
但是我不明白几件事:
如果时间戳和流ID都是uint24_be
的(还有uint24_be
是什么?),那么为什么
reader.ReadInt32(); //skip timestamps
ReadNext3Bytes(reader); // skip streamID
还有ReadNext3Bytes
到底是做什么的?为什么不像这样读取接下来的 3 个字节:
reader.ReadInt32()+reader.ReadInt32()+reader.ReadInt32();
您不能使用该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;
}