Video streaming 自适应流媒体-避免出现大量关键帧 背景:
我正在构建一个基于媒体源扩展协议的具有自适应流媒体的html5视频播放器。我用的是mp4 问题: 我有两个版本的同一个视频(让我们说高质量和坏质量),我希望能够切换版本之间很少的延迟。问题是,在更改版本时,我需要一个以关键帧开始的片段,而在视频中经常出现关键帧对带宽非常不利 我正在寻找一种方法,当用户更改版本时,发送一个以关键帧开头的片段,以及一个没有其他关键帧的片段(我知道有一个关于有一个没有关键帧的片段的例子,但现在我们忽略它,它即将被修复) 我想在一个有很多关键帧的视频中复制每个流,在另一个没有关键帧的视频中复制(显然第一帧除外),然后在切换视频版本时只使用有关键帧的流。看起来像这样的东西:Video streaming 自适应流媒体-避免出现大量关键帧 背景:,video-streaming,html5-video,media-source,adaptive-bitrate,Video Streaming,Html5 Video,Media Source,Adaptive Bitrate,我正在构建一个基于媒体源扩展协议的具有自适应流媒体的html5视频播放器。我用的是mp4 问题: 我有两个版本的同一个视频(让我们说高质量和坏质量),我希望能够切换版本之间很少的延迟。问题是,在更改版本时,我需要一个以关键帧开始的片段,而在视频中经常出现关键帧对带宽非常不利 我正在寻找一种方法,当用户更改版本时,发送一个以关键帧开头的片段,以及一个没有其他关键帧的片段(我知道有一个关于有一个没有关键帧的片段的例子,但现在我们忽略它,它即将被修复) 我想在一个有很多关键帧的视频中复制每个流,在另一
// *
// * represents a key frame; * represents a normal frame; a fragment has 4 frames
*
Stream A.1 **** **** **** **** **** **** **** // version A with no key frames
* * * * * * *
Stream A.2 **** **** **** **** **** **** **** // version A with key frames
// at the beginning of each fragment
.
Stream B.1 .... .... .... .... .... .... ....
. . . . . . .
Stream B.2 .... .... .... .... .... .... ....
* .
A -> B **** **** .... .... .... .... ....
from A.1 A.2 B.1 B.2 B.2 B.2 B.2
因此,每一帧要么是关键帧,要么是前一帧可以成功解码的正常帧。这将把通过线路发送的关键帧数量限制在最低限度
但是嘿!从A1
切换到A2
被浏览器理解为更改视频流,并且不起作用,因为A2
不是从关键帧开始的
有谁知道如何才能取得这样的结果?我目前正在考虑在客户端重写moov和moof原子,以欺骗玩家认为一切都是例外。但我对它了解不多
动机:
我正在研制360播放器。360很难,因为视频中有很大一部分是流式的,但没有显示,这意味着在带宽受限的情况下,显示的视频质量要比人们习惯的低得多。有工具和技术可以生成视频的多个版本,每个版本都以不同的视图方向为中心,然后播放器决定在运行时播放哪个版本
由于用户可以随时更改视图方向,因此能够对此类更改做出快速反应非常重要,这比字节率自适应更为重要。由于这项工作的目标是节省带宽,因此从添加大量关键帧开始是不好的
另外,由于iOS Safari不支持内联视频,而内联视频是360播放器的关键,因此我可以依赖iOS Safari不支持的MSE(说真的,那些家伙在干什么?每个片段都需要从关键帧开始,这样才能正确切换;要使此项工作正常,关键帧间隔应均匀划分片段持续时间,例如,正确的组合为:
- 每2秒设置一次关键帧,片段长度为6秒
- 每4秒设置一次关键帧,片段长度为8秒