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. FreeRTOS - 定时器使用注意

    1.只有进入定时器守护任务,从定时器命令队列取出命令,队列空间才会空出一个可用空间:所有定时器公用一个定时器队列 2.如果使用软件定时器,在调度器开始前,会自动创建一个定时器守护任务,configTI ...

  2. [C#] 类型学习笔记三:自定义值类型

    既前两篇之后,这一篇我们讨论通过struct 关键字自定义值类型. 在第一篇已经讨论过值类型的优势,节省空间,不会触发Gargage Collection等等. 在对性能要求比较高的场景下,通过str ...

  3. sqlserver xml转表 及(cross apply与outer apply)

    一. 需求是需要把','分割的字符串转为表,便于做关联查询,于是发现可以通过xml转为表,如下: declare @XXX xml set @XXX = ' <v> <aa>1 ...

  4. Git 常见工作流

    多种多样的工作流使得在项目中实施Git时变得难以选择.这份教程提供了一个出发点,调查企业团队最常见的Git工作流. 阅读的时候,请记住工作流应该是一种规范而不是金科玉律.我们希望向你展示所有工作流,让 ...

  5. bzoj 4034: [HAOI2015]树上操作——树链剖分

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

  6. 【BZOJ】1574: [Usaco2009 Jan]地震损坏Damage

    [算法]搜索 [题意]给定无向图,现在可能有一些点已经被删除,只给出信息是c个点不能到达结点1,求最少的不能到达结点1的个数(含已删除点). [题解] 真是一道奥妙重重的题目. 每个点不能到达结点1, ...

  7. Windows Phone 8.1基础教程(1) 页面导航、弹出框

    1. 跳转到其他页面 Frame.Navigate(typeof(页面),参数); 2. 后退回历史页面 Frame.GoBack(); 3. 回跳时判断 if(e.NavigationMode == ...

  8. bzoj 1079 DP

    比较容易看出来是DP,但是如果我们记录每一种颜色还剩多少种的话,消耗的转移的时间复杂度5^15,但是我们考虑到每一种颜色,如果数量相同的话,其实是等效的,所以我们用w[a][b][c][d][e][l ...

  9. JS 本地属性与继承属性

    判断是否拥有某种属性 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); // --> true alert('toString' i ...

  10. 【Python学习笔记】Coursera之PY4E学习笔记——String

    1.字符串合并 用“+”来进行字符串的合并,注意空格是要自己加的. 例: >>> a='Hello' >>> b= a+ 'There' >>> ...