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 视频格式 ...
随机推荐
- Makefile的简单使用
led.bin: led.o arm-linux-ld -Ttext 0x0 -o led.elf $^ arm-linux-objcopy -O binary led.elf led.bin arm ...
- 浏览器报错:unexpected end of input 解决方法
直接上报错代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- [USACO13NOV] Pogo-Cow
https://www.luogu.org/problem/show?pid=3089 题目描述 In an ill-conceived attempt to enhance the mobility ...
- 微信小程序滑动选择器
实现微信小程序滑动选择效果 在wxml文件中,用一个picker标签代表选择器,bindchange是用户点击确定后触发的函数,index是picker自带的参数,用户点击确定后,bindchange ...
- 4、什么是事务?MySQL如何支持事务?
什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...
- shell 文件内容替换 sed用法
sed 's/要被替换的字符串/新的字符串/g' sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest. 如果没有g标记,则只有每行第一个匹配的 ...
- [bzoj1070] 修车
这周学习了费用流,就写了几题.其中有一题就是bzoj上的修车,看起来很丧,交了6次都是除了样例全wa(事实证明样例说明不了什么,还会误导你……). 题目大意:有m个技术人员n辆车,一个技术人员只能同时 ...
- 74cms 注入exp
遇到就瞎写了一个: #!/usr/bin/env python #encoding:utf-8 #by i3ekr import requests,optparse,re parse = optpar ...
- mips64高精度时钟引起ktime_get时间不准,导致饿狗故障原因分析【转】
转自:http://blog.csdn.net/chenyu105/article/details/7720162 重点关注关中断的情况.临时做了一个版本,在CPU 0上监控所有非0 CPU的时钟中断 ...
- linux内核启动分析(2)
-----以下内容为从网络上整理所得------ 主要介绍kernel_init线程(函数),这个线程在rest_init函数中被创建,kernel_init函数将完成设备驱动程序的初始化,并调用in ...