mp4文件DASH切片程序

一、简介

按照DASH标准文档要求与现有的DASH切片(生成DASH切片参见mb4box命令简介)来生成Initialization Segment与Media Segment两种切片,Initialization Segment就是在原来的mp4文件里去除数据box同时添加mvex box的文件,Media Segment里面保存的是sample数据。

生成切片先要获取两个信息:

1、每个sample起始位置与大小。

sample的起始位置与大小获取要涉及到stsc box,stco box和stsz box,通过stsc box获取trunk列表以及每一个trunk包含sample个数,注意entry_count==1的情况,这样一个trunk里只有一个sample,chunk与sample的数量相等。通过stco box可以获取每一个trunk的起始位置与大小,通过stsz box可以获取每个sample大小的列表,这3个列表都通过sample index关联起来,sample index从从1开始计数。通过这3个box可以得到每一个sample的起始于大小。

2、每个sample的delta信息。

sample的delta信息可以通过stts box获取,在解析时注意entry_count为1的情况,这种情况下所有的sample都有相同的delta值。

有了每个sample的位置大小与delta信息后就可以根据标准生成切片文件了。

二、分两步走具体介绍

1、扫描mp4文件,记录以下信息

1.1 每个box的start size信息,扫描后生成一个boxInfo的列表

数据结构

typedef struct {

std::string type;

long pos;

long size;

}BoxInfo;

1.2 解析stsc box生成stscInfo列表

StstInfo

typedef struct{

unsigned int first_chunk;

unsigned int samples_per_chunk;

unsigned int sample_description_index;

}StscInfo;

1.3 解析stco box生成chunkInfo 列表

typedef struct{

unsigned int chunk_index;

unsigned int offset;

unsigned int sample_count;

unsigned int sample_description_index;

}ChunkInfo;

1.4 解析stsz box生成sampleList

typedef struct{

unsigned int sample_index;

unsigned int offset;

unsigned int size;

unsigned int delta;

unsigned int chunk_index;

unsigned int sample_description_index;

}SampleInfo;

然后结合上面两个列表完善sample的信息。

1.5 解析时注意有些box的flag选项会指示使用后续的那些可选参数

2、根据扫描的信息生成初始化切片与数据切片

剩下的就是力气活了,按照标准组装就可以了

生成切片注意:

media切片

moof TrackRunEntry Size是后面跟随的mdat里每个sample的大小

sidx 的referenced_size是下面的moof size加上mdat size

trun DataOffset是表示mdat box里的数据相对与moof开始(length字节开始)的偏移量

tfdt baseMediaDecodeTime是之前所有切片时间和delta

trun sample_duration在播放时会统计,与tfdt 里的baseMediaDecodeTime比较

init切片

与原有的mp4相比去掉mdat box,在moov里添加mvex box指示存在数据切片。

三、mp4box命令

切片

mp4box -dash 10000  -rap  -segment-name myDash  4.mp4

查看文件信息

mp4box -info x.mp4

生成xml文件格式的信息

mp4box -diso  x.mp4

四、播放器

ExoPlayer

mp4client

mp4文件DASH切片程序的更多相关文章

  1. ffmpeg文件生成m3u8文件及ts切片程序(一)

    ffmpeg文件生成m3u8文件及ts切片程序(一) 实现目标:输入本地文件,实现m3u8切片,功能点请看注释,注意:注释很重要. 参考: http://www.cnblogs.com/mystory ...

  2. 嵌入式 使用mp4v2将H264+AAC合成mp4文件

    录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...

  3. 使用mp4v2将H264+AAC合成mp4文件

    录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...

  4. 【转】使用ffmpeg转码的MP4文件需要加载完了才能播放的解决办法

    1.前一段时间做了一个ffmpeg转码MP4的项目,但是转出来的MP4部署在网站上需要把整个视频加载完成才能播放,到处找资料,最后找到解决方案记录于此备忘. FFMpeg转码由此得到的mp4文件中, ...

  5. get新技能:上传了 flv 或 MP4 文件到服务器,可访问总是出现 “无法找到该页”的 404 错误

    为什么我上传了 flv 或 MP4 文件到服务器,可访问总是出现 “无法找到该页”的 404 错误 为什么我上传了 flv 或 MP4 文件到服务器,可输入正确地址通过协议来访问总是出现 “无法找到该 ...

  6. ffmpeg学习(二) 通过rtsp获取H264裸流并保存到mp4文件

    本篇将使用上节http://www.cnblogs.com/wenjingu/p/3977015.html中编译好的库文件通过rtsp获取网络上的h264裸流并保存到mp4文件中. 1.VS2010建 ...

  7. 为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢

    常用MIME类型(Flv,Mp4的mime类型设置) 也许你会在纳闷,为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢?这就表明mp ...

  8. JavaCV的摄像头实战之六:保存为mp4文件(有声音)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. video.js播放mp4文件

    HTML5的标签 video 支持的mp4编码为视频编码 H.264 音频AAC 参考网址 http://www.w3school.com.cn/html5/html_5_video.asp 视频格式 ...

随机推荐

  1. 精通BIRT:Eclipse商务智能报表工具开发实践指南

    http://blog.csdn.net/birtbird/article/details/8935520 [置顶] 精通BIRT:Eclipse商务智能报表工具开发实践指南 分类: BIRT 201 ...

  2. 51Nod 1024 矩阵中不重复的元素 | 技巧 数学

    first try: set<LL> sset; int main() { LL m,n,a,b; while(~scanf("%lld%lld%lld%lld",&a ...

  3. 《A First Course in Abstract Algebra with Applications》-chaper1-数论-关于素数

    由于笔者在别的专栏多次介绍过数论,这里在<抽象代数基础教程>的专栏下,对于chaper1数论这一章节介绍的方式不那么“入门”. 首先来介绍一个代数中常用也是非常重要的证明方法:数学归纳法. ...

  4. 【hdu1828/poj1177】线段树求矩形周长并

    题意如图 题解:这题非常类似与矩形面积并,也是维护一个被覆盖了一次以上的线段总长. 但是周长要算新出现的,所以每次都要和上一次做差求绝对值. x轴做一遍,y轴做一遍. 但是有个问题:矩形边界重合的时候 ...

  5. 【Codeforces542E】Playing on Graph [Bfs][Dfs]

    Playing on Graph Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input 5 4 ...

  6. 【BZOJ5010】【FJOI2017】矩阵填数 [状压DP]

    矩阵填数 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 给定一个 h*w 的矩阵,矩阵的行 ...

  7. VMware Workstation Pro 14 序列号

    VMware Workstation Pro 14 序列号: AA702-81D8N-0817Y-75PQT-Q70A4 YC592-8VF55-M81AZ-FWW5T-WVRV0 FC78K-FKE ...

  8. End to End Sequence Labeling via Bidirectional LSTM-CNNs-CRF论文小结

    本篇论文是卡内基梅隆大学语言技术研究所2016年  arXiv:1603.01354v5 [cs.LG] 29 May 2016 今天先理解一下这个是什么意思:        找到的相关理解:arXi ...

  9. 更改控件中DrawableLeft图片的大小,图片与文字的距离

    Drawable drawable=getResources().getDrawable(R.drawable.xx); //获取图片 drawable.setBounds(left, top, ri ...

  10. 广度优先算法(BFS)与深度优先算法(DFS)

    一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...