flv格式分析与解复用

news2024/11/13 15:46:50

介绍

        FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、 封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV 格式封装的⽂件后缀为.flv。

        FLV封装格式是由⼀个⽂件头(file header)和 ⽂件体(file Body)组成。其中,FLV body由⼀ 对对的(Previous Tag Size字段 + tag)组成。Previous Tag Size字段 排列在Tag之前,占⽤4 个字节。Previous Tag Size记录了前⾯⼀个Tag的⼤⼩,⽤于逆向读取处理。FLV header后 的第⼀个Pervious Tag Size的值为0。

Tag⼀般可以分为3种类型:脚本(帧)数据类型、⾳频数据类型、视频数据。FLV数据以⼤端序 进⾏存储,在解析时需要注意。⼀个标准FLV⽂件结构如下图

FLV⽂件的详细内容结构如下图:

音视频存在索引下标是5 7  

整体的解析框架

 详细剖析

注:在下⾯的数据type中,UI表示⽆符号整形,后⾯跟的数字表示其⻓度是多少位。⽐如 UI8,表示⽆符号整形,⻓度⼀个字节。UI24是三个字节,UI[8*n]表示多个字节。UB表示位 域,UB5表示⼀个字节的5位。可以参考c中的位域结构体。

FLV header

FLV头占9个字节,⽤来标识⽂件为FLV类型,以及后续存储的⾳视频流。
⼀个FLV⽂件,每种类型的tag都属于⼀个流,也就是⼀个flv⽂件最多只有⼀个⾳频流,⼀个视频流,不存在多个独⽴的⾳视频流在⼀个⽂件的情况。
    
FLV头的结构如下:
签名 UI8 'F'(0x46)
签名 UI8 'L'(0x4C)
签名 UI8 'V'(0x56)

版本 UI8 FLV的版本。0x01表示FLV版本为1


typeflags:
    保留字段 UB5 前五位都为0
    ⾳频流标识 UB1 是否存在⾳频流
    保留字段 UB1 为0
    视频流标识 UB1 是否存在视频流

dataOffset  ⽂件头⼤⼩  UI32 
FLV版本1时填写9,表明的是FLV头的⼤⼩,为后期的FLV版本扩展使⽤。包括这四个字节。数据的起始位置就是从⽂件开头偏移这么多的⼤⼩。

FLV Body

FLV Heade之后是FLV File Body。(一般15字节)
FLV File Body =N*(PreviousTagSize + tags)构成。

 

解析一组body 

tag n: 

 flv文件分析示例

小结:

data1不同类型处理

视频帧类型 Video Tag Data

 

Frame Type (4 bits)
标识当前帧的类型,可以是关键帧(Keyframe, 值为 1)或非关键帧(非值为 1)。
Codec ID (4 bits)
标识视频编码的类型,如 H.264(7)、VP6(4)、Sorenson H.263(2)等。

对于非 H.264 编码:视频编码数据根据不同的编码格式,这里包含实际的视频编码数据。


对于 H.264 编码:
AVCPacketType (8 bits) :当前数据包的类型,可以是 0(AVCDecoderConfigurationRecord)、1(NALU)或2(empty)。
CompositionTime (24 bits, signed integer):视频帧的显示时间偏移,单位为毫秒。

注意:显示时间 = 解码时间(tag的第5~8字节(tag.timestamp),位置索引[4]~[7])+ CompositionTime

NALU 数据
如果 AVCPacketType 为 1,则这里包含一个或多个 NALU(Network Abstraction Layer Unit)。


总结:
非 H.264 编码: 1 byte (Frame Type + Codec ID) + 视频编码数据长度


H.264 编码: 1 byte (Frame Type + Codec ID) + 1 byte (AVCPacketType) +3 bytes (CompositionTime) + data2数据长度(nalu)

音频帧类型Audio Tag Data结构

音频参数提取格式:

字段名称                                 字节数        描述
audioObjectType                    5 bits        AAC 音频编码类型
samplingFrequencyIndex       4 bits        采样率索引
channelConfiguration              4 bits        声道数
frameLengthFlag                     1 bit    帧长度标志
dependsOnCoreCoder            1 bit    是否依赖核心编码器
extensionFlag                          1 bit    扩展标志

adts首部学习:

AAC分析_aac syncword 帧长-CSDN博客

脚本帧类型

Script data脚本数据就是描述视频或⾳频的信息的数据,如宽度、⾼度、时间等等,⼀个⽂ 件中通常只有⼀个元数据,⾳频tag和视频tag就是⾳视频信息了,采样、声道、频率,编码等 信息。

Script Tag Data结构(脚本类型、帧类型)

该类型Tag⼜被称为MetaDataTag,存放⼀些关于FLV视频和⾳频的元信息,⽐如:duration、width、 height等。通常该类型Tag会作为FLV⽂件的第⼀个tag,并且只有⼀个,跟在File Header后。

AMF包
  1. 第一个 AMF 包:

    • 第 1 个字节 (0x02) 表示这是一个字符串类型的 AMF 包。

    • 第 2-3 个字节 (0x000A) 表示字符串的长度,这里是 10,对应 "onMetaData"。

    • 后面 10 个字节 (0x6F,0x6E,0x4D,0x65,0x74,0x61,0x44,0x61,0x74,0x61) 就是字符串 "onMetaData"。

  2. 第二个 AMF 包:

    • 第 1 个字节 (0x08) 表示这是一个数组类型的 AMF 包。

    • 第 2-5 个字节 (某个 UI32 值) 表示数组中元素的个数。

    • 后面就是这个数组的各个元素,每个元素是一个包含名称和值的对。常见的数组元素包括视频编码信息、音频编码信息、持续时间等。

小结:

  • 第一个 AMF 包起到一个引导作用,告诉我们接下来的数据是 FLV 文件的元数据。

  • 第二个 AMF 包才是真正的元数据容器,存储了文件的各种属性信息。

 flv文件分析amf包

 提取amf包

脚本格式分析:

信息举例

000003D  width (16 bytes)
000003D   StringLength:                         5 (0x0005)
000003F   StringData:                           width
0000044   Type:                                 0 (0x00) - DOUBLE
0000045   Value:                                1920.000

 参考表单位:k/bps:

 

 总结

详细解析flv的数据格式以及如何对aac和avc解复用操作

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

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

相关文章

0基础深度学习项目13:基于TensorFolw实现天气识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 一、创建环境二、前期准备2.1 设置GPU2.2 导入数据2.3 数据预处理2.3.1 加载数据2.3.2 查看图像的标签 2.4 数据可视化 三、构建简单的CNN网络&#xff0…

NVDLA专题12:具体模块介绍——RUBIK

概述 RUBIK类似于BDMA,它无需任何数据计算对数据映射格式进行转换。RUBIK有3种工作模式,分别是: 合并(Contract)数据立方体将特征数据立方体分割为多平面(multi-planar)格式将多平面(multi-planar)格式合并到数据立方体 由于该…

第三十八篇-TeslaP40-SenseVoice部署,速速杠杠的

环境 系统:CentOS-7 CPU: 14C28T 内存:32G 显卡:Tesla P40 24G 驱动: 535 CUDA: 12.2创建环境 conda create -n sv python3.11 -y conda activate sv克隆 git clone https://github.com/FunAudioLLM/SenseVoice.git cd SenseVoice配置镜像…

React antd Table表格动态合并单元格

注意: ① 采用的是React antDsign 4.x版本 ② 需重新处理data数据 实现效果 代码实现 import React from react; import { Table } from antd;const data [{key: 0,name: 张三,age: 22,sex: 男,},{key: 1,name: 李四,age: 42,sex: 男,},{key: 2,name: 小丽,age: …

CAN的协议层介绍

一,CAN帧种类介绍 1. 数据帧(Data Frame):数据帧是CAN总线上用于传输用户数据的帧,包括必要的帧头、标识符、控制位、数据长度代码、数据域、CRC校验码和应答域等部分,是CAN通信中最基本和最重要的帧类型。…

Android Room DataBase

Room数据库是在Sqlite的基础上,进行了封装和优化。这让我们可以摆脱,繁琐的数据库操作 在module的gradle里面,加入: dependencies {annotationProcessor "androidx.room:room-compiler:2.3.0"implementation androidx.room:room-…

Selenium自动化测试 常见API的使用

本篇文章内容是关于 Selenium 自动化测试工具的常见 API 的使用 Selenium版本:4.23.1 编程语言:Java JDK22 编译器:IDEA 2024.2.0.2 浏览器版本:谷歌浏览器128.0.6613.36(正式版本) (64 位&…

【Hexo】hexo-butterfly主题添加装备展示页面

本文首发于 ❄️慕雪的寒舍 在翻开往的时候看到了一位老哥的博客里面正好有这个教程,整了一下发现效果还不错! Hexo的Butterfly魔改教程:我的装备,分享你在用的设备 | 张洪HeoHexo博客添加自定义css和js文件 | Leonus 注&#x…

Python个人收入影响因素模型构建:回归、决策树、梯度提升、岭回归|数据分享...

全文链接:https://tecdat.cn/?p37423 分析师:Greata Xie “你的命运早在出生那一刻起便被决定了。”这样无力的话语,无数次在年轻人的脑海中回响,尤其是在那些因地域差异而面临教育资源匮乏的年轻人中更为普遍。在中国&#xff0…

NRC-SIM:基于Node-RED的多级多核缓存模拟器

整理自: 《NRC-SIM: A NODE-RED Based Multi-Level, Many-Core Cache Simulator》,由 Ezequiel Trevio 撰写,作为他在德克萨斯大学里奥格兰德河谷分校攻读电气工程硕士学位的部分成果。以下是论文的详细主要内容: 摘要(Abstract…

全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式

全网最适合入门的面向对象编程教程:37 Python 常用复合数据类型-列表和列表推导式 摘要: 在 Python 中,列表是一个非常灵活且常用的复合数据类型。它允许存储多个项,这些项可以是任意的数据类型,包括其他列表。列表推…

大话MoE混合专家模型

MoE(Mixture of Experts),专家混合,就像是人工智能界的超级团队。想象一下,每个专家都有自己的拿手好戏,比如医疗问题找医生,汽车故障找机械师,做饭找大厨。MoE也是这样,…

【前端面试】操作系统

进程与线程 进程线程定义是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位是进程中的一个实体,是CPU调度和分派的基本单位,共享进程的资源资源分配拥有独立的内存空间和系统资源共享进程的内存和资源开销…

【Harmony OS 4.0】像素单位 - px、vp、fp

1. px 物理像素,以像素个数来定义图像尺寸。弊端是,在不同像素密度的屏幕上,相同的像素个数对应的物理尺寸是不同的。就会导致我们的应用在不同设备上显示的尺寸可能不同。如下图: 2. vp(Virtual Pixel) 虚拟像素是一种可根据屏幕…

L-Eval:一个60k左右长文评测数据集

前言 L-Eval是复旦大学邱锡鹏老师团队在 2023 年 7 月左右发布的一个标准化的长文本语言模型(LCLMs)评估数据集,包含20个子任务、411篇长文档、平均长度为7217个单词,超过2000个人工标记的QA对。它分为封闭型任务和开放型任务&am…

Niushop商城第三方插件cps联盟_同城配送_上门预约上手教程配置方法适合单商户和多商户以及V6哈

Niushop商城第三方插件cps联盟_同城配送_上门预约上手教程配置方法 序言:Niushop里面插件比较多可以说有上百种, 不过大多数都是官方自研默认自带50余种剩余的是收费的价格在80-299不等,另外的插件就是和第三方合作,简单的说就是…

25届应届网安面试,默认页面信息泄露

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

linux系统使用yum安装mysql5.6版本的流程

1.下载安装包及依赖包 MySQL :: Download MySQL Community Server (Archived Versions) [rootlocalhost localrepo]# ls MySQL-client-5.6.47-1.el7.x86_64.rpm MySQL-server-5.6.47-1.el7.x86_64.rpm MySQL-test-5.6.47-1.el7.x86_64.rpm MySQL-devel-5.6.47-1.…

如何关闭谷歌浏览器后台运行

当谷歌浏览器不再需要时仍处于后台运行的状态,这不仅消耗宝贵的系统资源,还会影响到多任务的处理效率。本文将为大家详细介绍关闭谷歌浏览器后台还在运行的原因,并提供详细步骤帮助大家禁用后台运行。(本文由https://www.liulanqi…

【FESCO福利专区-注册安全分析报告-无验证方式导致安全隐患】

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