关于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的格式,我们假定文件已经存在于我们server的磁盘上。文件名称为test.mp4。所以我们解析文件格式,就须要去读取该文件。可是对于读取的策略有非常多种。能够一次read或者mmap将磁盘上的内容搬到内存上来,可是对于体积太大的文件来说。这种方式是不可行的。第二种常见方式。就是须要读的时候才读指定的一点内容。比方当前仅仅读取boxA。处理解析完之后再读boxB。我们这里的分析就以这种方式来展开。这种代价就是产生了大量的IO。
这里另一种方式就是每次读取一块固定大小的内容,然后再解析,解析完了再去读一块数据。这样能够在IO和内存的消耗之间获得一个折衷。这些一些跟优化相关的问题。我们先不做过多的讨论。
一般的mp4点播拖动业务,通常都是通过在url的參数的start和end參数来处理的。比如:
start=10.01&&end=100.00">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的參数。这样请求到了视频server,就能够依照偏移直接把文件发给你了。首先,这种情况不须要使用url參数,直接发送带range的http请求就能够了。再者,由于尾随机拖动的很多关键位移信息在server端的视频文件中,在開始播放时前端播放器非常难获得相关的数据。
那你可能会问。既然对于播放器来说。位置偏移非常难获得,那么时间又是怎么获得的?以优酷为例:
这仅仅是一个播放页的html文件,并非实际要播放的视频。这个请求非常关键,通过这次请求。播放器前端能够获得该视频的整体播放时长等信息。
关于这个信息我们能够在这个html的源代码里得到:
最后一样3611.82就是视频总时长。取整以后就是60分11秒。
那么接下来我们拖动视频进度条的时候,前端就能够拿光标在播放条上的位置。按比例换算成时间,然后作为start的參数,发起HTTP请求来获取对应内容了。
鼠标偏移(已知) / 进度条总长度(已知) = 偏移时间(未知) / 总时长(已知)
(未完待续)
关于MP4视频拖动的原理与分析(一)的更多相关文章
- IIS6/IIS7环境下实现支持mp4视频随意拖动、预览播放、边下载边播放
前几天,一客户需要在IIS环境下实现MP4视频可以随意拖动观看,边下载边播放.一看这要求,IIS本身是无法实现,想着应该需要用插件,于是GG一番,还真找到这样的插件,此组件为H264-Streamin ...
- Python 下载网络mp4视频资源
最近着迷化学, 特别是古代的冶炼技术,感叹古人的聪明. 春秋时期的炼铁方法是块炼铁,即在较低的冶炼温度下,将铁矿石固态还原获得海绵铁,再经锻打成的铁块.冶炼块炼铁,一般采用地炉.平地筑炉和竖炉3种.铁 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- 《Linux内核原理与分析》教学进程
目录 2019-2020-1 <Linux内核原理与分析>教学进程 考核方案 第一周: 第二周: 第三周: 第四周: 第五周 第六周 第七周: 第八周 第九周 第十周 第十一周: 第十二周 ...
- 视频透雾原理加视频增强Retinex算法介绍
(本文转自:http://www.syphong.cn/52-1.html#) 视频透雾原理加视频增强Retinex算法介绍 -上海凯视力成 钟建军 一. 视频增强的背景 视觉信息是人类获得外界信息的 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...
- Chrome使用video无法正常播放MP4视频的解决方案
H5的video标签让前端开发者用一行代码就可以实现视频和音频的播放,然而,有时候我们会突然发现,某些Mp4格式的视频在Chrome下居然无法正常播放?这究竟是什么原因呢?这篇文章主要分析了部分Mp4 ...
- 20169212《Linux内核原理与分析》课程总结
20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
随机推荐
- 【29】html5新标签有哪些?
[29]html5新标签有哪些? canvas svg video audio [01]article(IE8不支持) [01]details [02]aside(IE8不支持) [03]header ...
- webforms字典参数处理
当webforms参数中的value是一个字典时,加上‘’即可正常传参.
- D. Billboard
D. Billboard Time Limit: 8000ms Case Time Limit: 8000ms Memory Limit: 32768KB 64-bit integer IO fo ...
- 2017 Multi-University Training Contest - Team 2
Regular polygon Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- Axure:从简单搜索到联想搜索的部件制作
导读:最近一直都在整理原型部件,要说准备的最有感触的,当属搜索框无疑.搜索框的整理,前后加起来共耗时两天多.从最开始的按钮和文本框,到后来的图示,提示和联想查询.耗费了不少的心血,有必要总结一下,留个 ...
- 安装oracle提示swap交换分区太小
1.用dd命令创建一个16G的文件 #dd if=/dev/zero of=/var/swapfile bs=1G count=16 2.将它创建为Linux Swap虚拟交换文件 #mkswap ...
- iOS学习笔记06-手势识别
一.UIGestureRecognizer简单介绍 我们已经学习了触摸事件处理,但触摸事件处理起来很麻烦,每个触摸事件处理都需要实现3个touches方法,比较繁琐,实际上我们可以使用更加简单的触摸事 ...
- 算法复习——bitset(bzoj3687简单题)
题目: Description 小呆开始研究集合论了,他提出了关于一个数集四个问题:1.子集的异或和的算术和.2.子集的异或和的异或和.3.子集的算术和的算术和.4.子集的算术和的异或和. 目前 ...
- Oracle11g服务详细介绍及哪些服务是必须开启的?
中的方法成功安装Oracle 11g后,共有7个服务, 这七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service: Oracle卷映射拷贝写入服务,VSS(Volu ...
- SGU 105 数学找规律
观察一下序列,每3个数一组,第一个数余1,不能,加第二个数后整除(第二个数本身余2),第三数恰整除.一行代码的事.011011011.... #include<iostream> usin ...