本来想说说关于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端的视频文件中,在開始播放时前端播放器非常难获得相关的数据。

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

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

这仅仅是一个播放页的html文件,并非实际要播放的视频。这个请求非常关键,通过这次请求。播放器前端能够获得该视频的整体播放时长等信息。

关于这个信息我们能够在这个html的源代码里得到:

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

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

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

(未完待续)

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

  1. IIS6/IIS7环境下实现支持mp4视频随意拖动、预览播放、边下载边播放

    前几天,一客户需要在IIS环境下实现MP4视频可以随意拖动观看,边下载边播放.一看这要求,IIS本身是无法实现,想着应该需要用插件,于是GG一番,还真找到这样的插件,此组件为H264-Streamin ...

  2. Python 下载网络mp4视频资源

    最近着迷化学, 特别是古代的冶炼技术,感叹古人的聪明. 春秋时期的炼铁方法是块炼铁,即在较低的冶炼温度下,将铁矿石固态还原获得海绵铁,再经锻打成的铁块.冶炼块炼铁,一般采用地炉.平地筑炉和竖炉3种.铁 ...

  3. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

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

    目录 2019-2020-1 <Linux内核原理与分析>教学进程 考核方案 第一周: 第二周: 第三周: 第四周: 第五周 第六周 第七周: 第八周 第九周 第十周 第十一周: 第十二周 ...

  5. 视频透雾原理加视频增强Retinex算法介绍

    (本文转自:http://www.syphong.cn/52-1.html#) 视频透雾原理加视频增强Retinex算法介绍 -上海凯视力成 钟建军 一. 视频增强的背景 视觉信息是人类获得外界信息的 ...

  6. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  7. Chrome使用video无法正常播放MP4视频的解决方案

    H5的video标签让前端开发者用一行代码就可以实现视频和音频的播放,然而,有时候我们会突然发现,某些Mp4格式的视频在Chrome下居然无法正常播放?这究竟是什么原因呢?这篇文章主要分析了部分Mp4 ...

  8. 20169212《Linux内核原理与分析》课程总结

    20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...

  9. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

随机推荐

  1. android 之 Dialog

    Android平台下对话框主要有普通对话框.选项对话框.单选多选对话框.进度对话框.日期对话框.时间对话框等. 在程序中通过开发回调方法onCreateDialog来完成对话框的创建,该方法需要传入代 ...

  2. 二、harbor部署之部署harbor

    1 harbor部署之安装docker 1.yum install -y docker #安装docker 2 harbor部署之安装docker-compose 1.首先检查centos有没有安装p ...

  3. selenium之定位以及切换frame

    总有人看不明白,以防万一,先在开头大写加粗说明一下: frameset不用切,frame需层层切! 很多人在用selenium定位页面元素的时候会遇到定位不到的问题,明明元素就在那儿,用firebug ...

  4. ACdream 1135 MST

    MST Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Problem Descrip ...

  5. [android开发篇] 权限

    Android 应用采用 Java 编程语言编写.Android SDK 工具将您的代码 — 连同任何数据和资源文件 — 编译到一个 APK:Android 软件包,即带有 .apk 后缀的存档文件中 ...

  6. 【容器人必看】你一定要来 ECUG Con 2018 的三个理由!

    引领国内云领域风向的高端峰会 ECUG Con 2018,即将在 12 月 22-23 日 深圳南山 全新启程!如果你的工作和容器内容相关联,如果你的兴趣和容器技术有交集,如果你是「容器人」,那么这就 ...

  7. BZOJ 4259 残缺的字符串 ——FFT

    [题目分析] 同bzoj4503. 只是精度比较卡,需要试一试才能行O(∩_∩)O 用过long double,也加过0.4.最后发现判断的时候改成0.4就可以了 [代码] #include < ...

  8. [BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)

    传送门 1.树形DP #include <cstdio> #include <cstring> #include <iostream> #define N 1000 ...

  9. 刷题总结——电影(ssoi)

    题目: 题目背景 SOURCE:NOIP2014-SXYZ T2 题目描述 小美去看电影,发现这个电影票很神奇,有一个编号 (x,y) 表示为第 x 排第 y 位. 小美是个聪明的女孩子,她有自己的一 ...

  10. 同时在windows和linux环境开发时换行符的处理

    Git 的 core.autocrlf 參數默认为true,即每次 checkin 時,Git 會將純文字類型的檔案中的所有 CRLF 字元轉換為 LF,也就是版本庫中的換行符號一律存成 LF:在 c ...