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

转载于:https://www.cnblogs.com/mingzhang/p/8447103.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值