Android之MediaPlayer加载视频慢

这篇具有很好参考价值的文章主要介绍了Android之MediaPlayer加载视频慢。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

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

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

Android之MediaPlayer加载视频慢

下面这句话很关键

播放器获取到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文章来源地址https://www.toymoban.com/news/detail-412239.html

到了这里,关于Android之MediaPlayer加载视频慢的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt Qml 多媒体播放视频(MediaPlayer)遇到的问题及解决方法

    Qml 多媒体播放视频开发过程中遇到的问题,记录一下。 创建的Qt Quick Ui Prototype工程,视频播放正常。但是相同的代码在Qt Quick Application(compat)中却不能正常显示。 Qt Quick Ui Prototype目录结构 Qt Quick Application(compat) 目录结构 Qt Quick Ui Prototype 工程 这里没有什么需要注意的,按照

    2024年02月05日
    浏览(53)
  • 【学习】从零开始的Android音视频开发(3)——MediaPlayer的prepare/prepareAsync流程和start流程

    在之前的流程中我们没有从MediaPlayer生态上认识各类库之间的依赖调用关系 MediaPlayer部分头文件在frameworks/base/include/media/目录中,这个目录和libmedia.so库源文件的目录frameworks/av/media/libmedia/相对应。主要头文件有 IMediaPlayerClient.h、mediaplayer.h、IMediaPlayer.h、IMediaPlayerService.h、Med

    2024年02月03日
    浏览(47)
  • MediaPlayer音频与视频的播放介绍

    作者:向阳逐梦 Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。 它支持三种不同的媒体来源: 本地资源 内部的URI,比如你可以通过ContentResolve

    2024年02月11日
    浏览(43)
  • Android MediaPlayer 深入分析与实践

            MediaPlayer 是 Android 提供的一个强大的音视频播放类,它允许开发者在应用程序中嵌入音频和视频的播放功能。本文从 MediaPlayer 的概述、工作原理、使用方法以及优势与局限性等方面进行全面的分析,并结合实际代码示例来指导读者如何高效地使用该技术。     

    2024年04月09日
    浏览(68)
  • android原生MediaPlayer播放本地的m3u8

    遇到某个需求,需要播放百度网盘的视频。但是通过百度网盘的sdk获取到的视频url是由若干个ts片段组成的m3u8播放源。然后把这个m3u8的播放源放在本地,也就是说m3u8是一个本地播放源。那么如何去播放呢?这边引进一个http轻量级的服务器NanoHttpd。 目前市场上流行的播放器,

    2024年02月06日
    浏览(50)
  • android使用MediaPlayer播放raw目录下的mp3

    使用android自带的 MediaPlayer 播放 mp3 时,需要注意的几个点: ——初始化: MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.example_song); ——播放: mediaPlayer.start(); ——释放: mediaPlayer.stop(); mediaPlayer.release(); —— 错误监听: mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {    

    2024年02月13日
    浏览(51)
  • Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器

    Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器实例的示例: 上述代码中,使用 getInstance() 方法获取 AudioPlayer 的单例对象,参数传入 Context 对象。 在 getInstance() 方法中判断单例对象是否为空,如果为空则创建新的 AudioPlayer 对象,否则返回已有的单例对象。 这样

    2024年02月12日
    浏览(49)
  • 【VUE】解决图片视频加载缓慢/首屏加载白屏的问题

      在 Vue3 项目中,有时候会出现图片视频加载缓慢、首屏加载白屏的问题 通常是由以下原因导致的: 图片或视频格式不当:如果图片或视频格式选择不当,比如选择了无损压缩格式,可能会导致文件大小过大,从而影响加载速度。 页面中同时加载了大量的图片和视频,导致

    2024年02月16日
    浏览(37)
  • 【VUE】解决VU2项目图片视频加载缓慢/首屏加载白屏的问题

    前端项目中,有时候会出现图片视频加载缓慢、首屏加载白屏的问题 之前写了一篇在VU3项目中的解决方案, 现在讲一下在 Vue2 项目中的解决方法,方法思路都差不多,在代码示例上会有一些小差别 通常是由以下原因导致的: 图片或视频格式不当 :如果图片或视频格式选择

    2024年02月16日
    浏览(43)
  • 解决微信小程序视频加载过多黑屏问题

    先加载封面图,用户点击后再切换为视频标签 效果: js代码

    2024年02月12日
    浏览(229)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包