FLV是一个二进制文件,由文件头(FLV header)和很多tag组成。tag又可以分成三类:audio,video,script,分别代表音频流,视频流,脚本流(关键字或者文件信息之类)。
FLV Header 一般比较简单,包括文件类型之类的全局信息

文件类型 3bytes 总是FLV(0x46 0x4C 0x56),否则...
版本 1byte 一般是0x01,表示FLV version 1
流信息 1byte 倒数第一bit是1表示有视频,倒数第三bit是1表示有音频,其他都应该是0(有些软件如flvtool2可能造成倒数第四bit是1,不过也没发现有什么不对)
header长度 4bytes 整个文件头的长度,一般是9(3+1+1+4),有时候后面还有些别的信息,就不是9了
     

FLV Body FLV body就是由很多tag组成的,一个tag包括下列信息:

previoustagsize 4bytes 前一个tag的长度,第一个tag就是0
tag类型 1byte 三类:

  • 8 -- 音频tag
  • 9 -- 视频tag
  • 18 -- 脚本tag
数据区长度 3bytes  
时间戳 3bytes 单位毫秒,如果是脚本tag就是0
扩展时间戳 1byte 作为时间戳的高位
streamsID 3bytes 总是0(不知道干啥用)
数据区    

根据不同的tag类型就有不同的数据区
Audio tag 数据区

audio信息 1byte 前四位bits表示音频格式:

  • 0 -- 未压缩
  • 1 -- ADPCM
  • 2 -- MP3
  • 5 -- Nellymoser 8kHz momo
  • 6 -- Nellymoser

下面两位bits表示samplerate:

  • 0 -- 5.5kHz
  • 1 -- 11kHz
  • 2 -- 22kHz
  • 3 -- 44kHz

下面一位bit表示每个采样的长度:

  • 0 -- snd8Bit
  • 1 -- snd16Bit

下面一位bit表示类型:

  • 0 -- sndMomo
  • 1 -- sndStereo
audio数据区 不定  

video tag 数据区

video信息 1byte 前四位bits表示类型:

  • 1 -- keyframe
  • 2 -- inner frame
  • 3 -- disposable inner frame (H.263 only)

后四位bits表示编码器id:

  • 2 -- Seronson H.263
  • 3 -- Screen video
  • 4 -- On2 VP6
  • 5 -- On2 VP6 without channel
  • 6 -- Screen video version 2
video数据区 不定  

script tag 数据区 略n字...
代码 Code 目前只用到读取视频时长的部分

  1 using System;
  2
  3 using System.Collections.Generic;
  4
  5 using System.Linq;
  6
  7 using System.Text;
  8
  9 using System.IO;
 10
 11 namespace _30edu.Common
 12
 13 {
 14
 15     public class FlvInfo
 16
 17     {
 18
 19         public FlvInfo()
 20
 21         {
 22
 23             Header = new FLVHeader();
 24
 25             TagList = new List<FLVTag>();
 26
 27         }
 28
 29         public FLVHeader Header { get;private set; }
 30
 31         public List<FLVTag> TagList { get; private set; }
 32
 33         public TimeSpan Time
 34
 35         {
 36
 37             get
 38
 39             {
 40
 41                 int time=0;
 42
 43                 //foreach (FLVTag tag in this.TagList.Where(p=>p.Type))
 44
 45                 //{
 46                 //    byte[] tmp = new byte[4];
 47
 48                 //    tmp[3] = tag.TimeEx;
 49
 50                 //    tmp[0] = tag.Time[2];
 51
 52                 //    tmp[1] = tag.Time[1];
 53
 54                 //    tmp[2] = tag.Time[0];
 55
 56                 //    time += BitConverter.ToInt32(tmp,0);
 57
 58                 //}
 59
 60                 FLVTag tag = this.TagList.Where(p => p.Type == 9).Last();
 61
 62                 byte[] tmp = new byte[4];
 63
 64                 tmp[3] = tag.TimeEx;
 65
 66                 tmp[0] = tag.Time[2];
 67
 68                 tmp[1] = tag.Time[1];
 69
 70                 tmp[2] = tag.Time[0];
 71
 72                 return new TimeSpan(0, 0, 0, 0, BitConverter.ToInt32(tmp, 0));
 73
 74             }
 75
 76         }
 77
 78     }
 79
 80     /**//// <summary>
 81
 82     /// 文件头
 83
 84     /// </summary>
 85
 86     public class FLVHeader
 87
 88     {
 89
 90         public FLVHeader()
 91
 92         {
 93
 94             this.Type = new byte[3];
 95
 96             this.Length = new byte[4];
 97
 98         }
 99
100         /**//// <summary>
101
102         /// 3byte 总是FLV(0x46 0x4C 0x56)
103
104         /// </summary>
105
106         public byte[] Type { get; set; }
107
108         /**//// <summary>
109
110         /// 版本 一般是0x01,表示FLV version 1
111
112         /// </summary>
113
114         public byte Version{ get; set; }
115
116         /**//// <summary>
117
118         /// 流信息 倒数第一bit是1表示有视频,倒数第三bit是1表示有音频
119
120         /// </summary>
121
122         public byte Stream { get; set; }
123
124         /**//// <summary>
125
126         /// 长度 4byte
127
128         /// </summary>
129
130         public byte[] Length { get; set; }
131
132     }
133
134     public class FLVTag
135
136     {
137
138         public FLVTag()
139
140         {
141
142             this.PreviousTagSize = new byte[4];
143
144             this.DataLength = new byte[3];
145
146             this.Time = new byte[3];
147
148             this.streamsID = new byte[3];
149
150         }
151
152         /**//// <summary>
153
154         /// 前一个Tag长度 4byte
155
156         /// </summary>
157
158         public byte[] PreviousTagSize { get; set; }
159
160         /**//// <summary>
161
162         ///  8 -- 音频tag 9 -- 视频tag 18 -- 脚本tag
163
164         /// </summary>
165
166         public byte Type { get; set; }
167
168         /**//// <summary>
169
170         /// 数据区长度 3byte
171
172         /// </summary>
173
174         public byte[] DataLength { get; set; }
175
176         /**//// <summary>
177
178         /// 时间戳 3byte 毫秒
179
180         /// </summary>
181
182         public byte[] Time { get; set; }
183
184         /**//// <summary>
185
186         /// 扩展时间戳 3byte 毫秒 作为时间戳的高位
187
188         /// </summary>
189
190         public byte TimeEx { get; set; }
191
192         /**//// <summary>
193
194         /// 一般为0 3byte
195
196         /// </summary>
197
198         public byte[] streamsID { get; set; }
199
200         /**//// <summary>
201
202         ///
203         /// </summary>
204
205         public byte[] Data { get; set; }
206
207     }
208
209     public static class FlvInfoHelper
210
211     {
212
213         public static FlvInfo Read(string Path)
214
215         {
216
217             using (FileStream fs = File.OpenRead(Path))
218
219             {
220
221                 FlvInfo aFlvInfo = new FlvInfo();
222
223                 fs.Read(aFlvInfo.Header.Type, 0, aFlvInfo.Header.Type.Length);
224
225                 aFlvInfo.Header.Version=(byte)fs.ReadByte();
226
227                 aFlvInfo.Header.Stream = (byte)fs.ReadByte();
228
229                 fs.Read(aFlvInfo.Header.Length, 0, aFlvInfo.Header.Length.Length);
230
231                 byte[] previoustagsize=new byte[4];
232
233                 while (fs.Read(previoustagsize, 0, previoustagsize.Length) != 0)
234
235                 {
236
237                     FLVTag Tag = new FLVTag();
238
239                     Tag.PreviousTagSize = previoustagsize;
240
241                     Tag.Type = (byte)fs.ReadByte();
242
243                     fs.Read(Tag.DataLength, 0, Tag.DataLength.Length);
244
245                     fs.Read(Tag.Time, 0, Tag.Time.Length);
246
247                     Tag.TimeEx = (byte)fs.ReadByte();
248
249                     fs.Read(Tag.streamsID, 0, Tag.streamsID.Length);
250
251                     byte[] tmp = new byte[4];
252
253                     tmp[3] = 0;
254
255                     tmp[2] = Tag.DataLength[0];
256
257                     tmp[1] = Tag.DataLength[1];
258
259                     tmp[0] = Tag.DataLength[2];
260
261                     int n=System.BitConverter.ToInt32(tmp, 0);
262
263                     fs.Seek(n, SeekOrigin.Current);
264
265                     aFlvInfo.TagList.Add(Tag);
266
267                 }
268
269                 return aFlvInfo;
270
271             }
272
273             return null;
274
275         }
276
277     }
278
279 }
280  

C#获取 Flv视频文件播放时间长度等信息相关推荐

  1. php获取页面视频文件,php获取视频时长_php 读取视频文件播放时间长度

    摘要 腾兴网为您分享:php 读取视频文件播放时间长度,中信期货,中日翻译,一路捞,信和财富等软件知识,以及阳光炫舞,火绒安全软件,qq锁,微信摇一摇抽奖软件,稿定设计软件,开始菜单图标,钩肥大战,g ...

  2. json字段顺序读取 python_如何利用Python批量读取视频文件的时间长度?

    本期的主题是利用Python来实现对视频文件时间长度的读取. 在学习编程语言时,相比较于通过书本来学习知识,我更喜欢通过观看学习视频的方式来进行学习,通过主讲老师的讲解,我能很直观且快速的了解一些知识 ...

  3. php获取视频文件属性,使用php获取flv视频文件的信息

    最近要做一个判断flv文件信息的程序,使用php对flv文件进行解析判断,百度了半天也没有对应的信息,后来又去csdn发帖子,得到的答复是目前还没有直接可以对flv文件进行处理的方法,于是决定放弃这个 ...

  4. php 获取 flv 部分视频,php – 获取flv视频长度

    虽然我试图得到一个flv视频文件的长度我得到0秒,因为它只发生在一些视频,否则我的功能工作正常. 下面是我的代码. function mbmGetFLVDuration($file){ // read ...

  5. 【求助】winfrom怎么获取视频当前播放时间

    winfrom怎么获取视频当前播放时间并播放同等时间的mp3音频  实现KTV原唱和伴唱 功能

  6. PHP + NGINX 控制视频文件播放,并防止文件下载

    最简单的方法是使用NGINX的 internal 功能 server {     listen 80;     server_name www.xxx.com;     location / {    ...

  7. PPT插入FLV视频文件的简单方法(转)

    转自http://www.raasz.com/blog/user1/11/archives/2009/8677.html 目前网上下载的视频文件以FLV居多,FLV文件是FLASH专用视频文件,无法直 ...

  8. BiliBili下载.flv视频文件重命名

    基于C#滴 V0.0 这个程序仅限于每个子目录下仅有一个.flv视频文件 想看教程的到这个链接(超链接,点击就可):https://www.bilibili.com/video/BV1CK4y1s7a ...

  9. Android获取网络视频文件缩略图

    一,通过Android系统自带的类获取: 1.  public staticBitmapcreateVideoThumbnail(String filePath,int kind){     Bitm ...

  10. 【ffmpeg教程】【无损快速转换】两行代码 快速无损转换mkv flv视频文件 第一期

    [ffmpeg教程][无损快速转换]两行代码 快速无损转换mkv flv视频文件 第一期 前言 环境准备 脚本编写 运行脚本 前言 视频版教程:[无损快速转换]两行代码 快速无损转换mkv flv视频 ...

最新文章

  1. 农牧行业销售经理生存手册(二)
  2. 2008搭建php运行环镜,Win2008 PHP 配置环境怎么搭建?win2008 php运行环境搭建图文教程。...
  3. MQTT再学习 -- 漫谈MQTT协议
  4. Java使用Proxy和CGLib实现动态代理
  5. One Bug of WatiN?
  6. 化工原理少学时答案解析_初中科学电磁铁的构造和原理每日一练含答案解析
  7. linux 7 yum源,Linux Redhat 7 安装免费yum源
  8. typecho支持html,为Typecho文章增加HTML标签支持
  9. mysql sqrt_详解MySQL中的SQRT函数的使用方法
  10. [BZOJ1031] [JSOI2007] 字符加密Cipher (后缀数组)
  11. Echarts官网突然不能登录了?
  12. C# extention extension
  13. 软件设计师 软考 真题练习 (二)
  14. 杨辉三角(Python-动态规划)
  15. php imap函数详解,Imap是什么意思,php imap 函数详解
  16. samba更改其他端口,如何与windows共享文件夹
  17. TCP/IP五层协议体系结构的各层功能
  18. Tyvj1474 打鼹鼠
  19. 逆战小白提升日記——网红时钟罗盘制作
  20. weka 执行结果MySQL_WEKA数据解析实验.doc

热门文章

  1. DPDK 中文编程指南
  2. linux调度器(七)——other cfs class api and functions
  3. linux抓包命令不用root用户,linux中非root用户使用wireshark进行抓包
  4. python默认字体_matplotlib默认字体设置
  5. idea每次都要配置tomcat_午饭收藏夹里的c位石锅拌饭,每次来到都要等位......
  6. C++ STL vector详解
  7. 深度学习优化算法大全系列1:概览
  8. 史上最简明八皇后问题分析与套路总结
  9. shell 计算代码运行时间
  10. git安装 tor_【git安装教程 windows】怎么装git window_git安装配置教程