首先说明一下,本人只是从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;
}
上面的图片当中,第一个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; 
}

对照上面的定义,我们可以知道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格式的一些理解,如果有什么错误,还望指出。
 

 青春就应该这样绽放  游戏测试:三国时期谁是你最好的兄弟!!  你不得不信的星座秘密

转载于:https://www.cnblogs.com/zhumai/archive/2012/08/21/2778375.html

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

  1. 从视频中提取音频的MFCC特征

    具体包含以下两部分: 1.安装并使用ffmpeg从视频中提取音频文件 2.安装并使用librosa提取音频的MFCC特征 一.从视频中提取音频 1)安装ffmpeg 从ffmpeg的官网下载ffmpe ...

  2. Java使用ffmpeg实现从视频中提取音频 (mp4、mp3)

    /*** 从视频中提取音频*/@Testpublic void videoGetMp3(){// 提取命令String commit = "$0 -i $1 -ss 00:00:01 -t ...

  3. 采用FFmpeg从视频中提取音频(声音)保存为mp3文件

    采用FFmpeg从视频中提取音频(声音)保存为mp3文件 作者:雨水,日期:2016年1月9日 CSDN博客:http://blog.csdn.net/gobitan 摘要:看到好的视频文件,如果想把 ...

  4. 从视频中提取音频Python

    从视频中提取音频Python三行程序的python搞定 写在开头 提取音频 安装 python 包 提取音频 分析音频 安装 python 包 读取音频 matplotlib 画信号强度图 libro ...

  5. 如何从视频中提取音频?

    抖音.快手上有许多视频中的音乐特别好听,可以我们有时不知道这些歌曲的名字,所以有时需要从视频中将音频给提取出来.有的则是看到某些视频中合成的背景音乐很炫酷,想要拿过来为自己用,所以需要从视频中将音频给 ...

  6. Android 音视频配音之音频提取、截断、混音、合并、合成(一)——从视频中提取音频文件

    目录 前言 提取前提----了解提取需要用到的工具类:MediaExtractor.MediaCodec 1.MediaExtractor 2.MediaCodec 3.释放 具体提取转码代码 调用 ...

  7. FFmpeg从视频中提取音频保存为mp3文件

    如何把视频文件中的音频数据提取出来,网络上有不少音频提取工具,但作为技术人员提到音视频处理,肯定会想到FFmpeg.本文介绍了如何基于FFmpeg从视频中提取音频,然后将音频保存为mp3格式的音频文件 ...

  8. python音频 降噪_从视频中提取音频数据,然后应用傅里叶对音频降噪(python)...

    视频准备 QQ有热键 然后随便打开一个视频网站进行录屏 我选择B站 从视频中提取音频 需要安装包moviepy pip install moviepy 提取代码 from moviepy.editor ...

  9. FFmpeg命令(二)、 从视频中提取音频

    @[TOC](FFmpeg命令(二). 从视频中提取音频) 提取为mp3 ffmpeg -i huoying.mp4 -f mp3 -ar 16000 huoying.mp3 //huoying.mp ...

最新文章

  1. 实验台通用继电器接口
  2. java opencv 调用摄像头_opencv C++实现调用摄像头动态识别人脸
  3. opengl android 线宽
  4. Haproxy+Heartbeat 高可用集群方案操作记录
  5. 【正一专栏】曼彻斯特德比落幕——曼城独孤求败继续超神
  6. 中国版“Twilio”何在?
  7. cf1491C. Pekora and Trampoline
  8. css样式引入方式,及常用设置标签样式
  9. [Leetcode][第1392题][JAVA][最快乐前缀][KMP][字符串编码]
  10. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
  11. java for 变量赋值_Java 如何引用变量赋值?
  12. 2022年计算机二级考试Java语言程序设计模拟题及答案
  13. 清华大学计算机科学系王瑀屏,清华大学材料科学与工程系
  14. 笔记本电脑怎么用U盘装系统
  15. 使用腾讯云Ubuntu20.04搭建代理服务器
  16. mixin(公共样式定义)
  17. windows下安装GVM
  18. linux挂载smb增加空间,[linux]挂载smb
  19. 裁判文书关键信息提取
  20. 香饽饽:腾讯强推的Redis天花板笔记,帮助初学者快速入门和提高(核心笔记+面试高频解析)

热门文章

  1. 如何加强站内搜索功能
  2. ArcGIS制图技巧系列(3)—让地图更有立体感
  3. android动态生成背景透明带文字的图片
  4. goland设置代码颜色主题(同Sublime Text 3的代码颜色一样)
  5. Unity中使用Protobuffer探讨
  6. 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
  7. FlashDevelop打包IOS应用教程
  8. 让C#语言充当自身脚本!——.NET中的动态编译
  9. C#Socket通讯之超时检测
  10. python将列表转换成集合_python 将DataFrame转换为List