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

本文将介绍如何将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的内容了。

下面来分析一个实例:

756f80fa8e8a503fec7b99c0081ee19e.png

Signature:0x46('F')

Signature:0x4c('L')

Signature:0x56('V')

Version:01

Flags:01

TypeFlagsReserved [Bit 3-7]:0

TypeFlagsAudio [Bit 2]:0

TypeFlagsReserved [Bit 1]:0

TypeFlagsVideo [Bit 0]:1

DataOffset:00 00 00 09

preTagSize:00 00 00 00 // 第一个tag默认为0

2、FLv script tag

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

下面来分析一个实例

ff450a64e0b7406dff4e2ae841e1bb4c.png

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

806a7c8229580407cae59d0ced684dfd.png

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

fbbfacbce62bb5131b115d94b36815e9.png

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,下面放出源码。

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

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

相关文章

Activity 模版样式简介

1&#xff1a;对话框样式。 <activity android:theme"android:style/Theme.Dialog"> 2&#xff1a;透明样式。 <activity android:theme"android:style/Theme.Translucent"> 3&#xff1a;Light 样式,标题栏是细长型的&#xff0c;在4.0版本默…

java连接ldap验证,验证用户使用LDAP登录

我无法使用LDAP成功验证ASP.NET Web应用程序的用户 . 我已经在我们自己的网络上针对Active Directory这样做了&#xff0c;但这是针对我们网络之外的服务器&#xff0c;即OID(Oracle Internet Directory) .通常&#xff0c;我使用以下代码没有问题 .Dim myDirectoryEntry As Ne…

[转]iis7.5+win2008 出现 HTTP Error 503. The service is unavailable.

解决&#xff1a; 应用程序池启动32位应用程序 设置托管管道为集成 &#xff08;仍然有问题&#xff09; 试试以下方法&#xff1a; http://phpwind.me/1222.html 楼主 发表于: 2011-11-26 图片:123.png 访问网站之前 应用程序池是开启的 访问后 网页报503 service unavailabl…

mysql数据库的存储过程不用学吗,MySql数据库之存储过程学习_MySQL

之前在工作中总是听别人提到存储过程&#xff0c;觉得是个很高深的东西&#xff0c;利用工作之余&#xff0c;看了下相关的知识&#xff0c;现将学习知识总结如下&#xff0c;希望可以为刚学习的人提供些许帮助。开发环境&#xff1a;Navicat For Mysql。MySQL存储过程1.1、CRE…

// D:\SaveLog\_SaveLog.dpr立即备份晓亮的电脑操作记录热键(快捷键) F11由于原来的 AutoIt 杀毒软件总是误报没办法只好麻烦一点用 Delphi XE4 做了...

// D:\SaveLog\_SaveLog.dpr立即备份晓亮的电脑操作记录 热键(快捷键) F11由于原来的 AutoIt 杀毒软件总是误报没办法只好麻烦一点用 Delphi 各种版本 做了 (我主要用的版本是Delphi2007(Delphi11)) (从Delphi6到Embarcadero.Delphi.XE5.Lite) // D:\SaveLog\_SaveLog.dpr立即备…

python list sort by,python中List的sort方法指南

简单记一下python中List的sort方法(或者sorted内建函数)的用法。List的元素可以是各种东西&#xff0c;字符串&#xff0c;字典&#xff0c;自己定义的类等。sorted函数用法如下&#xff1a;sorted(data, cmpNone, keyNone, reverseFalse)其中&#xff0c;data是待排序数据&…

开站资源

1. 存储 七牛云存储 http://www.qiniu.com/ 2. 网站模板 https://drupal.org/ 参考&#xff1a;http://www.w3cplus.com转载于:https://www.cnblogs.com/javawer/p/3407065.html

sublime php运行环境,sublime php 运行环境

sublime php 运行环境sublime php 运行环境有时候需要用运行一段 PHP 代码&#xff0c;比如测试某个函数返回值等等&#xff0c;如果启动Http Server&#xff0c;再打开浏览器&#xff0c;那黄花菜都凉了。我们可以在 Sublime Text 3 中创建 php 的 build system&#xff0c;这…

由硬盘供电不稳、数据线品质差造成的蓝屏

开机正常&#xff0c;一但运行高IOPS的软件&#xff0c;就会蓝屏。 换电源或换数据线。或减短线路长度。 常见&#xff1a;0x0000007a rdyboost.sys ntkrnlpa.exe、0x000000f4 ntkrnlpa.exe Hookport.sys、0x1000008e ntkrnlpa.exe kisknl.sys。转载于:https://www.cnblogs.com…

用Java写有关早上的语录,实用的适合早上发的早安问候语语录汇编39句

实用的适合早上发的早安问候语语录汇编39句不管梦想是什么&#xff0c;只有带着淡然的态度&#xff0c;做好当前的事情。早安&#xff01;下面是小编精心准备的适合早上发的早安问候语39句,欢迎大家前来欣赏。1、世上除了生死&#xff0c;其它都是小事。不管遇到了什么烦心事&a…

Phonegap在ios7上系统状态栏的问题解决

用Phonegapjqm开发的应用&#xff0c;在ios6下没问题&#xff0c;但是在ios7下会出现如下系统状态栏和header重合的问题&#xff0c;搜索了一下&#xff0c;发现这其实是 phonegap当前版本的一个已知问题&#xff0c;通过修改./platforms/ios/whhe/Classes /MainViewController…

php对角线数组代码,php数组内容查找代码

Array([0] > Array([id] > 6[title] > 凤凰[bid] > 2)[1] > Array([id] > 5[title] > 年康[bid] > 2)[2] > Array([id] > 4[title] > 海鸥[bid] > 2)[3] > Array([id] > 3[title] > 111cn.net[bid] > 1)[4] > Array([id] &…

JQuery合并表格单元格

转&#xff1a;http://www.cnblogs.com/xuguoming/p/3412124.html JQuery合并表格单元格 一、需求 如果存在一个表格&#xff0c;想把其中某一列内容相同的部分合并单元格&#xff0c;用JQ动态如何操作&#xff0c;原始表格如下&#xff1a; 合并单元格之后的表格如下&#xff…

[音视频]H264码流分析工具

[音视频]H264码流分析工具 CTI-TS EasyICE Elecardstreameyetools VideoEye H264VideoESViewer 学习H264码流&#xff0c;H264码流进行分析 http://blog.csdn.net/leixiaohua1020/article/details/17933821 H264BSAnalyzer https://github.com/latelee/H264BSAnalyzer.g…

手机型号识别 手机PID UID 驱动识别 数据库包

主要用在手机驱动识别,列如手机助手开发,都需要用到这个.QQ9711-5034 整套数据库以及源码包含如下&#xff1a; 1&#xff09; 包含1160 张手机外壳图片&#xff0c;78 个手机驱动文件。 2&#xff09; 支持192 个品牌&#xff0c;2293 款手机&#xff0c;还有山寨机没有统计进…

php yii 表单title,Yii2.0-ActiveForm表单结构自定义教程

应用实例:use yii\bootstrap\ActiveForm;$form ActiveForm::begin([layout > horizontal]);// 隐藏form的标签echo $form->field($model, demo, [inputOptions > [placeholder > $model->getAttributeLabel(demo),],])->label(false);// 内联 radio listech…

Chart.js学习

一、简介 Chart.js是一个基于HTML5的简单的面向对象的图表库&#xff0c;支持包括IE7和8的所有现代浏览器。图表库中有6种表&#xff0c;分别是&#xff1a;曲线图&#xff08;Linecharts&#xff09;、柱状图&#xff08;Barcharts&#xff09;、雷达图&#xff08;Radarchart…

php 关闭电脑,php实现用手机关闭计算机(电脑)的方法

本文实例讲述了php实现用手机关闭计算机(电脑)的方法。分享给大家供大家参考。具体分析如下&#xff1a;适合有手机和电脑&#xff0c;用wifi的php web开发。方便关闭你的电脑(尤其在你想睡觉时 )&#xff0c;适合局域网用法&#xff1a;放在你的web项目文件夹&#xff0c;可以…

mysql数据库常用备份、恢复命令

转自&#xff1a;http://blog.csdn.net/bxbx258/article/details/2945832 还原一个数据库:mysql -h localhost -u root -p123456 www<c:/www.sql 备份一个数据库:mysqldump -h localhost -u root -p123456 www > d:/www2008-2-26.sql **********************************…

oracle的标准写法,oracle 表连接特有写法与标准写法

oracle里表连接支持标准写法&#xff0c;但也有oracle特殊的写法&#xff0c;这两种写法在某些场景下会有差异&#xff0c;推荐使用标准写法&#xff0c;这里只是介绍表连接标准语法及了解oracle的特殊写法。标准连接语法&#xff1a;select table1.column , table2.columnfrom…