音视频学习(十三)——flv详解

news2024/12/24 9:55:15

简介

全称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 header

  • Signature:固定字符(“flv”);
  • Version:flv的版本号;
  • Flags:标识。第0位和第2位分别表示视频和音频,若为0x05,则表示既有音频,也有视频;
  • DataOffset:flv header的长度;

示例:
在这里插入图片描述

flv body

flv body主要由PreviousTagSize和Tag组成,有以下约定:

  • PreviousTagSize0固定为0;
  • tag = tag header + tag data;
  • 若flv的版本为1,则tag header固定为11个字节;
  • PreviousTagSize(除第一个)= 11 + 前一个tag的tag data的大小;

flv tag分为3种类型:

  • vedio tag:存储视频数据;
  • audio tag:存储音频数据;
  • script tag:存储音视频元数据;

flv tag

tag header

字段大小含义
TagType1字节tag类型。
音频:0x08
视频:0x09
script data:0x12
Datasize3字节tag data的大小
Timestamp3字节该tag的时间戳
TimestampExtended1字节时间戳扩展字节。当24位数值不够时,该字节最高位将时间戳扩展为32位
StreamID3字节总为0
TagData不定取决于TagType

tag data

video tag data

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 的定义如下:

字段大小含义
AVCPacketType1字节0:AVC sequence header
1:AVC NALU
2:AVC end of sequence
CompositionTime3字节如果AVCPacketType=1,则为时间cts偏移量;否则,为0
Data不定1)AVCPacketType=0,则为AVCDecoderConfigurationRecord
2)AVCPacketType=1,则为NALU(一个或多个)
3)AVCPacketType=2,则为空

示例:

在这里插入图片描述

audio tag data

SoundFormat + SoundRate + SoundSize + SoundType = 1字节

字段大小含义
SoundFormat4 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
SoundRate2 bits采样率,对AAC来说,永远等于3
0:5.5-kHz
1:11-kHz
2:22-kHz
3:44-kHz
SoundSize1 bits采样精度,对于压缩过的音频,永远是16位
0:snd8Bit
1:snd16Bit
SoundType1 bits声道类型,对Nellymoser来说,永远是单声道;对AAC来说,永远是双声道;
0:sndMono 单声道
1:sndStereo 双声道
SoundData不定如果是AAC,则为 AACAUDIODATA;

AACAUDIODATA

当 SoundFormat 为10时,表示音频采AAC进行编码,此时,SoundData的定义如下:

字段大小含义
AACPacketType1 bits0:AAC sequence header
1:AAC raw
Data不定如果AACPacketType为0,则为AudioSpecificConfig
如果AACPacketType为1,则为AAC帧数据

AudioSpecificConfig

字段大小含义
AudioObjectType5 bits编码器类型,比如2表示AAC-LC
SamplingFrequencyIndex4 bits采样率索引值,比如4表示44100
SamplingFrequencyIndex4 bits采样率索引值,比如4表示44100
ChannelConfiguration4 bits声道配置,比如2代表双声道,front-left, front-right

示例:

在这里插入图片描述

script tag data

定义

主要用来存放音视频数据的元数据信息(MetaData)。采用AMF(Action Message Format)封装了一系列数据类型,比如字符串、数值、数组等。

字段大小含义
ObjectsSCRIPTDATAOBJECT[]任意数目的 SCRIPTDATAOBJECT
SCRIPTDATAOBJECTEND3字节永远是9,标识着Script Data的结束
SCRIPTDATAOBJECT
字段大小含义
ObjectNameSCRIPTDATASTRING对象的名字
ObjectDataSCRIPTDATAVALUE对象的值
SCRIPTDATAVALUE
字段字段类型字段含义
TypeSCRIPTDATASTRING变量类型: 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数组长度
ScriptDataValueIf Type == 0 DOUBLE If Type == 1 UI8 If Type == 2 SCRIPTDATASTRING …(有点长,可以参考规范)变量的值
ScriptDataValueTerminator如果Type3,则为SCRIPTDATAOBJECTEND 如果 Type8,则为SCRIPTDATAVARIABLEENDObject、Array的结束符
MetaData

MetaData中包含了音视频相关的元数据,封装在Script Data Tag中,它包含了两个AMF。

第一个AMF:

  • 第1个字节:0x02,表示字符串类型;
  • 第2-3个字节:值为0x000A,表示字符串的长度为10(MetaData的长度);
  • 第4-13个字节:字符串MetaData对应的16进制数字(0x6F 0x6E 0x4D 0x65 0x74 0x61 0x44 0x61 0x74 0x61);

第二个AMF:

  • 第1个字节:0x08,表示数组类型;
  • 第2-5个字节:表示数组的长度,onMetaData中具体包含哪些属性是不固定的。
  • 第6个字节+:比如duration,则:
    • 第6-9个字节:0x0008,表示长度为8个字节;
    • 第10-17个字节:0x6475 7261 7469,表示 duration 这个字符串;
    • 第18个字节:0x00,表示为数值类型;
    • 第19-26个字节:0x…,表示具体的时长;
字段大小含义
durationDOUBLE文件的时长
widthDOUBLE视频宽度(px)
heightDOUBLE视频高度(px)
videodatarateDOUBLE视频比特率(kb/s)
framerateDOUBLE视频帧率(帧/s)
videocodecidDOUBLE视频编解码器ID(参考Video Tag)
audiosamplerateDOUBLE音频采样率
audiosamplesizeDOUBLE音频采样精度(参考Audio Tag)
stereoBOOL是否立体声
audiocodecidDOUBLE音频编解码器ID(参考Audio Tag)
filesizeDOUBLE文件总得大小(字节)
示例

在这里插入图片描述

示例

解析flv header

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

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

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

相关文章

rocketmq消息过滤

1、目的 消费者订阅了某个主题后&#xff0c;Apache RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息&#xff0c;可通过设置过滤条件在 Apache RocketMQ 服务端进行过滤&#xff0c;只获取到需要关注的消息子集&#xff0c;避免接收到大量无效的消…

51单片机学习笔记5 流水灯实现及蜂鸣器控制

51单片机学习笔记5 流水灯实现及蜂鸣器控制一、流水灯1. 硬件电路2. 代码实现&#xff08;1&#xff09; 点亮一个LED的基本操作&#xff08;2&#xff09; 使用算术左移实现流水灯&#xff08;3&#xff09; 使用库文件左移函数二、蜂鸣器1. 蜂鸣器介绍2. 硬件电路原理图ULN20…

唯愿山城无恙-烟火寻常--爱摸鱼的美工(五)

-----------作者&#xff1a;天涯小Y 非常时期的非常生活&#xff01; 今天是承上启下的一天 无论好坏&#xff0c;本月都收官了 洗去一身的疲惫 大脑放空&#xff0c;搓澡 热衷搓澡的程度&#xff0c;简直不像南方人 收拾一下,迎接新的开始 原本一年之中&#xff0c;我最爱几…

搜索与图论-DFS

文章目录一、DFS1. DFS 简介2. DFS 的实现步骤3. DFS 实际演示二、DFS 例题——排列数字具体实现1. 样例演示2. 实现思路3. 代码注解4. 实现代码三、DFS 例题—— n-皇后问题&#xff08;经典&#xff09;具体实现——按行进行枚举1. 样例演示2. 实现思路3. 代码注解4. 实现代码…

微服务框架 SpringCloud微服务架构 9 初识 Docker 9.4 Docker 的安装

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构9 初识 Docker9.4 Docker 的安装9.4.1 安装Docker9.4.2 启动Docker9.4.3 配…

verilog练习——时序逻辑

目录 VL21 根据状态转移表实现时序电路 VL22 根据状态转移图实现时序电路 VL23 ROM的简单实现 VL24 边沿检测 VL21 根据状态转移表实现时序电路 题目分析&#xff1a; 1、使用三段式状态机&#xff0c;实现更为方便和简洁。 2、三段式和&#xff08;一段式、二段式&#x…

C++GUI之wxWidgets(2)-hello,world

目录wxWidgets的头文件事件main入口函数状态栏事件处理程序wxWidgets的头文件 首先必须包含wxWidgets的头文件。 1、可以在一个文件一个文件的基础上完成(如wx/window.h) 2、使用一个全局包含(wx/wx.h)&#xff0c;其中包括大多数常用的头文件(虽然不是所有的头文件&#xff0…

单变量微积分重点(1)

1.单调有界定理 若数列递增有上界&#xff0c;则数列收敛&#xff08;递减同样&#xff09; 2.海涅定理&#xff08;归结原则&#xff09; 说明&#xff1a;对于任何的属于空心邻域的数列&#xff0c;而且这些数列的极限都是x0. 3.两个重要极限&#xff1a; 4.11个重要极限 导…

基于PHP+MySQL托管中心管理系统的设计与实现

随着在校学生人数的不断增加,学生的数量也在不断的增加,但是很多时候因为父母工作忙没时间,以及一些其他的原因没办法对学生间辅导,这就诞生了托管中心这一行业,但是传统的托管中心多是人工手动的模式进行管理的,这很不科学也不合理,为了改变这一现状,我们开发了托管中心管理系…

SpringBoot_整合Mybatis-plus

一、入门案例 1.准备表结构和数据 准备如下的表结构和相关数据 DROP TABLE IF EXISTS user; ​ CREATE TABLE user (id BIGINT(20) NOT NULL COMMENT 主键ID,name VARCHAR(30) NULL DEFAULT NULL COMMENT 姓名,age INT(11) NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50) …

Java项目:SSM的KTV管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 主要功能包括&#xff1a; 登陆页,房间信息,房间管理,开取房间,房间查询,会员管理,食物管理,查看订单,查询订单,查看房间消费使用情况等功能。…

随笔荟萃 | sincerity

我们在第一学期中&#xff0c;有一堂经济政治与社会课上&#xff0c;老师给我们讲到共建社会主义和谐社会时&#xff0c;我们现在的社会需要更多的人参与&#xff0c;我又想起班主任陆坚老师对我们全班同学所说的话就是&#xff1a;“我们先做人后做事。”我们如何做人、做人的…

7.7 网络(一)

目录 一 网络是个什么玩意 1 网络很重要&#xff0c;发展很迅速 2 网络是一个很泛的概念 3 我们介绍什么 二 网络技术 1 网络架构 2 网络传输 3 网络安全与管理 网络是操作系统中很重要的一个模块&#xff0c;特别是在现代操作系统中。另外&#xff0c;网络也是软件开发人员必须…

基于PHP+MySQL简历模板下载管理系统

随着时代的发展和进步&#xff0c;互联网络日益成为大众生活的发展方向&#xff0c;每年都有大量的毕业生需要求职&#xff0c;在求职的过程中简历是必不可少的一个环节&#xff0c;但是很多时候求职人员不知道如何更好的制作一份简历&#xff0c;这个情况就需要到网上寻找对应…

OpenCV3图像处理笔记

此笔记针对 Python 版本的 opencv3&#xff0c;c 版本的函数和 python 版本的函数参数几乎一样&#xff0c;只是矩阵格式从 ndarray 类型变成适合 c 的 mat 模板类型。注意&#xff0c;因为 python 版本的opncv只提供接口没有实现&#xff0c;故函数原型还是来自 c版本的opencv…

PlanarSLAM:基于结构化约束的视觉SLAM

1. 摘要 在我们所熟知经典SLAM系统&#xff0c;以ORB-SLAM为代表的通过特征点法在相机位姿估计方面有很好的表现&#xff0c;但在一些人为构造的弱纹理环境下&#xff0c;由于缺少可靠的特征点的缘故&#xff0c;导致表现性能下降。 针对此种问题&#xff0c;作者通过根据周围…

介绍两个LVGL开发工具,让你做出更好的UI

环境 V公众号南山府嵌入式回复4001获取 NXP GUI-Guider 介绍的第一个就是恩智浦官方提供的&#xff0c;现在已经更新到1.4.1版本&#xff0c;相对前面的版本&#xff0c;变化还是挺大的&#xff0c;无论是界面设计还是其他的做的都挺不错的。而且特别好的一点是&#xff0c;支…

深度学习之初识篇——小白也能跑通的深度学习万能框架【重点】

目录深度学习环境配置点击下载深度学习环境数据集准备使用自己标注的数据集使用标注软件数据准备VOC标签格式转yolo格式并划分训练集和测试集部署和训练深度学习项目克隆项目获得预训练权重训练自己的模型启用tensorbord查看参数每文一语本文是作为后续跑深度学习的一个案例教程…

K - Kingdom‘s Power 贪心,E-奇环_牛客练习赛106 二分图 鸽笼原理,F-座位_概率期望,G-交换_dp​​​​​​

K - Kingdoms Power 贪心 一开始想的是要想路程最小&#xff0c;那么他一定是先去征服size最小的子树是最好的&#xff0c;然后就wa了&#xff0c;正解应该是按照深度来贪心&#xff0c;对于一个节点u的子节点&#xff0c;按照u走完子节点的步数进行排序&#xff0c;先从步数小…

年产3000吨冲压型果味硬糖生产车间工艺设计

目 录 摘 要 I Abstract II 1绪论 1 1.1选题概述 1 1.2市场分析 2 1.3设计参数和质量标准 3 1.3.1主要设计参数 3 1.3.2质量标准 3 2工艺流程设计 5 2.1工艺流程图 5 2.2工艺说明 5 2.2.1领料 5 2.2.2化糖 5 2.2.3过滤 6 2.2.4真空熬制 6 2.2.5冷却 6 2.2.6加辅料、调和 7 2.2.…