mp4文件DASH切片程序
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切片程序的更多相关文章
- ffmpeg文件生成m3u8文件及ts切片程序(一)
ffmpeg文件生成m3u8文件及ts切片程序(一) 实现目标:输入本地文件,实现m3u8切片,功能点请看注释,注意:注释很重要. 参考: http://www.cnblogs.com/mystory ...
- 嵌入式 使用mp4v2将H264+AAC合成mp4文件
录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...
- 使用mp4v2将H264+AAC合成mp4文件
录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...
- 【转】使用ffmpeg转码的MP4文件需要加载完了才能播放的解决办法
1.前一段时间做了一个ffmpeg转码MP4的项目,但是转出来的MP4部署在网站上需要把整个视频加载完成才能播放,到处找资料,最后找到解决方案记录于此备忘. FFMpeg转码由此得到的mp4文件中, ...
- get新技能:上传了 flv 或 MP4 文件到服务器,可访问总是出现 “无法找到该页”的 404 错误
为什么我上传了 flv 或 MP4 文件到服务器,可访问总是出现 “无法找到该页”的 404 错误 为什么我上传了 flv 或 MP4 文件到服务器,可输入正确地址通过协议来访问总是出现 “无法找到该 ...
- ffmpeg学习(二) 通过rtsp获取H264裸流并保存到mp4文件
本篇将使用上节http://www.cnblogs.com/wenjingu/p/3977015.html中编译好的库文件通过rtsp获取网络上的h264裸流并保存到mp4文件中. 1.VS2010建 ...
- 为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢
常用MIME类型(Flv,Mp4的mime类型设置) 也许你会在纳闷,为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢?这就表明mp ...
- JavaCV的摄像头实战之六:保存为mp4文件(有声音)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- video.js播放mp4文件
HTML5的标签 video 支持的mp4编码为视频编码 H.264 音频AAC 参考网址 http://www.w3school.com.cn/html5/html_5_video.asp 视频格式 ...
随机推荐
- bzoj 1135 [POI2009]Lyz 线段树+hall定理
1135: [POI2009]Lyz Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 573 Solved: 280[Submit][Status][ ...
- opencv学习---打开摄像头检测个人头像
opencv中具有检测人体各部分的级联分类器,在opencv文件夹里面的sources/data/haarcascades里面. 这里要选择的是能够检测人体头像的还有检测眼睛的级联分类器的文件. 它们 ...
- DIV CSS display(block,inline,none)的属性教程
display:inline.block.inline-block的区别 display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都 ...
- django自带分页代码
django分页 {% if is_paginated %} <div class="pagination-simple"> <!-- 如果当前页还有上一页,显示 ...
- JNLP Slave connection error解决办法
Replace in jnlp-file <argument>-workDir</argument> <argument /> with <argume ...
- 【BZOJ4903】【CTSC2017】吉夫特 [DP]
吉夫特 Time Limit: 15 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description Input 第一行一个整数n. 接下 ...
- 「6月雅礼集训 2017 Day10」quote
[题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...
- YII 框架查询
基础查询 Customer::find()->one(); 此方法返回一条数据: Customer::find()->all(); 此方法返回所有数据: Customer::f ...
- Vuejs - 深入浅出响应式系统
Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 Javascript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接,不过理解其工作原理同样非常重要,这样 ...
- Spring mvc详解(山东数漫江湖)
Spring mvc框架 Spring web MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活.松散耦合的 web 应用程序的组件.MVC 模式导致了应用程序的不同方面(输入逻辑.业务 ...