全称FLASHVIDEO,是一种新的视频格式,主要的特点是文件小、加载速度快。
flv的结构相对简单,可以通过下图来初步了解其组成:

flv = flv header(9字节) + flv body
flv header = Signature(3字节) + Version(1字节) + Flags(1字节) + DataOffset(4字节)
flv body = PreviousTagSize0 + Tag1 + PreviousTagSize1 + Tag2 + ... + PreviousTagSizeN-1 + TagN
示例:

flv body主要由PreviousTagSize和Tag组成,有以下约定:
flv tag分为3种类型:
| 字段 | 大小 | 含义 |
|---|---|---|
| TagType | 1字节 | tag类型。 音频:0x08 视频:0x09 script data:0x12 |
| Datasize | 3字节 | tag data的大小 |
| Timestamp | 3字节 | 该tag的时间戳 |
| TimestampExtended | 1字节 | 时间戳扩展字节。当24位数值不够时,该字节最高位将时间戳扩展为32位 |
| StreamID | 3字节 | 总为0 |
| TagData | 不定 | 取决于TagType |
FrameType + CodecID总共为1个字节。
| 字段 | 大小 | 含义 |
|---|---|---|
| FrameType | 前4位 | 帧类型 1:key frame (如h264的I帧) 2:inter frame(如h264普通帧) 3:disposable inter frame 4:generated keyframe 5:video info/command frame |
| CodecID | 后四位 | 编码id 1:JPEG (currently unused) 2:Sorenson H.263 3:Screen video 4:On2 VP6 5:On2 VP6 with alpha channel 6: Screen video version 2 7:AVC |
| VideoData | 不定 | 视频数据,与CodecID相关。 2:H263VIDEOPACKET 3:SCREENVIDEOPACKET 4:VP6FLVVIDEOPACKET 5:VP6FLVALPHAVIDEOPACKET 6:SCREENV2VIDEOPACKET 7:AVCVIDEOPACKE(h264媒体数据) |
AVCVIDEOPACKE
当 CodecID 为 7 时,VideoData 为 AVCVIDEOPACKE,为H.264媒体数据。
AVCVIDEOPACKE 的定义如下:
| 字段 | 大小 | 含义 |
|---|---|---|
| AVCPacketType | 1字节 | 0:AVC sequence header 1:AVC NALU 2:AVC end of sequence |
| CompositionTime | 3字节 | 如果AVCPacketType=1,则为时间cts偏移量;否则,为0 |
| Data | 不定 | 1)AVCPacketType=0,则为AVCDecoderConfigurationRecord 2)AVCPacketType=1,则为NALU(一个或多个) 3)AVCPacketType=2,则为空 |
示例:

SoundFormat + SoundRate + SoundSize + SoundType = 1字节
| 字段 | 大小 | 含义 |
|---|---|---|
| SoundFormat | 4 bits | 音频格式。 0:Linear PCM, platform endian 1:ADPCM 2:MP3 3:Linear PCM, little endian 4:Nellymoser 16-kHz mono 5:Nellymoser 8-kHz mono 6:Nellymoser 7:G.711 A-law logarithmic PCM 8 = G.711 mu-law logarithmic PCM 9 = reserved 10:AAC 11:Speex 14:MP3 8-Khz 15:Device-specific sound |
| SoundRate | 2 bits | 采样率,对AAC来说,永远等于3 0:5.5-kHz 1:11-kHz 2:22-kHz 3:44-kHz |
| SoundSize | 1 bits | 采样精度,对于压缩过的音频,永远是16位 0:snd8Bit 1:snd16Bit |
| SoundType | 1 bits | 声道类型,对Nellymoser来说,永远是单声道;对AAC来说,永远是双声道; 0:sndMono 单声道 1:sndStereo 双声道 |
| SoundData | 不定 | 如果是AAC,则为 AACAUDIODATA; |
AACAUDIODATA
当 SoundFormat 为10时,表示音频采AAC进行编码,此时,SoundData的定义如下:
| 字段 | 大小 | 含义 |
|---|---|---|
| AACPacketType | 1 bits | 0:AAC sequence header 1:AAC raw |
| Data | 不定 | 如果AACPacketType为0,则为AudioSpecificConfig 如果AACPacketType为1,则为AAC帧数据 |
AudioSpecificConfig
| 字段 | 大小 | 含义 |
|---|---|---|
| AudioObjectType | 5 bits | 编码器类型,比如2表示AAC-LC |
| SamplingFrequencyIndex | 4 bits | 采样率索引值,比如4表示44100 |
| SamplingFrequencyIndex | 4 bits | 采样率索引值,比如4表示44100 |
| ChannelConfiguration | 4 bits | 声道配置,比如2代表双声道,front-left, front-right |
示例:

主要用来存放音视频数据的元数据信息(MetaData)。采用AMF(Action Message Format)封装了一系列数据类型,比如字符串、数值、数组等。
| 字段 | 大小 | 含义 |
|---|---|---|
| Objects | SCRIPTDATAOBJECT[] | 任意数目的 SCRIPTDATAOBJECT |
| SCRIPTDATAOBJECTEND | 3字节 | 永远是9,标识着Script Data的结束 |
| 字段 | 大小 | 含义 |
|---|---|---|
| ObjectName | SCRIPTDATASTRING | 对象的名字 |
| ObjectData | SCRIPTDATAVALUE | 对象的值 |
| 字段 | 字段类型 | 字段含义 |
|---|---|---|
| Type | SCRIPTDATASTRING | 变量类型: 0 = Number type 1 = Boolean type 2 = String type 3 = Object type 4 = MovieClip type 5 = Null type 6 = Undefined type 7 = Reference type 8 = ECMA array type 10 = Strict array type 11 = Date type 12 = Long string type |
| ECMAArrayLength | 如果Type为8(数组),则为UI32 | 数组长度 |
| ScriptDataValue | If Type == 0 DOUBLE If Type == 1 UI8 If Type == 2 SCRIPTDATASTRING …(有点长,可以参考规范) | 变量的值 |
| ScriptDataValueTerminator | 如果Type3,则为SCRIPTDATAOBJECTEND 如果 Type8,则为SCRIPTDATAVARIABLEEND | Object、Array的结束符 |
MetaData中包含了音视频相关的元数据,封装在Script Data Tag中,它包含了两个AMF。
第一个AMF:
第二个AMF:
| 字段 | 大小 | 含义 |
|---|---|---|
| duration | DOUBLE | 文件的时长 |
| width | DOUBLE | 视频宽度(px) |
| height | DOUBLE | 视频高度(px) |
| videodatarate | DOUBLE | 视频比特率(kb/s) |
| framerate | DOUBLE | 视频帧率(帧/s) |
| videocodecid | DOUBLE | 视频编解码器ID(参考Video Tag) |
| audiosamplerate | DOUBLE | 音频采样率 |
| audiosamplesize | DOUBLE | 音频采样精度(参考Audio Tag) |
| stereo | BOOL | 是否立体声 |
| audiocodecid | DOUBLE | 音频编解码器ID(参考Audio Tag) |
| filesize | DOUBLE | 文件总得大小(字节) |

struct flv_header_t
{
unsigned char FLV[3];
unsigned char version;
unsigned char audio;
unsigned char video;
unsigned int offset; // data offset
};
static inline uint32_t be_read_uint32(const uint8_t* ptr)
{
return (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3];
}
static inline void be_write_uint32(uint8_t* ptr, uint32_t val)
{
ptr[0] = (uint8_t)((val >> 24) & 0xFF);
ptr[1] = (uint8_t)((val >> 16) & 0xFF);
ptr[2] = (uint8_t)((val >> 8) & 0xFF);
ptr[3] = (uint8_t)(val & 0xFF);
}
int flv_header_read(struct flv_header_t* flv, const uint8_t* buf, size_t len)
{
if (len < 9 || 'F' != buf[0] || 'L' != buf[1] || 'V' != buf[2])
{
assert(0);
return -1;
}
flv->FLV[0] = buf[0];
flv->FLV[1] = buf[1];
flv->FLV[2] = buf[2];
flv->version = buf[3];
assert(0x00 == (buf[4] & 0xF8) && 0x00 == (buf[4] & 0x20));
flv->audio = (buf[4] >> 2) & 0x01;
flv->video = buf[4] & 0x01;
flv->offset = be_read_uint32(buf + 5);
return FLV_HEADER_SIZE;
}
其他解析可参考ireader开源库,github: https://github.com/ireader
推荐一款解析flv格式码流的工具:FlvAnalyzer.exe,解析效果如图所示:

部分参考:
https://www.cnblogs.com/chyingp/p/flv-getting-started.html
https://blog.51cto.com/u_13861442/5169955
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG