`
chriszeng87
  • 浏览: 732870 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

成功在MP4封装的H264视频中提取能播放的裸流

    博客分类:
  • iOS
阅读更多

按这个步骤成功提取出裸流,mark一下:

首先说明一下,本人只是从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-12 4.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;
 } 
   }
成功在MP4封装的H264视频中提取能播放的裸流
 
 
上面的图片当中,第一个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-15 5.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; 
 } 
}
成功在MP4封装的H264视频中提取能播放的裸流
对照上面的定义,我们可以知道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封装的H264视频中提取能播放的裸流

以上仅仅是本人在MP4学习中对MP4格式的一些理解,如果有什么错误,还望指出。

 

 

转自:http://blog.sina.com.cn/s/blog_6e1ad0cf01016zl3.html

分享到:
评论

相关推荐

    mp4v2封装h264裸流为MP4库

    在实际应用中,我们有时需要将H264裸流(即未经封装的H264 NAL单元)封装到MP4容器中,以便于播放和传输。这里提到的"mp4v2封装h264裸流为MP4库"就是为此目的设计的。 MP4v2库是一个开源项目,它的目标是提供一个...

    利用ffmpeg将H264裸流文件封装为MP4文件并保存

    在这个场景下,我们将关注如何使用FFmpeg将H264裸流文件封装为MP4格式。 H264是一种高效的视频编码标准,广泛应用在各种媒体格式中,如MP4、FLV等。它的“裸流”指的是未经容器格式封装的编码数据,通常以二进制...

    H264\H265裸码流提取工具

    描述中提到的“从多种封装格式的视频文件中提取”,这意味着该工具能处理如MP4、MKV、TS等常见的视频容器格式,这些格式内部可能包含H264或H265编码的视频流。值得注意的是,由于该工具当前仅支持视频裸码流的提取,...

    H264 裸流使用ffmepg封装MP4

    使用ffmpeg经H264裸码流封装为MP4文件。 使用ffmpeg经H264裸码流封装为MP4文件。

    h264,h265裸流封装成mp4文件和推流到rtmp服务器

    支持h264和h265视频流封装成mp4文件和推流到rtmp服务器,资源是一个完整的VS工程,VS版本为2015,可直接运行。主要代码文件为zhf_h264_to_mp4_file.h和zhf_pushstream_rtmp.h

    ffmpeg解码MP4生成h264和opus裸流数据

    ffmpeg解码MP4生成h264和opus裸流数据,不只是MP4,其他的封装格式也行,只要ffmpeg支持的就可以。由于ffmpeg不支持获取opus的裸流数据,输出的是封装了opus的ogg文件,故自己调用ffmpeg-api获取裸流数据。webrtc传输...

    使用ffmpeg封装h264裸流为MP4文件

    在这个场景中,我们关注的是如何使用FFmpeg将H264裸流封装成MP4文件。H264是一种高效的视频编码标准,而MP4则是一种常用的容器格式,可以容纳多种音视频流。 首先,我们需要了解FFmpeg的基本命令行用法。在Linux或...

    如何使用mp4v2将H264+AAC裸流录制成mp4文件,并保持音视频同步。

    在IT行业中,尤其是在流媒体开发领域,将H264+AAC裸流录制为MP4文件是一项基础且重要的任务。MP4(MPEG-4 Part 14)是一种广泛使用的容器格式,它能够包含多种类型的音频、视频以及字幕数据。H264是高效的视频编码...

    自己移植的MP4V2开源库可以直接使用代码封装H264和AAC linux.zip

    标题中的“自己移植的MP4V2开源库可以直接使用代码封装H264和AAC”表明,这是一个关于在Linux环境下,使用自移植的MP4V2库进行H264和AAC编码视频与音频封装的项目。MP4V2是一个开源的库,专门用于处理ISO基础媒体...

    基于大华SDK及c++的标准H264裸码封装MP4文件+保存.h264文件+实时预览

    总的来说,基于大华SDK及C++实现标准H264裸码封装MP4文件、保存.H264文件以及实时预览,是视频处理领域的一项基础任务,涉及了视频编码、容器格式、网络通信、本地显示等多个方面的知识。掌握这些技能对于开发视频...

    大华SDK及c++的标准H264裸码封装MP4文件+保存.h264文件+实时预览

    将H264裸码封装到MP4中,意味着将NAL单元按照特定的MP4文件结构进行组织,以便播放器可以识别并播放。这个过程涉及对NAL单元的拆分、重组以及添加时间戳等元数据。 保存.h264文件则是将原始的H264编码数据直接保存...

    MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    MP4 格式及在 MP4 文件中提取 H264 的 SPS、PPS 及码流 MP4 格式基本概念 MP4 格式对应标准 MPEG-4 标准(ISO/IEC14496),是 ISO/IEC14496-12(信息技术 视听对象编码的第 12 部分:ISO 基本媒体文件格式/...

    H264流封装MP4,MP4读取H264码流 使用MP4V2库

    使用MP4v2库 封装,解码H264码流。 1.包含live555拉流操作。 2.mp4v2库 3.mp4muxer 把H264封装成MP4 4.MP4demuxer 从MP4文件读取h264码流 5.测试项目

    C++代码实现H264编码视频封装成avi/mp4文件

    该库可能包括了处理视频流、解析H264、封装avi/mp4的具体函数和类,开发者可以通过调用这些接口来完成视频封装任务。 总的来说,通过C++实现H264视频编码到avi/mp4封装是一个涉及到编码理论、多媒体容器格式以及...

    wireshark中获取h264裸码流

    在视频通信领域,尤其是对于H264编码的视频流,Wireshark能够帮助我们深入理解数据传输过程,提取和分析H264裸码流。本文将详细介绍如何在Wireshark中获取H264裸码流,并探讨相关知识点。 1. **Wireshark基本操作**...

    mp4v2封装h264 AAC实例

    在本实例中,我们将深入探讨如何使用自定义的CMp4Encoder类来实现MP4v2容器中H264和AAC的封装。 1. MP4v2与MP4的区别 MP4v2相比于基础的MP4格式,主要改进了元数据处理、增强了时间码支持,以及增加了对更多媒体...

    ffmpeg封装H264成MP4、AVI视频格式,及提取出png、jpg格式图片

    在这个特定的项目中,我们看到用户分享了一个Qt工程,该工程利用FFmpeg库将H264编码的视频流封装成MP4或AVI格式,并且能够从中提取出PNG和JPG格式的静态图像。下面我们将深入探讨这些知识点。 1. **H264编码**:H...

    H.264视频裸流与AAC声音数据打包成TS

    本文将深入探讨如何将H.264视频裸流与AAC声音数据打包成TS(Transport Stream)格式,以便在网络传输,如RTSP(Real-Time Streaming Protocol)中使用。 首先,H.264,也称为AVC(Advanced Video Coding),是一种...

    WP8下MediaElement控件实时播放H264裸码流

    总的来说,通过利用`MediaElement`和自定义`MediaStreamSource`,开发者可以在Windows Phone 8平台上实现对H264裸码流的播放,尽管这需要一定的编码技巧和对多媒体编码的理解。这种能力对于开发复杂多媒体应用,尤其...

    从海康的ps流中提取h264数据(模拟ehome平台)

    在PS流中,H264编码的NAL单元(Network Abstraction Layer Unit)被封装在PS包中,我们需要解析PS流,找到并提取出这些NAL单元。 在模拟ehome平台的过程中,首先需要建立与海康IPC(网络摄像机)的连接。ehome是...

Global site tag (gtag.js) - Google Analytics