首页 装机必备 正文

mp4播放 洞察 video 超能力系列——玩转 mp4

洞察 video 超能力系列——玩转 mp4

用技术提升美好事物发生的概率。Technologically, for greater probability to be happy

前言

只要在 HTML5 中使用过视频播放的同学对 video 标签一定不会陌生,不过很多同学只使用了 video 的基础功能,实际上 video 拥有强大潜能的,只要姿势正确就能让其拥有超能力。不妨从下面几个场景来逐渐了解下video 未曾被发掘的神秘空间:

清晰度无缝切换节省视频流量

清晰度无缝切换

点播领域里 mp4 是最普遍、兼容性最好的视频容器,不过 mp4 也有它的局限性,比如常见的清晰度切换,我们是无法像youtube那样做到无缝切换的。我们可以看下普通的mp4播放的网络请求和youtube视频播放的网络请求的区别。

图1.1 普通mp4的下载请求过程

图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 对象,我们就是利用后者。播放的流程如下:

图1.3 mp4 视频新播放流程

来请求 mp4 视频数据,这样可以结合视频 Range 服务,做到精确加载。编写解析器将加载回来的部分 mp4 视频数据进行解复用将解复用的视频数据转成 fmp4 格式并传递给 MediaSource使用 video 进行解码完成播放

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

图1.4 mp4视频清晰度切换原理示意图

播放视频A,过程同上在某个时刻,用户切换到播放视频B,首先解析B的索引文件(moov),反向计算mp4的range区间加载B的视频区间数据解复用把数据转换成fmp4格式并传递给MediaSource删除A的部分Buffer在下一个关键帧自动完成画质的切换

图1.5 mp4视频清晰度切换流程示意图

这个过程看上去比较繁琐,但是所有的操作都是在浏览器端完成,也就是说都是JS来实现的。这样之前说的所有成本问题都不存在,还能做到youtube相同体验的无缝切换。如果大家也想使用这个功能不需要自己再去实现一遍上述流程,可以使用如下代码:

如果对这段代码有什么疑惑,或者想深入了解下它背后是如何实现的,可以参考 Github:https://github.com/bytedance/xgplayer 或 阅读原文:https://techblog.toutiao.com/

节省视频流量

使用 video 的同学基本上都是这样用的,如下:

利用src属性

2.利用source标签

这样就可以播放视频了,不过前面我们讲过这样使用 video ,视频的加载是受浏览器控制的,可以看下浏览器在视频刚开始播放的时候下载了多少数据:

图2.1 video默认下载截图

我随便找了个视频,大家看下视频总长度是 02:08,在播放到 00:05 的时候,浏览器已经下载到 01:30 了,如果用户终止观看,下载的视频就这样被浪费掉了。当然,如果不断的 seek 也会造成较多的流量浪费。按照我们之前的统计在短视频领域,用户 seek 的频率在 80%,所以这部分流量是可以节省掉的。具体原理如下:

图2.2 播放器加载视频原理

设置每次加载的数据包大小设置预加载时长开启加载队列,完成第一次数据包下载,判断缓冲时间和预加载时长是否满足,不满足请求下一个数据包

具体实现代码如下:

这样就实现了视频在播放过程中永远只预加载10秒的数据,进而保证节省流量。

扩展链接,了解超能力西瓜视频是怎样炼成的。

手机突然有些视频无法播放是为什么,格式是mp4

1、首先是播放器的问题。重新安装播放器一般,安卓手机使用mxplayer、moboplayer,苹果手机使用aceplayer、avplayer等,都可以播放。

2、上述方法不行,也可能是MP4文件被破坏了。换一个MP4文件测试一下。

3、另外,可能是一些视频文件有错误的扩展名。比如一些mpg或其它格式的视频,下载回来后被误命名为mp4的扩展名。就会导致解码出错。

如果说播放不了要么是视屏本身有问题 要么播放程序有问题

如果说视屏有问题你可以试试用转码软件 MP4转MP4 如果不行 那大多是视屏已经顺坏

如果说是播放程序有问题 那就简单了 只要换一个程序就ok了

用 MP4/RM转换专家 转换格式、调整分辨率就行了!

它是国内最流行的应用于移动设备的转换软件。

这个软件能帮你将你的视频文件转换成你手机适用的MP4/3GP/3G2等等格式,还能手动设置视频文件的分辨率、比特率等等参数呢~

软件的操作界面简洁,轻松就能完成格式转换!

百度搜索 MP4/RM转换专家

生成序列帧功能的视频编辑软件,基本都是功能强大的视频编辑软件,如PR、ED等。 这些软件,都有汉化版。

相关问答

电脑里的 MP4 文件怎么样才能 播放 ?-ZOL问答

电脑里的MP4文件可以用播放器播放。1、MP4就是MPG4,是一种高压缩的影音格式图像效果非常好,文件后缀是AVI;2、播放该种格式主要不在于采用什么播放器,而是看系...

电视视频 播放MP4 ,播放不出来,是为什么-ZOL问答

有几种可能的原因导致电视无法播放MP4视频:1.不支持的视频编码格式:电视可能只支持特定的视频编码格式,如H.264或MPEG-4。如果你的MP4文件使用了其他编码格式...

mp4 无法 播放 视频是怎么回事?

遇到MP4无法播放视频的主要原因有两种,第一种是播放器没有对应的播放插件,可以到网络中搜索下载安装后即可解决。第二种是该视频文件的帧率或分辨率过大,造成...

手机怎 播放mp4 ?

3、之后在该界面中,点击“本地...1、首先打开小米6手机,点击“小米视频”图标。2、然后在该界面中,点击右上角“文件夹”选项。3、之后在该界面中,点击“本...

mp4播放 卡顿怎么解决?

MP4播放卡顿的问题可能是由于多种原因导致的,以下是一些可能的解决方法:1.降低视频分辨率:如果您的计算机或移动设备的处理能力不足以处理高分辨率视频,则...

mp4 怎么使用?

MP4是一种支持多媒体播放的设备,使用方法如下:明确MP4可以通过简单的几个步骤来使用。解释首先,将MP4设备连接到电脑或者电源上,然后打开MP4设备,在主屏幕上...

wma 可以用 MP4播放 吗?

WMA文件通常不能直接用MP4播放器播放。WMA(WindowsMediaAudio)是一种音频格式,而MP4(MPEG-4)是一种多媒体容器格式,通常用于存储音频和视频。但是,大多...W.....

mp4 如何在电脑 播放 ?

MP4中的电影,要在电脑上播放,可以有两种方式:把MP4作为U盘连接。通过USB数据线,把MP4连接到电脑的USB端口,一般的MP4会自动被电脑识别为U盘...

mp4 格式的光盘怎么 播放 ?

跟正常视频文件播放步骤一样。1、打开光驱在光驱的盘符上点右键,在出现的下拉菜单上点击“弹出”。或者直接按电脑光驱的打开按钮,光驱就会自动跳出来...跟...

为什么 MP4 格式无法 播放 ?

原因:1、视频文件本身有误。2、视频文件分辨率过高超出了手机对视频文件的支持范围。有些mp4格式视频文件不能在手机中看的原因主要有两点:一、MP4格式的...