"今天又是充满希望的一天"

背景

最近在做一个视频播放的需求,因为比较简单,只需要实现基本的loading,播放,暂停等功能,所以就用Android系统的播放器MediaPlayer。本来开开心心打完了工,正偷偷给妹妹发微信,测试大姐拿着手机过来就噼里啪啦一顿输出

“啊,你们的视频加载怎么这么慢?!”

“你看看人家iOS就不这样,这样能上线吗?!”

我X,我测的时候明明好好的啊,怎么现在加载个视频就要30多秒。看着不断转圈圈的loading图,我心里大骂

“又tm有坑是吧”

为了不耽误各位男哥哥女哥哥的时间,直接上结论:视频元数据位置不对

???什么是视频元数据?哪里位置不对?你特么写技术文还要别人百度是吧?

别别别,听我解释

关键的一句话

实际项目中用到的视频格式大多是MP4,MP4格式的视频是由一个个Box组成的。这个Box可以理解为数据块。Box里面可以嵌套Box:

(如果哥哥们想自己体验一把, mac可以用MediaParaser, window用Mp4Info)

ftyp,moov,mdat就是Box的名字。这里需要重点关注的是moov和mdat两个Box。

moov就是视频的元数据,存放着视频的总体信息,时长啦,码率啦,宽高等等

mdat是具体的媒体数据,也就是我们播放的内容

下面这句话很关键

播放器获取到moov box才能开始播放视频!!!

播放器获取到moov box才能开始播放视频!!!

播放器获取到moov box才能开始播放视频!!!

这句话是这篇文章的核心。其他可以不管,这个起码要记住

所以关于播放器加载视频慢的原因,聪明的哥哥一定早就有答案了,继续看无非就是验证一下啦

原因

上面那张图是理想状态下视频box的位置。

但一些视频在压制的时候,会把moov box放在视频尾部,也就是mdat之后。这就造成播放器必须把整个视频下载完才能获取到moov box,然后才能播放。

相当于你和妹子去约会,刚见面老板说线上有问题让你解决,你哼哧哼哧解决完继续约会你看妹妹会不会当场跟你分手

方案一

直接原因是找到了。聪明的哥哥一定会提出另一个问题

既然moov box这么关键,为什么有的视频会把它放在最后呢?

这个我做了一下实验,发现ffmpeg在转换视频格式的时候,会默认把moov box放在视频尾部。我猜是ffmpeg转化完整个视频之后才能确切知道新视频的时长,码率等信息,所以顺手就把它放到新视频的末尾了。

ffmpeg其实也提供了移动moov box到视频头部的命令

ffmpeg -i input.mp4 -c copy -f mp4 -movflags faststart output.mp4

这不就是解决方案之一吗?

用新的视频一试,加载时间果然变成2~3秒了

真相大白!!!

方案二

正当我神清气爽准备再找妹妹交流感情之时,产品阿姨告诉我,我们视频有几万个,项目马上要上线了,谁给你时间一个个转换,你说啊,你说啊!!!

我就是个打工的.. 别骂我嘛..

实际开发中会有各种情况无法对视频源做修改,这时候我们只能自己想办法。

视频播放的前提是要获取到moov box,而视频源moov box在尾部,那么我们能不能

先请求视频的尾部获取到moov box,然后再从头请求视频呢?

当然可以。流媒体的请求并不是一次请求完成的,而是分片请求。 先发起一个http请求,读取响应body的开头,如果发现moov在开头就继续往下读mdat。如果没有发现,第二个请求直接读取文件末尾的数据,这样用两个请求也能获取到moov。这个方案要求服务端能支持Request-Range请求,也就是能通过Range直接读取文件尾部,不过一般的oss服务都支持。

这个方案可以耶!可是难道要我重写一遍MediaPlayer的请求??那我的妹妹怎么办?!

转念一想,这个问题应该很普遍,聪明的哥哥们一定已经填过坑了。于是我用ijkPlayer和exoPlayer分别测了一下,果然这两个播放器都已经对这种情况做了处理,直接替换就好。ijkPlayer的官方so库不支持https请求,于是最终采用了exoPlayer

耶!终于结束了!虽然妹妹早就不耐烦地不回我消息了,但我相信只要坚持对她好她一定会感动的。下个坑,我一定不会再让妹妹久等了

又有坑是吧——MediaPlayer加载视频为什么这么慢相关推荐

  1. Android之MediaPlayer加载视频慢

    问题:Android系统播放器MediaPlayer播放网络视频,加载慢...缓冲慢... 结论:视频元数据位置不对 简单解释就是,大部分的视频格式是MP4,MP4格式的视频是由一个个Box组成的.这 ...

  2. Unity AVPro Video 加载视频第一秒图片与例子

    使用AVPro Video 加载视频第一秒的图片 原理:使用AVPro Video插件的MediaPlayer mediaPlayer.OpenMedia(new MediaPath(url链接, M ...

  3. OpenCV中使用类VideoCapture加载视频和打开摄像头

    先直接上示例代码,然后对代码进行讲解. #!/usr/bin/env python # -*- coding: utf-8 -*- # 图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 248 ...

  4. Opencv step by step - 加载视频

    刚买了本 "学习Opencv" 这本书,慢慢看起来. 一开始就是加载视频了.当然了,首先你要有个视频 从这里下载了一个: tan@ubuntu:~$ wget http://www ...

  5. [html] 说说video标签中预加载视频用到的属性是什么?

    [html] 说说video标签中预加载视频用到的属性是什么? 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

  6. ajax视频播放,XMLHttpRequest加载视频并播放

    XMLHttpRequest加载视频文件2进制数据流到客户端,并使用video控件播放.结合XMLHttpRequest Level 2特性,可以使用XMLHttpRequest对象接受服务器端返回的 ...

  7. Opencv_视频/摄像头加载视频,并进行边缘检测

    代码演示 VideoCapture capture("C:/Users/fh/Videos/01.avi");是加载视频的路径,如果将路径改为0就可以加载摄像头. #include ...

  8. videojs 动态加载视频

    VideoJS dynamic source change via RESTful API 'Undefined' issue with changing RTMP source on compres ...

  9. vue 使用video加载视频进行展示,视频循环自动播放

    vue 使用video加载视频进行展示,视频循环自动播放loop autoplay <span v-else-if="item.prop === 'alarmVedio'"& ...

最新文章

  1. The Pediatric Cancer Genome Project   儿童癌症基因组计划
  2. OpenStack Neutron浅析(四)
  3. Darwin Stream server(DSS服务器)的Relay(中继/转发)设置
  4. 从零开始入门 K8s | etcd 性能优化实践
  5. ALEIDoc EDI(7)--IDoc Extension
  6. Windows控制台程序“选定模式”的问题
  7. Spring Aop面向切面编程自动注入
  8. Java tree set_Java TreeSet tailSet()方法
  9. fatal error C1083: 无法打开包括文件:dxtrans.h: No such file or directory
  10. 阿里每天究竟要抵御多少攻击
  11. java 比较器类_java常用类——比较器
  12. 【架构师】【数据库基础】【笔记 01】快速了解数据库系统的重要概念02
  13. devops开发运维一体化_进阶 | 中国电信系统集成公司:100% 应用 DevOps 理念,做好企业级行业应用...
  14. ddos应急处理_当遇到DDOS攻击的几种应对措施
  15. 今天看到了和我男朋友不一样的程序员!好帅哦!
  16. linux下创建svn仓库及用户
  17. 轻松精通数据库管理之道——运维巡检之六(作业运行情况)
  18. 翻译:图解HTTPS工作原理、秘钥、握手、HTTPS,SSL,TLS的区别、证书
  19. 软考常考知识点整理-项目风险管理计划
  20. Arduino uno读取mpu6050模块角度以及温度值

热门文章

  1. 免费在线app封装 云兔
  2. 【网络安全】Windows系统安全实验
  3. idea 代码提示忽略大小写
  4. SQL语句中的case when,decode的用法
  5. oracle的shutdown命令
  6. linux vim 查找或替换空格
  7. 环境配置【jdk-sdk】-开始adb新玩法
  8. word公式对齐小技巧
  9. 牛客小白月赛4 C 病菌感染 dfs
  10. 抖音服务器维护播放为零,抖音0播放怎么回事,抖音0播放是被屏蔽了吗,为什么抖音播放量一直都是0...