“AcaciaAccio”通过精心收集,向本站投稿了6篇MP4文件格式的解析和MP4文件的分割算法,下面小编为大家整理后的MP4文件格式的解析和MP4文件的分割算法,欢迎阅读与借鉴!

MP4文件格式的解析和MP4文件的分割算法

篇1:MP4文件格式的解析和MP4文件的分割算法

MP4文件格式的解析和MP4文件的分割算法

MP4文件格式的解析,以及MP4文件的分割算法

mp4应该算是一种比较复杂的媒体格式了,起源于QuickTime。以前研究的时候就花了一番的功夫,尤其是如何把它完美的融入到视频点播应用中,更是费尽了心思,主要问题是处理mp4文件庞大的“媒体头”。当然,流媒体点播也可以采用flv格式来做,flv也可以封装H.264视频数据的,不过Adobe却不推荐这么做,人家说毕竟mp4才是H.264最佳的存储格式嘛。

这几天整理并重构了一下mp4文件的解析程序,融合了分解与合并的程序,以前是c语言写的,应用在linux上运行的服务器程序上,现在改成c++,方便我在其他项目中使用它,至于用不用移植一份c#的,暂时用不到,等有必要了再说吧。这篇文章先简单介绍一下mp4文件的大体结构,以及它的分割算法,之后再写文章介绍如何把mp4完美应用在点播项目中。

一、MP4格式分析

MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,它是在“ISO/IEC 14496-14”标准文件中定义的,属于MPEG-4的一部分,是“ISO/IEC 14496-12(MPEG-4 Part 12 ISO base media file format)”标准中所定义的媒体格式的一种实现,后者定义了一种通用的媒体文件结构标准。MP4是一种描述较为全面的容器格式,被认为可以在其中嵌入任何形式的数据,各种编码的视频、音频等都不在话下,不过我们常见的大部分的MP4文件存放的AVC(H.264)或MPEG-4(Part 2)编码的视频和AAC编码的音频。MP4格式的官方文件后缀名是“.mp4”,还有其他的以mp4为基础进行的扩展或者是缩水版本的格式,包括:M4V,3GP,F4V等。

mp4是由一个个“box”组成的,大box中存放小box,一级嵌套一级来存放媒体信息。box的基本结构是:

其中,size指明了整个box所占用的大小,包括header部分。如果box很大(例如存放具体视频数据的mdat box),超过了uint32的最大数值,size就被设置为1,并用接下来的8位uint64来存放大小。

一个mp4文件有可能包含非常多的box,在很大程度上增加了解析的复杂性,这个网页上记录了一些当前注册过的box类型。看到这么多box,如果要全部支持,一个个解析,怕是头都要爆了。还好,大部分mp4文件没有那么多的box类型,下图就是一个简化了的,常见的mp4文件结构:

一般来说,解析媒体文件,最关心的部分是视频文件的宽高、时长、码率、编码格式、帧列表、关键帧列表,以及所对应的时戳和在文件中的位置,这些信息,在mp4中,是以特定的算法分开存放在stbl box下属的几个box中的,需要解析stbl下面所有的box,来还原媒体信息。下表是对于以上几个重要的box存放信息的说明:

看吧,要获取到mp4文件的帧列表,还挺不容易的,需要一层层解析,然后综合stts stsc stsz stss stco等这几个box的信息,才能还原出帧列表,每一帧的时戳和偏移量。而且,你要照顾可能出现或者可能不出现的那些box。可以看的出来,mp4把帧sample进行了分组,也就是chunk,需要间接的通过chunk来描述帧,这样做的理由是可以压缩存储空间,缩小媒体信息所占用的文件大小。这里面,stsc box的解析相对来说比较复杂,它用了一种巧妙的方式来说明sample和chunk的映射关系,特别介绍一下。

这是stsc box的结构,前几项的意义就不解释了,可以看到stsc box里每个entry结构体都存有三项数据,它们的意思是:“从first_chunk这个chunk序号开始,每个chunk都有samples_per_chunk个数的sample,而且每个sample都可以通过sample_description_index这个索引,在stsd box中找到描述信息”。也就是说,每个entry结构体描述的是一组chunk,它们有相同的特点,那就是每个chunk包含samples_per_chunk个sample,好,那你要问,这组相同特点的chunk有多少个?请通过下一个entry结构体来推算,用下一个entry的first_chunk减去本次的first_chunk,就得到了这组chunk的个数。最后一个entry结构体则表明从该first_chunk到最后一个chunk,每个chunk都有sampls_per_chunk个sample。很拗口吧,不过,就是这个意思:)。由于这种算法无法得知文件所有chunk的个数,所以你必须借助于stco或co64。直接上代码可能会清楚些:

1.首先直接分析entry 2.然后,通过stco或co64获知chunk总个数之后,开始还原映射表

读出stsc之后,就可以综合stbl下的'所有box,推算出视频和音频帧列表,时戳和偏移量等数据。下面截图展示获取到的关键帧列表:

有了关键帧列表之后,就可以继续我们一下个题目,就是mp4文件的分割。实现mp4的分割,是把mp4应用到点播系统中最关键的技术环节,做不到这个,就无法实现点播播放mp4影片的“拖动”。

二、MP4文件的分割算法

所谓“分割”,就是把大文件切成小文件,要实现mp4的分割,

首先,需要获取到关键帧列表然后,选择要分割的时间段(比如从关键帧开始)接着,重新生成moov box(注意所有相关的box以及box size都需要改变)最后,拷贝对应的数据,生成新文件第一点,上面已经介绍了,第二点,只需要遍历关键帧列表,就能找到离你想要分割的时间段最接近的关键帧,第四点就是“copy-paste”的工作,关键在于第三点。因为这一步涉及到stbl下的所有box,必须重新生成entrys,同样的,其他的box都还好,只需要保留关键帧所对应的sample和chunk,其余的删掉即可,只是stsc box的比较麻烦,说起来比较嗦,还是直接看代码吧:

修改完box之后,需要重新生成moov box,由于moov box的大小以及时长等信息都发生了改变,所以需要box的大小做相应的修改,这点千万不能忘记,否则播放器会解析错误。重新生成box之后,还要计算一下分割后的数据的长度,由于数据长度也发生了改变,所以修改mdat box的大小的同时,要同时修改stbl下所有box的chunk offset,切记!

以下是整个的逻辑过程:

好了,所有这些都实现之后,就具备了做mp4点播系统的条件了。不过,要做mp4点播,还有一些其他的问题需要解决,我将在下一篇文章中介绍。

篇2:如何恢复U盘隐藏文件和mp4隐藏文件

大家应该都有U盘或者mp4吧,那么有没有碰到过文件夹被隐藏的情况呢,就是说,比如U盘或者mp4里原先有10个文件,可是当你插到电脑上时却只显示5个文件,而另5个被隐藏了,碰到这种情况不要慌,电脑知识网教你两招,轻松恢复被隐藏文件,

方法一: 1.在Windows资源管理器的“工具”菜单上,单击“文件夹选项”命令;单击“查看”选项卡;

2. 在“隐藏文件和文件夹”下方,选中“显示隐藏文件和文件夹”单选框;点击“确定”。 这种方法是最简单的,如果按上面步骤做了,文件没反应的话,那就可能是EXPLORER.exe 病毒引起的,

方法二:开始--运行--regedit--HKEY_LOCAL_MACHINEsoftwaermicrosoftwindowscurrentversionexploreradvancedfolderhidden ,在这里有两个主键nohidden、showall,将nohidden 下二进制键值CheckedValue和DefaultValue都设为2,showal l下将CheckedValue 设为1,DefaultValue 设为2;

第二种方法的补充:如果依然没有用的话,那就是删除showall主键下的CheckedValue键值,自己再新建一个:单击右键-新建-Dword值-命名为CheckedValue,然后修改它的键值为1,这样就可以选择“显示所有隐藏文件”和“显示系统文件”了。

篇3:android解析plist文件

plist,即property list,是苹果手机软件开发中经常用到的存储文件格式,其实质就是XML文件,但是它遵循一定的格式,比如包含一些指定的元素,如plist,array,string,key等。苹果提供了解析该类文件的机制,可惜在安卓开发工具中却没有提供。经常遇到的情况是,在开发苹果和安卓手机软件的时候,要统一资源文件,这个时候,我们可以采用GitHub中提供的开源android-plist-parser解决方案。

比如我们要解析一个全国省市区的一个plist文件:

xml version=“1.0” encoding=“UTF-8”?>

0

北京市

0

北京市

东城区

西城区

朝阳区

丰台区

石景山区

海淀区

门头沟区

房山区

通州区

MP4文件格式的解析和MP4文件的分割算法

顺义区

昌平区

大兴区

怀柔区

平谷区

密云县

延庆县

...

...

...

0

北京市

0

北京市

东城区

西城区

朝阳区

丰台区

石景山区

海淀区

门头沟区

房山区

通州区

顺义区

昌平区

大兴区

怀柔区

平谷区

密云县

延庆县

...

...

...

那么如何在android中解析呢?

一:在GitHub上下载android-plist-parser

二:解压下载的包,并导入android项目的类路径里,

三:解析该文件,并将解析信息打印在控制台。(因为该文件不算太小,因此在新线程中运行,防止主线程卡死)

new Thread(new Runnable {

@Override

public void run() {

PListXMLParser parser = new PListXMLParser();        // 基于SAX的实现

PListXMLHandler handler = new PListXMLHandler();

parser.setHandler(handler);

try {

parser.parse(getAssets().open(“area.plist”));    // area.plist是你要解析的文件,该文件需放在assets文件夹下

} catch (IllegalStateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

PList actualPList = ((PListXMLHandler) parser.getHandler()).getPlist();

Dict root = (Dict) actualPList.getRootElement();

MapprovinceCities = root.getConfigMap(); 

篇4:Python 解析XML文件

-04-04使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子

-11-11python聊天程序实例代码分享

2013-11-11python爬取网站数据保存使用的方法

2014-06-06python网络编程学习笔记(四):域名系统

2014-05-05一则python3的简单爬虫代码

2014-03-03python基础教程之字典操作详解

2014-04-04Python设计模式之代理模式实例

-12-12python 测试实现方法

2013-12-12python定时采集摄像头图像上传ftp服务器功能实现

-11-11Python+Django在windows下的开发环境配置图解

篇5:Python 解析XML文件

最近更 新

python list转dict示例分享

python生成指定尺寸缩略图的示例

python mysqldb连接数据库

python算法学习之计数排序实例

Python开发编码规范

python2.7删除文件夹和删除文件代码实例

Python 过滤字符串的技巧,map与itertools

Python中os和shutil模块实用方法集锦

python实现目录树生成示例

python通过scapy获取局域网所有主机mac地

热 点 排 行

Python入门教程 超详细1小时学会

python 中文乱码问题深入分析

比较详细Python正则表达式操作指

Python字符串的encode与decode研

Python open读写文件实现脚本

Python enumerate遍历数组示例应

Python 深入理解yield

Python+Django在windows下的开发

python 文件和路径操作函数小结

python 字符串split的用法分享

篇6:如何用winrar分割、加密文件

今天通过给大家介绍2个关于winrar的基本功能,能让大家今后使用winrar更加方便,

1、在压缩文件时,在winrar中选择“高级”菜单下的“设置密码”,这样就能在压缩文件的同时,对文件进行加密,保护文件的重要信息,

2、打开winrar,在左下方的“压缩分卷大小,字节”中选择或填写需要分割的大小。单击“确定”按钮后,WinRAR将会按照分割大小生成分割压缩包。

阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。