您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
京东星店长移动端自动播放视频实践
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
京东星店长移动端自动播放视频实践
京东ZERO团队
2021-01-07
IP归属:未知
31480浏览
前端
## 前言 在直播和短视频行业日益火热的发展形势下,视频开发技术也随之成为互联网各大巨头争相关注的重点。由于现在的网络用户要求他们在浏览网页的时候不仅能与之交互还要可以保证页面整体的流畅性,因此如何使视频加载迅速而且流畅自动播放,成了开发者需要关注的问题。本文章就视频自动播放开发过程中所运用到的技术和原理进行梳理和总结。 ## 难点和挑战 传统的视频播放技术都是用`MP4`格式进行播放。`MP4`格式在手机上自动播放存在兼容性问题,在部分安卓机下无法自动播放产生黑屏。但是用户对页面效果要求越来越多元化,用视频自动播放来做为动态背景,已经成为页面设计上不可或缺的亮点。 ## 解决方案 我们引用了新的视频技术`TS`。`TS`(Transport Stream,传输流)是一种视频格式,它的全称为MPEG2-TS,可以实现视频的自动播放。`618`京东主会场和京东明星店长活动都引入了这个技术,下面将介绍下该技术的用法。 ![京东星店长TS视频效果.gif](https://img12.360buyimg.com/imagetools/jfs/t1/130141/27/3745/2100617/5f02bf42E5097091d/646927dd079cbfc9.gif) ## 生成ts视频 需要安装`ffmpeg`来将`Mp4`转化成`Ts`视频。安装操作如下所示: `mac`下可以运行 ```bash brew install ffmpeg ``` `windows`下可以在[https://ffmpeg.zeranoe.com/builds/](https://ffmpeg.zeranoe.com/builds/)中下载。 然后用`ffmpeg` 转化 ```bash ffmpeg -i in.mp4 -f mpegts -codec:v mpeg1video -codec:a mp2 -b 0 out.ts ``` 还可以控制视频大小(-s),帧速率(-r),视频比特率(-b:v),音频比特率(-b:a),音频通道数(-ac),采样率(-ar ) 以及更多。 有关详细信息,请参阅[ffmpeg文档](https://github.com/phoboslab/jsmpeg)。 如下所示 ```bash ffmpeg -i in.mp4 -f mpegts \ -codec:v mpeg1video -s 960x540 -b:v 1500k -r 30 -bf 0 \ -codec:a mp2 -ar 44100 -ac 1 -b:a 128k \ out.ts ``` > * 注意:尽量用高质量的MP4来转成Ts,如果在手机上显示,采用比特率1500k即可。ffmpeg -i in.mp4 -f mpegts -codec:v mpeg1video -b:v 1500k -codec:a mp2 out.ts ## 播放ts视频 推荐用[jsmpeg-player](https://www.npmjs.com/package/@cycjimmy/jsmpeg-player),它是基于[jsmpeg](https://github.com/phoboslab/jsmpeg)封装的npm包。 最好准备一个封面,先将视频盖住,等视频播放后再去掉封面,详情如下: ```javascript import React, { useEffect, useState, useRef } from 'react' import './index.less' import JSMpeg from '@cycjimmy/jsmpeg-player' export default function VideoTs(props) { //封面 const cover ='https://img11.360buyimg.com/imagetools/jfs/t1/105707/30/17596/32160/5e8c8ae6Ee2bfd8db/1ef4084de9ec103f.jpg' const tsSrc='https://storage.360buyimg.com/xingdianzhang/%E6%B5%8B%E8%AF%95ts.ts' const hdVideo = useRef(null) var [isCover, setIsCover] = useState(true)//是否用封面覆盖 useEffect(() => { initTs() }, []) function initTs() { let canvas = hdVideo.current.querySelector('.hdVideo-ts') canvas.style.width = '0px' new JSMpeg.VideoElement(canvas, tsSrc, { canvas, autoplay: true, loop: true, progressive: false,//是否为chunk control: false, poster: cover, preserveDrawingBuffer: true, decodeFirstFrame: true, disableGl: true, }, { audio: false, //静音 onPlay: () => { canvas.style.width = hdVideo.current.clientWidth + 'px' setIsCover(false) } }) } return ( <div ref={hdVideo} className='hdVideo'> {isCover ? <img className="hdVideo-image" src={cover} /> : null} <canvas className="hdVideo-ts"></canvas> </div> ) } ``` ```css <!--index.less--> .hdVideo{ width: 750px; height: 400px; .hdVideo-image{ width: 100%; height: 100%; } .hdVideo-ts{ width: 100%; height: 100%; } } ``` ## 注意的坑 #### 视频加载问题 问题:当网速特别慢时,视频刚开始加载时需要时间缓冲,缓冲时视频数据还没有加载出来就会显示黑屏。 解决方案:可以准备张图片,图片建议为视频的第一帧,该图片盖在视频上。监听视频的`onPlay`事件,当视频加载完开始播放时会触发`onPlay`事件,这时将图片移除。 ```javascript ... new JSMpeg.VideoElement(document.querySelector('.hdVideo-ts'),'https://storage.360buyimg.com/xingdianzhang/ts_oulaiya.ts', { ...options }, { onPlay: () => { document.querySelector('.hdVideo-imagehdVideo-image').remove() } }) ... ``` #### 兼容性问题 问题:`TS`在`Android7`以及`Ios11`版本以下都存在兼容性问题。 解决方案:可以降级处理。首先判断手机系统版本,如果手机是不兼容版本,则以图片来做兜底展示,图片可以为视频的第一帧。 ```javascript // 获取 android 版本号 function getAndroidVersion(ua) { ua = ua || navigator.userAgent let match = ua.match(/android\s([0-9\.]*)/i) return match ? match[1] : 'unknown' } // 获取 ios 版本号 function getIOSVersion(ua) { ua = ua || navigator.userAgent let match = ua.match(/OS ((\d+_?){2,3})\s/i) return match ? match[1].replace(/_/g, '.') : 'unknown' } if(versionCompare(getIOSVersion(), '11.0.0') > 0 || versionCompare(getAndroidVersion(), '7.0.0') > 0){ initTs() //开始初始化Ts视频 } ``` #### Apple自动播放没有声音 问题:`Apple`设备会自动播放会默认静音 解决方案:可以引导用户单击视频图标右下角的视频以解锁声音。 安卓机型声音是没有问题。在非自动播放模式下没有类似问题。 ## TS的npm插件 根据上面提到的加载和兼容性问题,并结合了解决方案,本妹子写了个自动播放视频插件[jdyfe-tpl-videots](https://www.npmjs.com/package/jdyfe-tpl-videots),已发布到`npm`网站中,欢迎小伙伴们使用。 #### 使用方法 `cover`:必填。指兜底图片,当视频加载或不兼容`TS`时显示。 `tsSrc`:必填。`TS`视频路径。 `className`:选填。可以添加class自定义样式 `option`:选填。默认为`{}`,详细参数[查看](https://www.npmjs.com/package/@cycjimmy/jsmpeg-player) `overlayOptions`:选填。默认为`{}`,详细参数[查看](https://www.npmjs.com/package/@cycjimmy/jsmpeg-player) ```js import VideoTs from 'jdyfe-tpl-videots' import React, { Component } from 'react' export default function Home(props) { return ( <VideoTs className='tsClass' cover='https://img11.360buyimg.com/imagetools/jfs/t1/105707/30/17596/32160/5e8c8ae6Ee2bfd8db/1ef4084de9ec103f.jpg' tsSrc='https://storage.360buyimg.com/xingdianzhang/%E6%B5%8B%E8%AF%95ts.ts' /> ) } ``` ### 后记 本文中的视频案例来自京东星店长618大促活动,附上核心团队成员的照片 ![image.png](https://img12.360buyimg.com/imagetools/jfs/t1/126677/40/8830/1141351/5f2a88eaEfa3dac1f/a44e39dffef59a4b.png) Happy coding .. :) ### 相关链接 > [jdyfe-tpl-videots包](https://www.npmjs.com/package/jdyfe-tpl-videots) > [https://www.reneelab.com.cn/what-is-ts-file-and-how-to-play-ts-video.html](https://www.reneelab.com.cn/what-is-ts-file-and-how-to-play-ts-video.html) > [ffmpeg文档](https://github.com/phoboslab/jsmpeg) > [jsmpeg-player包](https://www.npmjs.com/package/@cycjimmy/jsmpeg-player)
原创文章,需联系作者,授权转载
上一篇:React Router源码分析
下一篇:Git message规范Change log编写指南
相关文章
前端十年回顾 | 漫画前端的前世今生
Taro小程序跨端开发入门实战
【技术干货】企业级扫描平台EOS关于JS扫描落地与实践!
京东ZERO团队
文章数
39
阅读量
91754
作者其他文章
01
webpack打包组件配置(React版本)
这篇文章是以打包react插件的形式,介绍webpack的一些配置信息。如果写简单插件的话还是推荐使用rollup,但是可以用写插件的形式去学习一下webpack的一些东西。(适用于初中级webpack学者)
01
webpack核心概念与基本实现
webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。**
01
Typescript合成Webpack中
TypeScript是JavaScript类型的超集,它可以编译成纯JavaScript,简称ts。相对于ES6,TypeScript最大的改善是增加了类型系统,国内外很多大型工程都用它,如AngularJs,白鹭引擎、Antd。
01
小程序加载svg图片
小程序的[组件](https://developers.weixin.qq.com/miniprogram/dev/component/)中是没有支持`SVG`标签的。 但是在前端小伙伴的实际开发中,UED经常提供SVG图片过来,如果不想用引入`iconfont`的话,那么妹子我将介绍个很好用的方法。
京东ZERO团队
文章数
39
阅读量
91754
作者其他文章
01
webpack打包组件配置(React版本)
01
webpack核心概念与基本实现
01
Typescript合成Webpack中
01
小程序加载svg图片
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号