flv复合流

news2024/11/15 14:00:48

一、什么是flv

        flv流媒体协议是Adobe公司推出的一种流媒体协议。其特点就是封装后的音视频数据量很小,并且协议规范相对简单,所以FLV流媒体协议适合网络传输,但是他是一个私有协议,所支持的网络传输比较有限:如RTMP、HTTP-FLV。

 二、FLV流媒体格式讲解

flv有两部分,一个是flv header另外一个是flv body。

flv header长度固定9个字节

flv body由一组组的previous tags size + tag组成

tag由 flv tag header + tag data组成

Previous Tag Size一般在整个Tag的前面,它一般记录前一个Tag的大小。Tag的类型一般分为三种、第一种脚本数据帧类型、视频数据类型、音频数据类型。

 2.1FLV Header

FLV 头部的前三个字节是固定的,表明了是FLV格式,Version是版本号固定为1,其他根据项目自己配置

 2.2 FLV BODY

FLV BODY由FLV Tag Header 和Tag Data组成。

音频FLV BODY = FLV Tag Header + Audio Tag Data。

视频FLV BODY = FLV Tag Header + Video Tag Data

脚本FLV BODY = FLV Tag Header + Script Tag Data

但无论是视频的Tag Data还是音频的Tag Data它们的FLV Tag Header都是相同的,下面我们来看看公共部分的FLV Tag Header

 2.3.1FLV Script Tag

FLV Script Tag也是由FLV Tag Header + Script Data Tag组成。Script Tag的类型一般被称为MedtaData Tag,它一般会存储一些关于FLV音视频的参数信息,比方说:分辨率(width、height)、duration,通常来说Script Tag Data是第一个出现的Tag,并且有且只有一个

Script Tag是由两个AMF包组合起来(AMF 包 = 数据类型(看下图) + 数据长度 + 数据)。

AMF数据类型:

AMF1的第一个字节表示包类型、默认0x02。第2-3个字节代表的是字符串的长度,默认0X00A。 而后面的字节是具体的字符串(“onMetaData”)用十六进制表示:(6f、6e、4d、65、74、61、44、61、74、61)

AMF2包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。第一个字节是0x08表示数组类型。第2-5个字节表示的是数组元素的个数、而后面的数组则是每个数组的键值对。

AMF2数组对应的键值对:

AMF1的分析:

AMF2的分析:

2.3.2FLV VIDEO TAG

FLV VIDEO TAG是由两部分组成,FLV Tag HEADER + VIDEO DATA TAG。

从这张图可以看出,VIDEO DATA TAG是视频的具体信息,这其中包括:STREAMID视频流ID、FrameType视频帧类型(1: avc keyframe指的是关键帧、2: avc inter frame指的是普通帧)、CODECID编码ID(默认7:AVC编码)、AVCPacketType编码包类型(0: avc sequence hdr、1: NALU类型)、CompositionTime构造时间、Data具体的视频数据

2.3.3FLV AUDIO TAG

FLV AUDIO TAG是由两部分组成,FLV Tag HEADER + VIDEO DATA TAG。

从这张图可以看出,AUDIO DATA TAG是视频的具体信息,这其中包括SoundFormat音频类型(10: aac)、SoundRate音频采样率、SoundSize音频采样深度、SoundType音频编码类型、AACPacketType AAC包的类型、Data就是具体的音频数据。下面这个是每一个Audio Data Tag的具体定义:

三、总结

FLV = FLV Header + FLV Body

FLV Body = FLV TAG

FLV TAG = FLV TAG Header + TAG DATA(FLV TAG有三种类型)

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

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

相关文章

Mysql异常断电InnoDB损坏处理

一、mysql启动报错信息收集 1、截图 [ERROR] InnoDB: Database page corruption on disk or a failed file read of page [page id: space0, page number203]. You may have to recover from a backup. Jun 27 13:30:06 localhost mysqld: 2024-06-27T13:30:06.14747208:00 0 …

意气实体过程函数论3

意气实体过程函数论3 和悦空间 y i y_i yi​才气的意气实体过程逻辑定义哥德尔数数理逻辑简称逻辑;明明德数符号琴语言数据结构王阳明群表示,被称为才气群表示论; 从劳动力关系向量到生产力配分函数算法为己之学模拟器接口函数声明内核与插件…

【JAVA入门】Day42 - 转换流

【JAVA入门】Day42 - 转换流 文章目录 【JAVA入门】Day42 - 转换流 转换流是字符流和字节流之间的桥梁。 转换流中的输入流叫做 InputStreamReader,它可以把字节流转换为字符流。 转换流的输出流叫做 OutputStreamWriter,它可以把字符流…

JAVA并发编程ReentrantLock核心原理剖析

JAVA并发编程系列以及陆续出了5篇,第六篇的主角ReentrantLock该出场了。之前《一文看懂全部锁机制》谈到可重入锁、《JAVA并发编程AQS原理剖析》谈到了JUC灵魂AQS,那么AQS的思想优秀实践者ReentrantLock是怎么实现AQS的呢? 1、ReentrantLock是…

Unity笔记:ScrollRect代码阅读

大体流程 Unity Docs - UGUI | Class ScrollRect 总的说 自身不负责Rebuild,设置脏之后交由LayoutRebuilder注册到CanvasUpdateRegistry里待rebuild的集合在固定时机统一Rebuild。自身只在Prelayout和Postlayout做一下数据准备和数据更新 自身的ICanvasElement.…

判断是否在同一个键盘行

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 美式键盘 中: 第一行由字符 "qwertyuiop" 组成。第二行由字符 "asdfghjkl" 组成。第三行由字符 "zxcvbnm" 组成。…

构建医护人员排班系统:Spring Boot的实践与探索

相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常适…

如何使用UltraISO(软碟通)制作U盘启动盘

一、打开UltralSO.exe、先格式化U盘,文件 -> 打开 找到要刻录的ISO镜像文件; 二、选择你的U盘。U盘会在左下角出现,点击便可。 三、启动->写入磁盘映像; 四、写入方式选择 "USB-HDD",点击“写入”按钮…

ZeroTier 内网穿透工具在 Linux 上的安装与配置教程

感谢浪浪云支持发布 浪浪云活动链接 :https://langlangy.cn/?i8afa52 文章目录 1. 安装 ZeroTier1.1 系统需求1.2 更新系统软件包1.3 安装 curl1.4 安装 ZeroTier1.5 启动 ZeroTier 服务1.6 验证安装 2. 创建和管理虚拟网络2.1 注册和登录2.2 创建新网络2.3 配置网…

【嘶吼文化-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

私有VLAN,从原理到配置,全给你说明白

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 晚上好,我的网工朋友 传统的VLAN划分虽然能够有效地隔离不同部门或功能区域的网络流量,但在某些情况下,比如共…

【JSP `page` 指令详解:构建高效的动态网页】

JSP page 指令详解&#xff1a;构建高效的动态网页 在 JavaServer Pages (JSP) 中&#xff0c;<% page %> 指令用于配置 JSP 页面的一些关键属性。这些属性控制着页面的行为和生成的 Servlet 的特性&#xff0c;例如字符编码、是否启用会话、缓冲区大小等。合理使用 page…

​了解MySQL 的二进制日志文件​Binlog

1. SQL 语句的几种类型 首先介绍一下&#xff0c;对于一个 SQL 语句&#xff0c;它常常被分为以下几种类型&#xff1a; DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09;&#xff1a;用来操作数据库、表、列等&#xff0c;比如 CREATE、ALTER…

VSCode 创建Python 项目(最简单,最少步骤,无痛从pycharm迁移项目)

第一步&#xff1a;下载 下载地址&#xff1a;https://code.visualstudio.com/docs/?dvwin64user 第二步&#xff1a;配置 2.1&#xff1a;VsCode设置中文 按住键盘上的“CtrlShiftP”组合键&#xff0c;打开命令面板。 在命令面板中输入“Configure Display Language”。点击…

vue3 二次封装el-select增加分页功能

实现效果 需求来源于实时搜索客户名称,使用el-select相比用弹窗嵌套表格轻便不少。但是当远程搜索获得的数据量大时,可以滚动加载 也可以加上分页。 封装分页组件 <!-- el-pagination 二次封装 --> <template><div><el-paginationv-model:current-page…

【Linux篇】常用命令(笔记)

目录 一、认识Linux 1. Linux的组成 &#xff08;1&#xff09;文件系统&#xff08;FILE SYSTEMS&#xff09; &#xff08;2&#xff09;内核 &#xff08;3&#xff09;用户接口&#xff08;Shell&#xff09; &#xff08;4&#xff09;应用程序 2. Linux的目录结构…

工作分享,小红书企业內推码附送

小红书2025校园招聘全球启动&#xff0c;附有內推码 内推码&#xff1a;QMT16MXVARJL 内推链接&#xff1a;https://job.xiaohongshu.com/link?referer_codeQMT16MXVARJL 内推链接

C++常见异常汇总(三): fatal error: google/protobuf/port_def.inc

文章目录 1、fatal error : sw/redis/redis.h2、fatal error: dwarf.h: No such file or directory3、fatal error: elfutils/libdw.h: No such file or directory4、fatal error: libunwind.h: No such file or directory5、fatal error: google/protobuf/port_def.inc6、erro…

k8s部署springcloud-alibaba项目

本文由个人总结&#xff0c;如需转载使用请标明原著及原文地址 本文需要一些知识储备&#xff0c;有一定的自学能力&#xff0c;有一定的自行解决问题的能力&#xff0c;不然直接看的话压力会比较大&#xff0c;建议有一定知识储备后作为提升来学 本文的前置条件是会docker&a…