本文将介绍如何将H.264封装成flv格式。

在看本文之间,建议先看一看下面两篇文章:

H.264码流结构

FLV格式详解

首先说一说构建一个FLV文件需要什么?

FLV Header + FLv script tag + FLV Video tag + FLV Audio tag

由于这里只是封装H.264,所以不包括Audio tag。

下面将通过分析示例来说明FLV Header + FLv script tag + FLV Video tag这三部分如何构建。

1、FLV Header

通过阅读上面的文章《FLV格式详解》应该就很清楚FLV Header的内容了。

下面来分析一个实例:

Signature:0x46('F')
Signature:0x4c('L')
Signature:0x56('V')
Version:01
Flags:01TypeFlagsReserved [Bit 3-7]:0TypeFlagsAudio [Bit 2]:0TypeFlagsReserved [Bit 1]:0TypeFlagsVideo [Bit 0]:1
DataOffset:00 00 00 09
preTagSize:00 00 00 00 // 第一个tag默认为0

2、FLv script tag

又称Metadata Tag,位于flv header后的第一个tag

下面来分析一个实例

Tag Header:

TagType:12(表示这是一个script tag)
Datasize:00 00 9f(Tag Data 部分的大小)
Timestamp:00 00 00(该Tag的时间戳)
Timestamp_ex:00(时间戳的扩展部分)
StreamID::00 00 00(总是0)

Tag data:

因为TagType为0x12,所以这部分的数据为两个AMF包

第一个AMF包:

type:02(表示字符串)
stringLen:00 0a(字符串长度为10)
string:6f 6e 4d 65 74 61 44 61 74 61(onMetaData)

第二个AMF包:

type:08(表示数组)
arrayNum:00 00 00 07(数组元素个数)
stringLen:00 08(第一个数组元素字符串长度)
string:64 75 72 61 74 69 6f 6e(duration)
valType:00(数据类型,double型)
val:40 03 70 a3 d7 0a 3d 71(double型)
stringLen:00 05
string:77 69 64 74 68(width)
...
end:00 00 09
preTagSize:00 00 00 aa

3、FLV Video Tag

这部分封装着图像数据,也就是H.264的数据封装在这里。

H.264是由一个一个NALU组成,NALU的类型有(SPS、PPS、I帧的SLICE、非I帧的SLICE)

封装H.264就是将这些NALU一个一个取出来,然后封装成Tag。

需要注意的是,SPS与PPS必须封装在一个Tag中。

下面分别通过实例来分析各种NALU(SPS、PPS、I帧的SLICE、SEI、非I帧的SLICE)是怎么封装的。

1、SPS与PPS

Tag Header:

TagType:09(Tag的类型,包括音频(0x08)、视频(0x09)、script data(0x12))
Datasize:00 00 2e(Tag Data 部分的大小)
Timestamp:00 00 00(时间戳,19ms)
Timestamp_ex:00(时间戳的扩展部分)
StreamID:00 00 00(总是0)

Tag data:

FrameType | CodecID:17(keyframe | AVC)(视频tag的参数)

AVCVideoPaket:(因为CodecID==7,所以VideoData为AVCVideoPaket)

AVCPaketType:00(ACVPacket的类型,0: AVC sequence header;1: AVC NALU;2: AVC end of sequence)
CompositionTime:00 00 00

(因为ACVPaketType==0,所以Data=AVCDecoderConfigurationRecord)
AVCDecoderConfigurationRecord:

configurationVersion:01
AVCProfileIndication:64
profile_compatibility:00
AVCLevelIndication:1e
lengthSizeMinusOne:ff
numOfSequenceParameterSets:e1(低五位为SPS的个数,计算方法为:numOfSequenceParameterSets & 0x1F=1)
sequenceParameterSetLength:00 18(SPS的长度,24)
sequenceParameterSetNALUnits:67 64 00 1e ac d9 40 a0 33 b0 11 00 00 03 02 47 00 00 6d 34 0f 16 2d 96(SPS)
numOfPictureParameterSets:01(PPS的个数)
pictureParameterSetLength:00 06(PPS的长度)
pictureParameterSetNALUnits:68 eb e3 cb 22 c0(PPS)
previousTagSize:00 00 00 39

2、I帧的SLICE

Tag Header:

TagType:09(Tag的类型,包括音频(0x08)、视频(0x09)、script data(0x12))
Datasize:00 35 78(Tag Data 部分的大小)
Timestamp:00 00 0a(时间戳,19ms)
Timestamp_ex:00(时间戳的扩展部分)
StreamID:00 00 00(总是0)

Tag data:

FrameType | CodecID:17(key frame | AVC)(视频tag的参数)

因为CodecID==7,所以VideoData为AVCVideoPaket

AVCVideoPaket:

AVCPaketType:01(ACVPacket的类型,0: AVC sequence header;1: AVC NALU;2: AVC end of sequence)
CompositionTime:00 00 0a
NaluLen:00 00 35 6f
NaluData:...
preTagSize:00 00 35 83

对于SEI的封装跟I帧是一样的。

3、非I帧的SLICE

非I帧的封装格式和I帧的封装格式基本一样,唯一不同的是FrameType | CodecID:部分,应该设置为:

FrameType | CodecID:27(inter frame | AVC)(视频tag的参数)

总结:以上通过实例讲解了FLV的头部信息,script tag,以及H.264不同类型的NALU如何封装成tag,下面放出源码。

GitHub:https://github.com/ImSjt/H.264toFLV

CSDN下载:https://download.csdn.net/download/weixin_42462202/11037715

将H.264封装为FLV格式相关推荐

  1. java封装264成flv,将H.264封装为FLV格式-Go语言中文社区

    本文将介绍如何将H.264封装成flv格式. 在看本文之间,建议先看一看下面两篇文章: 首先说一说构建一个FLV文件需要什么? FLV Header + FLv script tag + FLV Vi ...

  2. H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式

    H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +------------ ...

  3. 将h.264视频流封装成flv格式文件(一.flv格式)

    原帖地址:http://blog.csdn.net/yeyumin89/article/details/7932368 原帖虽然贵为好贴,看感觉看起来有点乱,没有层次感,贴过来,修改下格式,阅读起来方 ...

  4. H.264视频RTP负载格式/NALU的类型

    1. 网络抽象层单元类型(NALU) NALU 头由一个字节组成, 它的语法如下:       +===============+       |0|1|2|3|4|5|6|7|       +=+= ...

  5. 将h.264视频流封装成flv格式文件

    https://blog.csdn.net/leixiaohua1020/article/details/84519384 https://blog.csdn.net/xin_hua_3/articl ...

  6. linux mp4转h264工具,在Ubuntu下批量转换视频为H.264编码的mp4格式

    是目前比较流行的视频编码方式,比起MPEG2在画质大致相同的情况下能再压缩2-4倍,即如果一个DVD视频大小是1GB,用H264编码后能缩小到250MB左右,同时H264视频还能用时髦的浏览器(比如F ...

  7. RTMP推流H.264

    t通过对以下内容的学习完成H.264的推流 1.H.264格式分析 https://time.geekbang.org/column/article/461658 2.FLV格式分析 https:// ...

  8. H.264 RTP payload 格式

    H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+       |0|1|2|3|4|5|6| ...

  9. 音视频 FLV格式解析

    前言 本文介绍FLV封装格式,直播场景下拉流比较常见的是http-flv直播流,具有延时低.易传输等特点. 格式概览 总体上看,FLV包括文件头(File Header)和文件体(File Body) ...

  10. 流媒体解码及H.264编码推流

    简介 相关理论 程序流程 Opencv解析视频流 像素格式转换 FFmpeg进行H.264编码 FFmpeg进行格式封装和推流 这里我们使用了FFmpge的sdk和Opencv的sdk.为了方便测试, ...

最新文章

  1. C#多线程编程介绍——使用thread、threadpool、timer
  2. 1.2 @Override注解
  3. 从1.5k到18k, 一个程序员的5年成长之路【转载】
  4. 昇腾AI处理器软件栈--流程编排器(Matrix)
  5. 基于Django的博客系统
  6. 由浅入深理解索引的实现(2)【转】
  7. 会员注册审核状态更新计算
  8. 不能从远程创建com+对象_链路追踪SkyWalking源码分析——Collector Remote远程通信服务...
  9. 【学习笔记】生成下一个排列(STL库函数next——permutation)
  10. 头歌c语言答案循环结构,C语言的“汤头歌”
  11. google 翻译 api
  12. LDO:低压差线性稳压芯片
  13. stm32 看门狗 BKP(HAL库)
  14. 【系列】重新认识Java——基本类型和包装类
  15. 高精度地图,从入门到入行
  16. Mac下载安装配置maven
  17. 网页PDF下载,有了这3种方法,文档随便下
  18. 机器学习--鸢尾花数据集实战
  19. Bugku之聪明的小羊
  20. 计算机毕业设计Java高校游泳馆信息管理(源码+系统+mysql数据库+Lw文档)

热门文章

  1. Windows下和Linux下VS Code与C/C++ Python Go Java Vue3 Git vim Latex开发环境搭建和配置史上最详细易懂的讲解
  2. 链表A拆分成奇数和偶数值链表B和C
  3. 优化网站提高打开速度
  4. Android setLayoutparams失效几个原因
  5. 三菱Q系列PLC数据采集随笔
  6. 代码实现HelloMeituanCom转换为hello.meituan.com
  7. 韦东山第3期嵌入式Linux项目-视频监控-1-v4l2视频框架分析
  8. 联盛德 HLK-W806 (三): 免按键自动下载和复位
  9. matlab编程螺旋oam,一种多模态OAM涡旋电磁波微带阵列天线制造技术
  10. 虹科AR智能眼镜是什么?好用吗?