mp4相比m3u8第一帧加载较慢的原因?

工作室正在做的软件,是一个以长视频播放为主的Android与IOS 手机软件。
最近半年,老板要求对视频的 秒开率(1秒内成功加载的播放数 / 播放总数)、失败率 (播放失败的次数 / 播放总数) 等进行优化。经过线上AB测试发现,m3u8视频(第一段切片为1~3秒)在秒开率、失败率等性能指标上均优于普通mp4视频

这里想探究一下,m3u8视频(第一段切片为1~3秒)在秒开率上均优于普通mp4视频的原因。

网络上找到的原因基本是:
mp4 - PC/Apple/Android 通吃,和HTML5和flash播放器亲和度都挺好,但是文件头太大,结构复杂,长视频的大文件头影响加载速度的视频体验, 所以短视频更常见

一、普通MP4

这里从网络上找了一个普通MP4文件的结构图,让我们看一下它的文件结构:


一眼看去,完全懵逼了,果然结构复杂...

MP4实际代表的含义是 MPEG-4 Part 14。
其文件由若干个box组成,每个box有类型和长度,这里可以将box理解为一个数据对象块。box中还可以包含子box,包含子 box 则称之为container box

这里我从网络上下载了一个普通MP4文件。在Mac平台上,我们用MediaParser软件可以用来大致看一下这个MP4文件的构造。

1.1、ftyp

一个MP4文件有且只有一个 ftyp ,在MP4文件的开始位置,描述的文件的版本、兼容协议等 ;

1.2、moov

moov(Movie Box)是一个container box ,一般跟随在ftyp之后,有且只有一个。
其不包含具体媒体数据,但包含本文件中所有媒体数据的宏观描述信息(视频创建时间、视频修改时间、播放速率、视频时长、音量大小、视频宽高、字幕语言、声道、视频/音频帧位置 等)。

moov box下,一般包含以下几个box:

  • mvhd 中记录了创建时间、修改时间、时间度量标尺、可播放时长等信息;
  • trak 可以有多个,描述了每个媒体轨道的具体信息;
  • udta user data;

1.3、mdat

mdat(Midia Data Box)MP4文件的媒体数据存放在这里。mdat中的数据帧依次存放,每个帧的位置、时间、长度都由moov中的信息指定。
mdat Box 基本上占据了视频大小的 95% 以上,得益于 mp4 边下边播的效果,浏览器获取到了部分 mdat box,就可以进行播放。

若希望详细了解普通MP4文件结构,可参考文章:
mp4文件格式解析

结论

了解到此,大致可以了解到:
普通MP4文件播放时,ftyp与moov box需同时加载完成后,并下载部分mdat box的帧数据后,才能开始播放
那对于一些长视频,确实存在文件头过大,从而影响第一帧的加载速度问题。
另外,对于不是很规范的文件,例 mp4视频文件举例中moov box基本在文件最后的的MP4文件,还有可能存在视频文件基本下载完成后才能播放的问题。

二、Fragment mp4 (fmp4)

在网络上查找MP4文件结构时,发现一种Fragmented mp4 的文件结构图

fmp4 是基于 MPEG-4 Part 12 的流媒体格式。与普通MP4相比:

  • fmp4不需要一个 moov Box 来进行 initialization
  • fmp4 的 moov Box 只包含了一些 track 信息
  • fmp4 的 视频/音频 metadata 信息与数据都存在一个个 moof、mdat 中,它是一个流式的封装格式

2.1、Fragment

在微软的 Silverlight中的Smooth Streaming文件结构文件分为了多个Fragments,每个Fragment中包含moof和mdat。这样的结构符合渐进式播放需求,mdat及其描述信息逐步传输,收齐一个Fragment便可播放其中的mdat

2.2、moof

这个box并不是MP4文件必须的部分。它是视频分片的描述信息,其为流媒体格式(微软的 Silverlight中的Smooth Streaming)中的重中之重。

三、参考

mp4文件格式解析

什么是「Fragmented mp4(fmp4)」, 它和普通 mp4 格式有什么区别?

========== THE END ==========

mp4相比m3u8第一帧加载较慢的原因?的更多相关文章

  1. Laya 分帧加载优化

    Laya 分帧加载优化 @author ixenos Flash中的EnterFrame事件在Laya中等同于Laya.timer.frameLoop(1,...) Laya.timer.frameL ...

  2. C#用ckplayer.js播放 MP4格式视频实现 边加载边播放

    MVC设计模式下 在View页面里面使用ckplayer.js 加载视频 ,在MP4格式视频上传之后 我发现某些视频可以边加载边播放 但是有一些又不行,找了下原因是因为视频的元数据信息在第一帧的时候就 ...

  3. IIs上MP4、及SVG格式加载失败解决方式

    部署项目是遇到网页播放mp4文件时候,MP4文件不能加载的问题.那是因为IIS上MIME类型中没有添加MP4的格式,添加一下即可. 解决方案: 1.在IIS上选中你的网站,然后点击右边的MIME类型, ...

  4. jQuery第一课 加载页面弹出一个对话框

    <script type="text/javascript"> $(document).ready(function(){ alert("欢迎收看:" ...

  5. React Native 断点调试 跨域资源加载出错问题的原因分析

    写在前面 ————如果从头开始看还没解决,试试文章最后的绝招 闲来无事,折腾了一下React Native,相比之前,开发体验好了不少.但在真机断点调试那里遇到了跨域资源加载出错的问题,一番探索总算解 ...

  6. H5:加载原理,慢加载和卡顿原因分析,

    前端H5工作原理: 请求和显示原理 H5页面卡顿原因分析: 1.动画太多:渲染重绘占用GPU 2.页面操作导致重绘频繁 3.页面元素复杂:资源类标签太多(图像/视频/dom树太长) 4.内置webvi ...

  7. Android 4.X 系统加载 so 失败的原因分析

    1 so 加载过程 so 加载的过程可以参考小米的系统工程师的文章loadLibrary动态库加载过程分析 2 问题分析 2.1 问题 年前项目里新加了一个 so库,但发现native 方法的找不到的 ...

  8. cmd编译java程序出现:找不到或无法加载主类的原因以及解决办法 以及 给java的main方法传递args参数

    原因: 1.java源程序中没有主类main方法. 2.java源程序中包含有eclipse等IDE工具生成的package包. 解决办法(对应以上的原因): 1.运行含有main的类 2.将java ...

  9. 单个SWF文件loading加载详解(转)

    通过带宽查看器,可以看到SWF中每帧所占带宽状况.另外,我们还可以在Flash发布设置中,选择生成体积报告. 勾选这一项之后,发布flash时,会自动在fla目录中生成一个名为”文件名 Report. ...

随机推荐

  1. mysql琐碎操作杂记

    1.索引相关 查看表索引 show index from `user` 查看sql的执行计划 explain select * from where user 2.存储过程相关 查看存储过程 show ...

  2. [概率DP]相逢是温厚

    题意 有\(n\)场比赛,他每次等概率地选择一场,选择的比赛可能有没ac过的题,他一定会ac这次比赛中的某一道,并说我好菜啊.如果全ac过了,也会说我好菜啊.求期望说多少次我好菜啊. 注意题目中每场题 ...

  3. HDU-4578 Transformation(线段树的多种区间操作)

    http://acm.hdu.edu.cn/showproblem.php?pid=4578 Time Limit: 15000/8000 MS (Java/Others)    Memory Lim ...

  4. 论文翻译——Character-level Convolutional Networks for Text Classification

    论文地址 Abstract Open-text semantic parsers are designed to interpret any statement in natural language ...

  5. 染色dp(确定一行就可行)

    题:https://codeforces.com/contest/1027/problem/E 题意:给定n*n的方格,可以染黑白,要求相邻俩行”完全“不同或完全相同,对于列也是一样.然后限制不能拥有 ...

  6. iOS涂色涂鸦效果、Swift仿喜马拉雅FM、抽屉转场动画、拖拽头像、标签选择器等源码

    iOS精选源码 LeeTagView 标签选择控件 为您的用户显示界面添加美观的加载视图 Swift4: 可拖动头像,增加物理属性 Swift版抽屉效果,自定义转场动画管理器 Swift 仿写喜马拉雅 ...

  7. [LC] 106. Construct Binary Tree from Inorder and Postorder Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  8. [LC] 167. Two Sum II - Input array is sorted

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  9. 分辨率与px的关系

    此篇文章的目的用于打印套打的位置计算,顺便科普下知识: 1寸=2.54厘米 14寸=355.6毫米 15.6寸=39.624厘米=396.24毫米: 21寸=533.4毫米 21.7寸=551.18毫 ...

  10. 吴裕雄--天生自然python学习笔记:pandas模块DataFrame 数据的修改及排序

    import pandas as pd datas = [[65,92,78,83,70], [90,72,76,93,56], [81,85,91,89,77], [79,53,47,94,80]] ...