FLV封装格式

news2024/11/28 14:37:13

  摘要:本文描述了FLV的文件格式。
  关键字:FLV

1 简介

  FLV流媒体格式是sorenson公司开发的一种视频格式,全称为Flash Video。 它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等缺点。由于其视频文件体积轻、封装播放简单等优点,使得其非常合适在网络上传输,目前主流的视频网站无一例外支持FLV流媒体格式进行视频播放。

  2020年12月31日,Chrome作为最后一个宣布将不再支持使用Flash的应用程序浏览器,flv视频均无法透过Google Chrome收看,除开BiliBili、优酷等视频网站以外的视频网站均停止使用flv作为视频格式。

2 FLV文件格式

  FLV整个文件由两部分组成Header和Body,Header描述了FLV文件的基本信息,Body存储了流数据。Body中由一个个Tag组成。
在这里插入图片描述
在这里插入图片描述

2.1 FLV Header

  FLV Header长度为9个字节,前三个字节是固定的FLV三个字符,表示当前文件的标签,第四个字节是当前文件的版本比如0或者1,第五个字节被分为了4个部分,前5个bit位作为预留,不使用的话写0;接下来的3个bit位每一位表示是否有对应的流,次序分别为音频,预留,视频,为1则表示当前文件有对应的流;最后4个字节表示当前Header的大小,一般为9如果有扩充就会变。在这里插入图片描述

2.2 FLV Body

  FLV Body紧跟在FLV Header之后,即FLV Header中的dataoffset也是FLV Body的起始位置。FLV Body由一系列的Back-Pointer和Tag组成,交错存储,大概的结构如下:
在这里插入图片描述

  Back-Pointer就是一个4字节的区域,存储前一个Tag的长度,第一个Tag没有前任,一定是0。另外,FLV的Tag包含音频、视频或脚本元数据、可选的加密元数据和 payload。最基础的为FLV Tag,还有其他的Audio Tag,Vidoe Tag, Data Tag等。

2.2.1 FLV Tag

  FLV Tag也有Header+Data组成,基本结构如下:
在这里插入图片描述

  • Reserved(2 bit):用于FMS的保留字段, 值为0;
  • Filter(1bit):指示packet是否需要预处理:
    • 0 = 不需要预处理;
    • 1 = packet 在渲染前需要预处理(例如解密);
    • 未加密文件中此值为0,加密文件中此值为1;
  • TagType(5bit):表示当前Tag的类型:
    • 8:音频;
    • 9:视频:
    • 18:脚本数据;
  • DataSize(3byte):Tag中除通用头外的长度,即Header+Data字段的长度 (等于Tag总长度 – 11,即StreamID以下的数据长度,不包含StreamID);
  • Timestamp(3byte):当前Tag的解码时间戳 (DTS),单位是毫秒。FLV文件中第一个Tag的DTS总为0;
  • TimestampExtended(1byte):和Timestamp字段一起构成一个32 位值, 此字段为高 8 位,单位毫秒;
  • StreamID(3byte):总是为0;
  • 上面的数据是一定有的,下面的数据是根据当前Tag类型或者其他一些属性来决定的:
    • Tag Header:
      • TagType为8,则为AudioTagHeader;
      • TagType为9,则为VideoTagHeader;
    • Filter为1,有EncryptionHeader;
    • Filter为1,则有FilterParams;
    • Data:
      • TagType为8,则为音频数据;
      • TagType为9,则为视频数据;
      • TagType为18,则为脚本数据。

2.2.2 Audio Tag

  Audio Tag包括AudioTagHeader和AudioTagBody两部分组成。

2.2.2.1 Audio Tag Header

在这里插入图片描述

  Audio Tag Header主要描述了音频的基本参数,比如采样率等:

  • SoundFormat:音频格式;
    • 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:采样率,FLV支持的采样率比较有限,AAC总为3:
    • 0: 5.5 kHz;
    • 1: 11 kHz;
    • 2: 22 kHz;
    • 3: 44 kHz;
  • SoundSize:采样位深,此参数仅适用未压缩格式,压缩格式总在内部被解码为16位:
    • 0: 8位;
    • 1: 16位;
  • SoundType:声道数:
    • 0: 单声道;
    • 1: 立体声;
  • AACPacketType:AAC帧类型。仅当声音格式为 10 时,存在此字段:
    • 0: AAC sequence header;
    • 1: AAC raw。

2.2.2.2 Audio Tag Body

  音频数据段即AUDIODATA,根据是否加密可以存储加密数据即EncryptedBody或者AudioTagBody。AudioTagBody存储的数据根据当前格式不同而不同,如果是AAC即SoundFormat=10,则存储AACAUDIODATA,否则就是具体格式的数据。
  AACAUDIODATA的存储结构根据是否设置AACPacketType而不同,0则存储的AudioSpecificConfig,否则直接存储AAC的数据。

2.2.3 Video Tag

  Video Tag 包含 VideoTagHeader 和 VideoTagBody 两部分。

2.2.3.1 VideoTagHeader

在这里插入图片描述

  

  • FrameType:帧类型;
    • 1: keyframe (for AVC, a seekable frame);
    • 2: inter frame (for AVC, a non-seekable frame);
    • 3: disposable inter frame (H.263 only);
    • 4: generated keyframe (reserved for server use only);
    • 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;
  • AVCPacketType:AVC帧类型只有AVC编码才有:
    • 0: AVC sequence header;
    • 1: AVC NALU;
    • 2: AVC end of sequence (lower level NALU sequence ender is not required or supported);
  • CompositionTime:PTS与DTS的时间偏移值,单位ms,记作CTS,只有编码器为AVC才有。

2.2.3.2 VideoTagBody

  同AudioTagBody,区分加密和非加密。而非加密的VideoTagBody根据编解码器类型不同存储的数据不同:

  • FrameType == 5:UI8;
  • CodecID == 2:H263VIDEOPACKET;
  • CodecID == 3:SCREENVIDEOPACKET;
  • CodecID == 4:VP6FLVVIDEOPACKET;
  • CodecID == 5:VP6FLVALPHAVIDEOPACKET;
  • CodecID == 6:SCREENV2VIDEOPACKET;
  • CodecID == 7:AVCVIDEOPACKET。

2.2.4 Data Tags

  数据 Tag 封装了单一方法,此方法通常在 Flash 播放器中的网络流对象上被调用。数据 Tag 包含方法名和一组参数。这部分就不详细说明了具体参考abode的标准。

3 简单查看下FLV的结构

FLV file version 1
  Contains audio tags: Yes
  Contains video tags: Yes
  Data offset: 9

Prev tag size: 0
Tag type: 18 - Script data object
  Data size: 1195
  Timestamp: 0
  Timestamp extended: 0
  StreamID: 0

Prev tag size: 1206
Tag type: 9 - Video data
  Data size: 54
  Timestamp: 0
  Timestamp extended: 0
  StreamID: 0
  Video tag:
    Frame type: 1 - keyframe (for AVC, a seekable frame)
    Codec ID: 7 - AVC
    AVC video tag:
      AVC packet type: 0 - AVC sequence header
      AVC composition time: 0
      AVC nalu length: 23330847

参考文献

  • Flash Video Format

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/992338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023国赛 B题论文 基于多波束测深技术的海洋探测建模与分析

因为一些不可抗力,下面仅展示小部分论文,其余看文末 一、问题重述 1.1 问题背景 海洋测深是测定水体深度与海底地形的重要任务,有两种主要技术:单波束测深与多波束测深。单波束适用于简单任务,但多波束可提供更精确…

Java锁lock的应用

从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。   也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述…

linux(centos7)配置SSH免密登录

给三台机器配置主机名映射 在Windows系统中修改hosts文件,新增以下内容; 192.168.xxx.xxx bigdata_node1 192.168.xxx.xxx bigdata_node2 192.168.xxx.xxx bigdata_node33台Linux的/etc/hosts文件中,填入如下内容。 192.168.xxx.xxx bigda…

C#学习 - 初识类与名称空间

类&#xff08;class&#xff09;& 名称空间&#xff08;namespace&#xff09; 类是最基础的 C# 类型&#xff0c;是一个数据结构&#xff0c;是构成程序的主体 名称空间以树型结构组织类 using System; //前面的using就是引用名称空间 //相当于C语言的 #include <..…

数据驱动的数字营销与消费者运营

引言&#xff1a;基于海洋馆文旅企业在推广宣传中&#xff0c;如何通过指标体系量化分析广告收益对业务带来的收益价值的思考&#xff1f; 第一部分:前链路引流投放的策略与实战 1.1 动态广告的实现: 偶然与必然 动态广告是一种基于实时数据和用户行为的广告形式&#xff0c;它…

MJ绘制「酱香拿铁」可爱壁纸;LLM产品团队招聘预告;FlowGPT提示词大赛第3季;台大深度学习音乐分析与生成最新课程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 蹭「酱香拿铁」热点的Midjouney绘图创意&#xff0c;好可爱的手机壁纸 小红书作者 美学孤诣 使用 Midjourney 制作了「上个茅班」的手…

【高德地图】根据经纬度多边形的绘制(可绘制区域以及任意图形)

官方示例 https://lbs.amap.com/demo/jsapi-v2/example/overlayers/polygon-draw <!doctype html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&quo…

数据结构-图-最短路径算法(迪杰斯特拉算法,弗洛伊德算法)

dijkstra算法 视频推荐链接 弗洛伊德算法 视频链接推荐

『SpringBoot 源码分析』run() 方法执行流程:(4)刷新应用上下文-处理 @Import 注解

『SpringBoot 源码分析』run() 方法执行流程&#xff1a;&#xff08;4&#xff09;刷新应用上下文-处理 Import 注解 基于 2.2.9.RELEASE问题&#xff1a;当方法进行了注释标记之后&#xff0c;springboot 又是怎么注入到容器中并创建类呢&#xff1f; 首先创建测试主程序 …

1.5 空间中的平面与直线

空间中的平面和直线 知识点1 平面方程 1.平面的法向量与法式 定义1 若向量n 垂直与平面N&#xff0c;则称向量n为平面N的法向量。 设一平面通过一直点 M 0 ( x 0 , y 0 , z 0 ) M_0(x_0,y_0,z_0) M0​(x0​,y0​,z0​)求垂直于非零向量 n ⃗ \vec{n} n (A,B,C),求改平面N的…

geohash学习

geohash编解码 import ("github.com/mmcloughlin/geohash" )func Test_Demo(t *testing.T) {// 编码经纬度到 geohash 字符串lat, lon : 40.7128, -74.0060 // 纽约市的位置geoHash : geohash.Encode(lat, lon) // geohash 字符串fmt.Println(geoHash) …

浅谈Http协议、TCP协议(转载)

TCP标志位,有6种标示&#xff1a;SYN(synchronous建立联机) &#xff0c;ACK(acknowledgement 确认) &#xff0c;PSH(push传送)&#xff0c;FIN(finish结束) &#xff0c;RST(reset重置)&#xff0c; URG(urgent紧急) Sequence number(顺序号码) &#xff0c;Acknowledge num…

202330读书笔记|《中国百年文学经典桥梁书(全8册)》——故乡,匆匆,春,背影,白鹅,百草园

202330读书笔记|《中国百年文学经典桥梁书&#xff08;全8册&#xff09;》——故乡&#xff0c;匆匆&#xff0c;春&#xff0c;背影&#xff0c;白鹅&#xff0c;百草园 《中国百年文学经典桥梁书&#xff08;全8册&#xff09;》作者朱自清&#xff0c;鲁迅等。很多都是小学…

文生图模型进化简史和生成能力比较——艺术肖像篇

很久没有更新文章&#xff0c;最近真的太忙啦&#xff0c;在T2I领域&#xff0c;学习速度真的赶不上进化速度&#xff01;每天都有无数新模型、新插件、新玩法涌现。玩得太上瘾啦。 上月初我去参加我硕士专业的夏季烧烤大趴&#xff0c;跟我的论文导师重逢&#xff08;好多年没…

Java 中如何实现序列化?

什么是序列化&#xff1f;Java 中如何实现序列化&#xff1f; 在 Java 编程中&#xff0c;序列化是一种将对象转换为字节流的过程&#xff0c;可以将对象在网络中传输或者保存到磁盘中。序列化可以将对象的状态保存下来&#xff0c;以便在需要时重新创建对象。Java 中提供了一…

9.9|day 2|整数拆分|不同的二叉搜索树

整数拆分&#xff1a; class Solution {public int integerBreak(int n) {int[] dp new int[n1];dp[2] 1;for(int i 3;i<n;i){for(int j 1;j<i-j;j){dp[i] Math.max(dp[i],Math.max(j*dp[i-j],j*(i-j)));}}//这里感觉要注意的就是j是我们要拆分的数&#xff0c;所…

提升敲代码效率:SublimeLinter+iverilog实现代码语法检查

前言 SublimeLinter是sublime的语法检查框架&#xff0c;安装这个插件是实现语法检查的前提&#xff0c;在安装了这个插件后&#xff0c;我们才可以安装使用特定语言的语法检查插件&#xff0c;比如对于verilog而言&#xff0c;有如下几种语法检查插件&#xff1a; SublimeLi…

如何预防CSRF攻击

CSRF 攻击的防范措施 CSRF&#xff08;Cross-Site Request Forgery&#xff09;攻击是一种常见的 Web 攻击&#xff0c;即攻击者在用户不知情的情况下&#xff0c;利用用户已登录的身份&#xff0c;向目标网站发送恶意请求&#xff0c;从而实现攻击目的。本文将介绍 CSRF 攻击…

5. 状态

一、状态是什么 由一个任务维护&#xff0c;并且用来计算某个结果的所有数据&#xff0c;都属于这个任务的状态可以认为状态就是一个本地变量&#xff0c;可以被任务的业务逻辑访问Flink 会进行状态管理&#xff0c;包括状态一致性、故障处理以及高效存储和访问&#xff0c;以…

go通过pprof定位groutine泄漏

日常开发中除了会出现Panic、ErrorInfo等通过日志很容易捕捉到的错误&#xff0c;还会出现内存泄漏、CPU激增等日志难以捕捉的问题。今天小老虎就给大家介绍下如何使用pprof去捕捉内存、CPU这些日志难以排查到的问题。 pprof的访问 pprof是Golang的性能分析工具&#xff0c;可…