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. [mysql]mysql弱密码字典检测

    1.如何定义弱密码 和用户名一致 连续字符 连续数字 空密码 2.生成弱密码字典 3.检测脚本 4.结果

  2. FreeRTOS - 调度器

    原文地址:http://www.cnblogs.com/god-of-death/p/6942641.html 绝大多数情况下,调度器的配置如下: 下面的说明基于上面的调度器配置: 如果有更高优先级的 ...

  3. 使用VS2010编译MongoDB C++驱动详解

    最近为了解决IM消息记录的高速度写入.多文档类型支持的需求,决定使用MongoDB来解决. 考虑到MongoDB对VS版本要求较高,与我现有的VS版本不兼容,在leveldb.ssdb.redis.h ...

  4. js获取当前页面的参数,带完善~~~

    let url = window.location.href; let id = url.slice(url.indexOf('?') + 4);

  5. vs报错“以下文件中的行尾不一致,是否将行尾标准化”

    vs报错"以下文件中的行尾不一致,是否将行尾标准化" 分析: 通过读取源文件,发现换行都使用的是"\n"   Windows和Unix不同的标准引起的...即& ...

  6. SNS应用好友动态Feed模块设计

    转载自:http://libo93122.blog.163.com/blog/static/122189382012112145728902/ 备注:找不到原作者了. 现在大部分SNS网站都有一个功能 ...

  7. PHP做分页查询(查询结果也显示为分页)

    1.先把数据库里所有的数据分页显示在页面,并在显示数据的表格上方加上查询表单. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...

  8. 【转载】Lua脚本语法说明(修订)

    原文:http://www.cnblogs.com/ly4cn/archive/2006/08/04/467550.html 挑出来几个 .逻辑运算 and, or, not 其中,and 和 or ...

  9. 撩下Cookie和Session

    Cookie Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读 ...

  10. sass_sass安装

    你会不会因为有些事遇到各种各样的问题而搁置,直到把这个事情被耽误了几天.最近一直在弄sass这个东西,安装的过程中各种问题.sass是一个基于ruby环境开发的,安装sass之前得先把ruby给安装了 ...