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

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

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

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

清晰度无缝切换

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

__20180727095213

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

__20180727095225


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

__20180727095229

图1.3 mp4 视频新播放流程

1.来请求 mp4 视频数据,这样可以结合视频 Range 服务,做到精确加载。

2.编写解析器将加载回来的部分 mp4 视频数据进行解复用

3.将解复用的视频数据转成 fmp4 格式并传递给 MediaSource

4.使用 video 进行解码完成播放

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

__20180727095233

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

1.播放视频A,过程同上

2.在某个时刻,用户切换到播放视频B,首先解析B的索引文件(moov),反向计算mp4的range区间

3.加载B的视频区间数据

4.解复用

5.把数据转换成fmp4格式并传递给MediaSource

6.删除A的部分Buffer

7.在下一个关键帧自动完成画质的切换

__20180727095237


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

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

1

节省视频流量

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

利用src属性

2

利用source标签

3

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

__20180727095331

图2.1 video默认下载截图

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

__20180727095335


图2.2 播放器加载视频原理

1.设置每次加载的数据包大小

2.设置预加载时长

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

具体实现代码如下:

__20180727095338

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

原文发布时间为:2018-07-27
本文作者:银国徽
本文来自云栖社区合作伙伴“前端大学”,了解相关信息可以关注“前端大学”。

相关文章
|
人工智能 编解码 并行计算
Ai实现FPS游戏自动瞄准 yolov5fps自瞄
Ai实现FPS游戏自动瞄准 yolov5fps自瞄
9295 0
|
17天前
|
机器学习/深度学习 人工智能 测试技术
NeurIPS D&B 2024 突破短视频局限!MMBench-Video解读MLLM视频理解能力
GPT-4o 四月发布会掀起了视频理解的热潮,而开源领军者Qwen2也对视频毫不手软,在各个视频评测基准上狠狠秀了一把肌肉。
|
2月前
|
编解码 监控 网络协议
如何用魔法般的步骤实现RTSP推送H.264与H.265(HEVC),打造震撼视听盛宴,让每一帧都充满魔力!
【9月更文挑战第3天】实现RTSP流媒体服务推送H.264和H.265编码视频是现代视频监控及直播平台的关键技术。本文详细介绍环境搭建、编码配置及服务器与客户端实现方法。首先,通过FFmpeg捕获视频并编码成RTSP流,接着使用VLC等工具接收播放。此外,还提供了C++示例代码,演示如何利用libv4l2和FFmpeg自定义服务器端实现。希望本文能帮助读者成功搭建RTSP视频流系统。
280 1
|
3月前
|
编解码 监控 网络协议
【绝密技巧】揭秘!如何用魔法般的步骤实现RTSP推送H.264与H.265(HEVC),打造震撼视听盛宴,让每一帧都充满魔力!
【8月更文挑战第15天】本文详述了如何使用RTSP流媒体服务推送H.264及H.265编码视频,适用于视频监控和直播平台。首先需确保环境支持这两种编码格式,可通过FFmpeg实现。在Ubuntu上安装FFmpeg后,可配置从摄像头捕获视频并推流至RTSP服务器。针对H.265编码,只需更改视频编码器为`libx265`。客户端可使用VLC播放器接收流。此外,还提供了C++示例代码用于自定义服务器实现,包括初始化上下文、打开编码器和循环编码视频帧。此教程旨在助力实现RTSP推送目标。
59 0
|
6月前
|
UED
首批类Sora竞争对手出现,Snap Video效果优于Pika、不输Gen-2
【2月更文挑战第13天】首批类Sora竞争对手出现,Snap Video效果优于Pika、不输Gen-2
95 3
首批类Sora竞争对手出现,Snap Video效果优于Pika、不输Gen-2
|
6月前
|
机器学习/深度学习 监控 对象存储
视觉智能平台常见问题之人脸视频融和的mp4文件抽帧如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
|
编解码 异构计算 Windows
加速视频转码,释放创意潜力——Media Encoder 2023[ME软件下载安装]
Adobe Media Encoder (Me)是一款专业的音频和视频格式转换编码软件,文件格式转换软件。它主要用于音频和视频文件的编码和转换。它支持大量的格式。通过系统预设设置,可以更好地导出与相关设备兼容的文件。这个功能强大的媒体管理工具使您能够跨各种应用程序以统一的方式处理媒体。与Adobe Pr、Adobe Ae和其他应用程序的紧密集成提供了无缝工作流。
|
人工智能 算法 API
iOS MachineLearning 系列(13)—— 语音与音频相关的AI能力
在语音分析方面,iOS中提供了原生的Speech框架,这个框架可以实时的将语音解析成文本。这个能力非常强大,使用它我们可以实现类似实时翻译的功能。对于非语音的音频,也有一些原生的AI能力可以使用,例如分析语音的类型。SoundAnalysis框架能够识别300多种声音,我们也可以使用自己训练的模型来处理定制化的音频识别需求。
342 0
|
并行计算 Ubuntu 数据安全/隐私保护
图片转换为 mp4 video,一项神奇的技术【CVPR 2020】
图像修复-代码环境搭建-知识总结
777 0
图片转换为 mp4  video,一项神奇的技术【CVPR 2020】
|
编解码 Go 索引
FFmpeg优化 苏宁PP体育视频剪切效率提升技巧
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/82719724 ...
2250 0