html5播放 h.264裸流,[转载]成功在MP4封装的H264视频中提取能播放的裸流
首先说明一下,本人只是从MP4(AVC)封装的h264视频流中成功把裸流提取出来并进行播放,而这一段MP4封装的流中是不含音频流的,因为项目并不需要实现这个,所以我也就偷懒了,需要从含有音频流的MP4当中提取h264的裸流,还请详细阅读ISO/IEC
14496系列文档,特别是12和15部分。
原理说明如下,.h264文件只需要写入sps,pps以及后面的视频裸流(nalu)就可以播放了,播放器可以选择VLC或者迅雷看看播放器,其它的没有测试过。
MP4文件是由一个一个box组成的文件,每个box的开头是box的length(4 byte),紧接着是4 byte的box
type,如果length是0x01的话,那么在box type后面接着的就是8 byte的box
length,再剩下的就都是box所包含的内容了,注意,box length包含box
length本身的字节数。当然,如果length是0x00的话,我就不是非常了解了,因为没有测试过,具体还是看一下的标准吧。
以下是ISO/IEC
14496-124.2对于box的定义。
aligned(8) class Box
(unsigned int(32) boxtype, optional unsigned int(8)[16]
extended_type) { unsigned int(32) size;
unsigned int(32) type =
boxtype;
if (size==1) { unsigned int(64)
largesize;
} else if (size==0)
{
// box extends to end of
file
}
if (boxtype==‘uuid’) {
unsigned int(8)[16] usertype =
extended_type;
}
}
上面的图片当中,第一个box的长度是0x18,类型是ftyp,第二个box的长度是
0xa3c0,类型是mdat。注意,这里的话,我是认为滴吧mdat的box放置于moov的box前面,只是为了能更好地说明签名length的表示方式。在没有封装音频的MP4文件当中,mdat的box中内容就是slice了,每一个slice包含了nalu的长度(默认4
byte)以及nalu的数据。
第一步,我们先来提取视频的sps,以及pps,一开始,看别人关于一些转码的视频总是不明白,为什么每次总是要先录制一段大概0.1秒的视频,然后才开始正式录制视频。原来相同的手机在相同的录制设定下sps以及pps是相同的,而moov的box有时候是放在mdat的box之后的,我们需要提取的视频的裸流是从mdat中提取的,这就不难解释了。废话少说,以下是
ISO/IEC
14496-155.2.4.1.1关于avcC的数据的定义,这些数据是封装在avcC当中的。
aligned(8) class AVCDecoderConfigurationRecord
{
unsigned int(8) configurationVersion =
1;
unsigned int(8)
AVCProfileIndication;
unsigned int(8)
profile_compatibility;
unsigned int(8) AVCLevelIndication;
bit(6) reserved = ‘111111’b;
unsigned int(2) lengthSizeMinusOne;
bit(3) reserved = ‘111’b;
unsigned int(5)
numOfSequenceParameterSets;
for (i=0; i<
numOfSequenceParameterSets; i++)
{
unsigned int(16)
sequenceParameterSetLength ;
bit(8*sequenceParameterSetLength)
sequenceParameterSetNALUnit;
}
unsigned int(8)
numOfPictureParameterSets;
for (i=0; i<
numOfPictureParameterSets; i++)
{
unsigned int(16)
pictureParameterSetLength;
bit(8*pictureParameterSetLength)
pictureParameterSetNALUnit;
}
}
对照上面的定义,我们可以知道avcC的box长度是0x21。lengthSizeminusone是0xff
&
0x03=3。这个参数加上1也就是4描述的是在slice里面对于nalu长度描述中的byte的个数(默认是4)。接下来的 0xE1
& 0x1f = 1描述的则是sps的个数,再接下来的两个byte 00 0A
描述的则是第一个sps的长度。所以,这里的sps就是 67 42 80 1E 95 A0 28 0F 5F
40。然后依次就是pps的个数 1 ,第一个pps的长度 00 04, pps就是 68 CE 3C 80。
至此,sps以及pps已经提取完毕。最后提取的就是h264的裸流了,这个裸流就是隐藏在slice当中的nalu了。slice就是mdat当中存放的内容。每个slice是这样定义的,首先是该slice的长度(注:长度的byte数有lengthSizeminusone那个参数决定,另外这里的长度并不包含slice本身所占的byte数目)。
当提取完毕以后,在sps,pps以及每个nalu前写入h264中的start code( 00 00 00
01),即可播放。以下是我所提取的视频,sps以及pps与上述的相同。
以上仅仅是本人在MP4学习中对MP4格式的一些理解,如果有什么错误,还望指出。
html5播放 h.264裸流,[转载]成功在MP4封装的H264视频中提取能播放的裸流相关推荐
- 成功在MP4封装的H264视频中提取能播放的裸流
首先说明一下,本人只是从MP4(AVC)封装的h264视频流中成功把裸流提取出来并进行播放,而这一段MP4封装的流中是不含音频流的,因为项目并不需要实现这个,所以我也就偷懒了,需要从含有音频流的MP4 ...
- ASP.NET MVC程序播放H.264视频
在这篇之前,Insus.NET不管是在ASP.NET还是ASP.NET MVC实现很多视频播放,你可以参考这篇链接:http://www.cnblogs.com/insus/category/4650 ...
- 利用FFmpeg将H.264文件读入内存,再输出封装格式文件
/***先将H.264文件读入内存,*再输出封装格式文件.*/ #include "stdafx.h"#define __STDC_CONSTANT_MACROSextern &q ...
- hi3516a——RTSP播放H.264视频流(1)
前言 由于hi3516a海思自带的开发应用程序是通过摄像头接口或HDMI接口获取视频数据后并进行存储.然而,在实际应用中,多是获取数据后直接通过网络把数据发送出去.那么本文章将开始学习hi3516a获 ...
- Android如何播放h.264格式视频
关于h.264格式的视频文件播放,我们可以通过android.media.MediaCodec这个接口去解码实现,这个对搞流媒体,安防实时视频传输的朋友应该很熟悉,这边只是个demo,有需要的同学自行 ...
- 关于LED电视机视频编码H.264,MPEG4,MPEG2能支持哪些格式的视频文件
MPEG4封装格式能支持.MPG..3GP..MP4等视频文件格式的视频. 今天买了一台很普通的LED电视机,当前电视机基本都提供USB接口,以便播放U盘或者移动硬盘的视频资源,可是在问卖家电视机支持 ...
- html如何播放h264视频,浏览器 – 我如何播放H264视频?
嗯..从它的外观看起来它不像H264文件.. 通过MediaInfo运行它,我得到了这个: Video Format : AVC Format/Info : Advanced Video Codec ...
- 从mkv文件中提取src格式等字幕流
增加字幕流 ffmpeg -i video.avi -i sub.ass -map 0:0 -map 0:1 -map 1 -c:a copy -c:v copy -c:s copy video.mk ...
- 播放器地址抓取 php,PHP实现使用优酷土豆视频地址获取swf播放器分享地址
项目用到临时写的.待完善: switch ($type){ case 'youku' : if( $domain == 'player' ) { $swf = $url; }else if( $dom ...
- (转载)H.264码流的RTP封包说明
H.264的NALU,RTP封包说明(转自牛人) 2010-06-30 16:28 H.264 RTP payload 格式 H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) ...
最新文章
- JS学习之路之JavaScript match() 方法
- gearman python 实例
- linux下安装lrzsz,配合SecureCRT上传下载文件
- java标签组件命名_Java——标签组件:JLabel
- 安装office2010出现了错误,提示要安装MSXML6.10.1129.0解决方法
- http 请求头回显
- 外部表改为内部表_2、从外部导入数据创建表(ACCESS图解操作系列)
- 学业水平测试计算机考试软件,普通高中学业水平考试系统
- 企业员工考勤管理子系统
- linux下载jdk
- kei4的安装教程(附下载地址)
- 计算机本地连接xp,xp系统本地连接不见了的解决方法
- Hudi-Flink SQL实时读取Hudi表数据
- EasyUI学习笔记6:MIS开发利器_ datagrid插件(上)
- Mac os下快速从终端进入Finder 从Finder进入终端
- 菜鸟自学02:下载参考基因组及构建bowtie2索引
- 【蓝桥杯】 C++ 纸张尺寸
- 50首最好听的英文歌
- 合同诈骗案立案标准是怎样的
- fedora的官方镜像地址列表
热门文章
- python条形堆积图_python – 带有中心标签的堆积条形图
- 西门子PID程序,西门子PLC 1200和G120西门子 变频器Modbud RTU通讯,带西门子触摸屏,带变频器参数/Modbus通讯报西门子PID程序
- 计算机在录制声音过程中流向,Bandicam电脑声音如何录制?电脑声音录制流程图文介绍...
- DONET中常用的一些快捷键收集。
- php dwg格式,dwg格式怎么打开 dwg格式打开的方法
- 假期无聊 就来试试用Python做一个智能识别 包教会哦 多图预警:配置Pyqt5超详细解说(designer.exe和pyuic.exe)以及项目:Python实现百度智能识别,识别各种实物
- 本地组策略编辑器计算机配置,本地组策略编辑器
- SpringBoot filter 责任链
- 计算机怎么改鼠标标志,鼠标指针怎么换,教您如何更换鼠标指针
- npm安装opencv4nodejs(Windows)