关于MP4视频拖动的原理与分析(一)

本来想说说关于mp4和一些常见视频文件格式方面的历史。现在想想没啥必要,毕竟本文是在讲关于mp4点播拖动方面的技术细节。绪论,前言神马的显得有点多余。

说起MP4,不得不提“Digital container format”的概念。维基百科给出解释:

A container or wrapper format is a metafile format whose specification describes how different elements of data and metadata coexist in a computer file

我们这里简称为容器。mp4其实就是一个容器,它包含的信息描述了在这个容器里面存放的东西,是怎么布局,哪个地方放着什么东西,放了多少等等的信息。既然谈到容器,那么除了MP4,还有很多类似的。比如3GP, ASF, AVI, MKV, RM等等很多我们常见的视频格式。

这里推荐一个工具,叫mp4parse.exe,网上可以搜到。当你用这个工具打开一个mp4文件时,会看到mp4内部是酱紫的:

在这里图中我们可以看到类似windows注册表一样的层次关系,’+’号可以点击展开,看到内部的结构。像图中的ftyp,moov,mvhd,trak,mdat这些在mp4中叫做box。box的基本结构由box header + box data组成。

由于mp4官方协议中的box种类很多,网上也有文章在讲解关于各个box的作用。这里就不一一列出了。接下来我们在讲关于文件拖动原理的时候会慢慢接触到。

在处理拖动时,必然要去解析mp4的格式,我们假定文件已经存在于我们服务器的磁盘上,文件名为test.mp4。所以我们解析文件格式,就需要去读取该文件,但是对于读取的策略有很多种,可以一次read或者mmap将磁盘上的内容搬到内存上来,但是对于体积太大的文件来说,这种方式是不可行的。另外一种常见方式,就是需要读的时候才读指定的一点内容。比如当前只读取boxA,处理解析完之后再读boxB。我们这里的分析就以这种方式来展开。这样的代价就是产生了大量的IO。这里还有一种方式就是每次读取一块固定大小的内容,然后再解析,解析完了再去读一块数据。这样可以在IO和内存的消耗之间获得一个折衷。这些一些跟优化相关的问题。我们先不做过多的讨论。

一般的mp4点播拖动业务,通常都是通过在url的参数的start和end参数来处理的。例如:

http://test.com/vedio/mp4/test.mp4?start=10.01&&end=100.00

这里的start和end从程序的角度来看,他们是似乎是double类型。他们其实是时间,单位为秒。也就是说这个请求是想获取test.mp4文件的(在播放时间角度上来看)从10.01秒到100.00秒之间的这部分内容。当然,你可能说比较普遍的应该是只有start而没有end,毕竟别人播放器拖动视频的时候,只是在找一个起始的播放点,end不需要带,默认是到文件的末尾。但是很有网站可能有这样的需求,为了省带宽,他们在你拖动之后,只给你加载5分钟的数据,即end=start+5min,这样的话请求的start和end参数就会同时存在。

那问题来了,为什么不直接用位移来作为start和end的参数。这样请求到了视频服务器,就可以按照偏移直接把文件发给你了。首先,这种情况不需要使用url参数,直接发送带range的http请求就可以了。再者,因为跟随机拖动的许多关键位移信息在服务器端的视频文件里,在开始播放时前端播放器很难获得相关的数据。

那你可能会问,既然对于播放器来说,位置偏移很难获得,那么时间又是怎么获得的?以优酷为例:

http://v.youku.com/v_show/id_XMTI3NjM1Nzk1Ng==_ev_1.html

这只是一个播放页的html文件,并不是实际要播放的视频。这个请求很关键,通过这次请求,播放器前端可以获得该视频的总体播放时长等信息。关于这个信息我们可以在这个html的源码里得到:

最后一样3611.82就是视频总时长,取整以后就是60分11秒。

那么接下来我们拖动视频进度条的时候,前端就可以拿光标在播放条上的位置,按比例换算成时间,然后作为start的参数,发起HTTP请求来获取相应内容了。

鼠标偏移(已知) / 进度条总长度(已知) = 偏移时间(未知) / 总时长(已知)

(未完待续)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 02:47:53

关于MP4视频拖动的原理与分析(一)的相关文章

JVC摄像机mp4视频丢失恢复方法

JVC在日系摄像机厂商中基本上是极其"冷门"的厂商,很少有见到使用其摄像机.之前CHS数据实验室已经开发过JVC的MTS视频恢复程序,但是从来没有遇到过MP4格式的.近日我们遇到厦门的一个客户使用的JVC摄像机拍摄的MP4视频丢失的案例.CHS数据恢复验室工程师通过远程查看卡中的数据,并从客户提供的样本视频文件中成功分析出了视频编码,由于JVC的存储方案原因,导致文件碎片很多,我们制定了碎片定位并重组的恢复方案,以下为分析过程. 故障存储:128G存储卡故障现象:客户拍完素材后被同事在

《Linux内核原理与分析》教学进程

目录 2019-2020-1 <Linux内核原理与分析>教学进程 考核方案 第一周: 第二周: 第三周: 第四周: 第五周 第六周 第七周: 第八周 第九周 第十周 第十一周: 第十二周 第十三周 2019-2020-1 <Linux内核原理与分析>教学进程 考核方案 采取过程化考核,平时成绩占100分,成绩计算:30+30+15+25=100: 翻转课堂基础考核10次: 3*10 = 30 每次考试20-30道题目,考试成绩规格化成3分(比如总分30分就除以10) 翻转课堂测试

html5播放mp4视频代码

1.nginx支持flv和mp4格式播放 默认yum安装nginx centos7安装nginx时候应该是默认安装nginx_mod_h264_streaming模块的 # nginx -V查看是否安装nginx_mod_h264_streaming模块 nginx在新版本中已经支持了--with-http_mp4_module --with-http_flv_module这2个模块即可 # vi /etc/nginx/nginx.conf server { listen       80 de

Java NIO原理 图文分析及代码实现

Java NIO原理 图文分析及代码实现 博客分类: java底层 java NIO原理阻塞I/O非阻塞I/O Java NIO原理图文分析及代码实现 前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.可以参考:http://baike.baidu.com/view/32726.htm )机制时,发现hadoop的RPC机制的实现主要用到了两个技术

loosejar原理简要分析

loosejar这个小工具可以动态分析出应用中有每个jar包的实际使用情况,详情请参阅<通过loosejar清理应用中冗余的jar包>基本原理是利用instrumentation的特性用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义.有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和 Java 类操作了.关于instrumentation的详细介绍,可以参阅这篇文章&l

[JavaEE]Java NIO原理图文分析及代码实现

转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO原理及通信模型 二.java NIO服务端和客户端代码实现 具体分析: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 假如现在你对阻塞I/O已有了一定了解,我们知道阻塞I/O在调用InputStream.read()方法时是阻塞的,它会一直等到数据到来时(或超 时)才会返回:同

嵌入式Linux下MP4视频录制库MP4V2移植和简介

*************************************************************************************************************************** 作者:EasyWave                                                                             时间:2014.10.31 类别:Linux应用-MP4视频录制库MP4V2

x86的ABI(C函数实现原理)分析

This article is aim to explain how to use assemble language realize those common function in C. But I fail to get a simple method to introduce it because of some reasons . I will try to extract some key point at this article. Then analysize a example

[转载]用 FFMPEG 合并 MP4 视频

因为 ffmpeg 是支持切分 mp4 视频的,所以我就理所当然的以为 ffmpeg 是支持视频合并.直到今天同事找我问方法,才发现一直以为的方法是错误的, mp4 不支持直接 concate(丢人了...),赶紧补了一下能量,从网上抓来了多种实现. 注: 这里的 mp4 指的是网上最多见的 h264+aac mpeg4 容器的方式 1). ffmpeg + mpeg 这种是网上最常见的,基本思路是将 mp4 先转码为 mpeg 文件,mpeg是支持简单拼接的,然后再转回 mp4. ffmpeg