热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于video播放的新探究

前端同砚要运用HTML5播放器视频,必然会运用video标签,不过大多数同砚只是运用了较简朴的功用,实在它自身具有非凡之力有待我们发明。起首,我们先来看下video最基础的用法:运

前端同砚要运用 HTML5 播放器视频,必然会运用 video 标签,不过大多数同砚只是运用了较简朴的功用,实在它自身具有非凡之力有待我们发明。

起首,我们先来看下 video 最基础的用法:

  • 运用 src 属性

    图1.1 一般mp4的下载要求历程

    《关于 video 播放的新探究》

    图1.2 Youtube视频下载要求历程

    这两张图不难看出,在默许状况下 mp4 运用一次 http 要求一切的视频数据,Youtube 则分次要求。固然这个形貌很不专业,但确切抽象。形成这类差别的是 video 不支撑流式的视频数据,Youtube 采纳的是流式的视频容器 webm,而 mp4 黑白流式的。那怎样诠释清晰流式的视频数据呢,从专业的角度一言半语很难说清晰,但用大白话翻译过来就是流式的视频数据支撑分段自力播放,非流式的不能够。换句话说一个10M的视频文件,流式的视频能够把0~1M的数据要求返来零丁播放,但黑白流式的不能够。

    上面我们形貌了视频花样的差别,接下来我们要说的是第一张图中的视频加载是阅读器来掌握的,经由过程给 video 的 src 属性设置视频地点,触发播放以后阅读器就会最先下载了,JS过问不了。而 Youtube 的视频加载是经由过程JS来掌握的,列位能够再次看下第二张图的收集要求范例:xhr,足以证实这一点。

    上面两点搞清晰以后我们就该说下清晰度切换的事变了。这个需求人人都不生疏,然则直接运用 mp4 花样做无缝清晰度切换,难度还挺大的。先诠释下“无缝清晰度切换”的观点:从播放一个分辨率的视频到另一个分辨率且保证画面、声响不停顿的腻滑切换历程。了解了这个观点,人人应当知道了用 video 无缝切换 mp4 有多灾。一方面,video 是不支撑流式的视频花样的,一方面,video 的加载是不受JS掌握的。经由过程切换 video 的 src 属性,必然会致使画面中缀、从新要求视频数据等。有的同砚想到说应用两个 video 再连系 z-index 来搞,然则当你天生另一个video去加载视频的时候,没法保证两个画面是严厉一致的,纵然将本来的画面暂停到一个时候,用另一个视频经由过程 currentTime 属性与之同步,切换依然看到画面闪灼,基础没法和 Youtube 无缝切换的体验对抗。而且还会形成更多流量的糟蹋,背地的缘由人人能够研讨下 mp4 容器和 webm 容器的异同,也能够看下视频解码相干的文章。

    另有一种要领就是将 mp4 花样一切转码到流式的视频花样比方 hls、webm 等。不过这类看上去可行的体式格局现实上会带来很大的本钱开支,如将大批视频做转码会斲丧奋发的机械资本、双倍存储的用度、CDN的双倍用度等等。实在我们也是在这类背景下研讨出来新的手艺题目处理清晰度无缝切换的。

    起首,我们转变对 mp4 视频的播放流程,不再直接运用 video 的 src 来播放,由于我们没有任何能够操纵的空间。video不仅支撑 src 属性还支撑 Blob 对象,我们就是应用后者。播放的流程以下:

    《关于 video 播放的新探究》
    图1.3 mp4 视频新播放流程

    • 来要求 mp4 视频数据,如许能够连系视频 Range 效劳,做到准确加载。
    • 编写剖析器将加载返来的部份 mp4 视频数据举行解复用
    • 将解复用的视频数据转成 fmp4 花样并传递给 MediaSource
    • 运用 video 举行解码完成播放

    然后在做清晰度切换的时候流程以下:

    《关于 video 播放的新探究》
    图1.4 mp4视频清晰度切换道理示意图

    • 来要求 mp4 视频数据,如许能够连系视频 Range 效劳,做到准确加载。
    • 编写剖析器将加载返来的部份 mp4 视频数据举行解复用
    • 将解复用的视频数据转成 fmp4 花样并传递给 MediaSource
    • 运用 video 举行解码完成播放

      然后在做清晰度切换的时候流程以下:

      《关于 video 播放的新探究》
      图1.5 mp4视频清晰度切换流程示意图

      这个历程看上去比较烦琐,然则一切的操纵都是在阅读器端完成,也就是说都是JS来完成的。如许之前说的一切本钱题目都不存在,还能做到youtube雷同体验的无缝切换。假如人人也想运用这个功用不需要本身再去完成一遍上述流程,能够运用以下代码:

      import Player from 'xgplayer';
      import 'xgplayer-mp4';
      let player = new Player({
      el:document.querySelector('#mse'),
      url: [{src:'/mp4/',type:"video/mp4"},{src:'/mp5/',type:'video/mp4'}]
      });
      player.emit('resourceReady', [{name: '高清', url: '/mp4/',cname:'高清'}, {name: '超清', url: '/mp5/',cname:'超清'}]);

    假如对这段代码有什么迷惑或许想深切了解下它背地是怎样完成的能够参考 文档 或许 Github。

    节约视频流量

    我们日常平凡直接运用video加载视频,大概是如许的:

    《关于 video 播放的新探究》
    图2.1 video默许下载截图

    我随意找了个视频,人人看下视频总长度是 02:08,在播放到 00:05 的时候,阅读器已下载到 01:30 了,假如用户停止寓目,下载的视频就如许被糟蹋掉了。固然,假如不停的 seek 也会形成较多的流量糟蹋。根据我们之前的统计在短视频范畴,用户 seek 的频次在 80%,所以这部份流量是能够节约掉的。详细道理以下:

    《关于 video 播放的新探究》
    图2.2 播放器加载视频道理

    • 设置每次加载的数据包大小
    • 设置预加载时长
    • 开启加载行列,完成第一次数据包下载,推断缓冲时候和预加载时长是不是满足,不满足要求下一个数据包

    详细完成代码以下:

    import Player from 'xgplayer';
    import 'xgplayer-mp4';
    const player = new Player({
    id:'vs',
    url:'//abc.com/a/mp4',
    preloadTime:10
    });

    如许就完成了视频在播放历程当中永久只预加载10秒的数据,进而保证节约流量。

    一切代码来自带剖析器、能节约流量的西瓜播放器,Github


推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 标题: ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
author-avatar
雨之夜惊恐_136
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有