问题:Android系统播放器MediaPlayer播放网络视频,加载慢...缓冲慢...

结论:视频元数据位置不对

简单解释就是,大部分的视频格式是MP4,MP4格式的视频是由一个个Box组成的。这个Box可以理解为数据块。Box里面可以嵌套Box:

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

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

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

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

下面这句话很关键

播放器获取到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

Android之MediaPlayer加载视频慢相关推荐

  1. 又有坑是吧——MediaPlayer加载视频为什么这么慢

    "今天又是充满希望的一天" 背景 最近在做一个视频播放的需求,因为比较简单,只需要实现基本的loading,播放,暂停等功能,所以就用Android系统的播放器MediaPlaye ...

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

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

  3. Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较

    在android中的加载网络图片是一件十分令人头疼的事情,在网上有着许多关于加载网络图片的开源库,可以让我们十分方便的加载网络图片.在这里我主要介绍一下我自己在使用Volley, Picasso, U ...

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

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

  5. Android 高清加载巨图方案 拒绝压缩图片

    Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处:  http://blog.csdn.net/lmj623565791/article/details/49300989:  本文出自: ...

  6. Android类动态加载技术

    Android类动态加载技术 Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式 ...

  7. Android studio 使用心得(六)---android studio 如何加载.so文件

    2019独角兽企业重金招聘Python工程师标准>>> 之前一直没怎么注意,以为.so文件android为像eclipse一样直接加载,但是直到昨天我在android studio上 ...

  8. android 加载进度,Android实现图片加载进度提示

    本文实例为大家分享了Android实现图片加载进度提示的具体代码,供大家参考,具体内容如下 先上图: 实现原理: 第一个控件的实现原理是重写ImageView的onDraw()方法,利用Canvas的 ...

  9. Opencv step by step - 加载视频

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

最新文章

  1. 复制已有的Tomcat作为新的Tomcat,只需修改三个配置文件,五步操作,保证能正常运行!
  2. [应用][js+css3]3D盒子导航[PC端]
  3. spring boot+mybatisplus集成后访问项目接口404
  4. JavaScript实现squareMatrixRotation方阵旋转算法(附完整源码)
  5. 洛谷P3066 [USACO12DEC]逃跑的BarnRunning Away From…
  6. 模型评价 - 判断数据模型拟合效果的三种方法
  7. python列表分割_python列表分割
  8. 超70家影视传媒单位联合500余位艺人倡议:立即清理未经授权短视频
  9. Linux进程地址空间布局
  10. 3-unit2 高级网络配置
  11. 零基础CSS入门教程(26)–CSS按钮实例
  12. 新华三杯考前突击---Day2---IPV6技术篇
  13. 全新SQL Server教程
  14. 关于LNK2005 _main 已经在 某某某.obj 中定义的问题
  15. Android 仿微信实现语音聊天功能
  16. 粒子滤波(particle filtering)梳理
  17. android pcm文件大小_Android中的PCM设备
  18. 京北机房 怀来云交换数据中心主机托管
  19. matlab模式识别提取特征向量,一种基于小波特征向量提取的手机检测方法与流程...
  20. 服务器加cpu显示broadwell,英特尔新的Broadwell Xeon服务器CPU每个插槽可提供多达22个内核...

热门文章

  1. PHP春节倒计时代码,2021年美观的春节倒计时代码
  2. python做滴滴打车软件_手把手教你写滴滴打车 APP
  3. html 登录判断跳转页面跳转页面,js判断登录与否并确定跳转页面的方法
  4. 智能工厂元宇宙 工业互联网云平台的架构与功能解析
  5. memory_target和sga、pga的关系
  6. 【转】CPU个数,核心数,线程数
  7. Salesforce中国区解散,谁是替代的最佳选择?
  8. vscode读linux源码,vscode搭建linux内核开发环境
  9. android 微信分享出去的图片不显示或显示成应用图标
  10. web前端字体居中_css如何让文字居中?