ExoPlayer 开发者指导

作者: 大飛機 | 来源:发表于2015-06-09 17:22 被阅读44070次

    原文地址

    我的其他文章
    1.ExoPlayer源码浅析
    2.Android实现LED灯显示效果
    3.Picasso源码浅析
    4.一行代码实现RecyclerView的多选批量操作
    5.Android 图片网格布局控件
    6.PaperView:像纸一样折叠
    7.TabViewPager 很好用
    8.RecyclerView 学习笔记
    9.发布Library到JCenter可以这么简单

    Developer guide


    在Android设备中,播放视频和音乐是非常普遍的。Android框架提供了一个对于媒体的操作的最省代码的解决方案:MediaPlayer。它提供了低等级的媒体API,例如:MediaCodecAudioTrackMediaDrm,可以用于建立自定义媒体播放的解决方案。

    ExpPlayer是一个开源的,App等级的媒体API,它的开源项目包含了library和示例:

    Pros and cons


    ExoPlayer相较于MediaPlayer有很多很多的优点:

    • 支持动态的自适应流HTTP(DASH) 和 平滑流,任何目前MediaPlayer支持的视频格式(同时它还支持HTTP直播了(HLS),MP4,MP3,WebM,M4A,MPEG-TS 和 AAC).
    • 支持高级的HLS特性,例如正确处理 EXT-X-DISCONTINUITY 标签;
    • 支持自定义和扩治你的使用场景。ExoPlayer专门为此设计;
    • 便于随着App的升级而升级。因为ExoPlayer是一个包含在你的应用中的库,对于你使用哪个版本有完全的控制权,并且你可以简单的跟随应用的升级而升级;
    • 更少的适配性问题。

    值得注意的时,ExoPlayer同时有些缺点:

    • ExoPlayer的音频和视频组件依赖Android的 MediaCodec接口,该接口发布于Android4.1(API 等级16)。因此它不能工作于之前的Android版本。
    • ExoPlayer目前还不支持自动检查需要播放的媒体格式。应用需要知道他想要播放的媒体格式去构建一个ExoPlayer去播放媒体。这个问题已经在Issue #438解决。

    Library overview

    在ExoPlayer的库中最重要的类是ExoPlayer,这个类维护着播放器的全局状态,和正在播放的媒体特质,例如怎么获取到的媒体数据,它使怎么缓存或者它的格式。你可以以TrackRenderer类的方式通过ExoPlayer的prepare方法注入。

    ExoPlayer提供默认的音频和视频渲染器,利用了Android框架中的MediaCodecAudioTrach类。这两个都需要一个SampleSource对象中注入,用来实现媒体示例的播放。

    组件的注入在当前ExoPlayer库中是普遍存在的。图1展示了使用一个ExoPlayer来配置和播放MP4媒体流的高级对象模型。默认的音频和视频渲染器已经被注解到ExoPlayer中。一个叫ExtractorSampleSource类的实现被注解到渲染器中用于提供简单的媒体播放功能。DataSourceExtractor示例被注解到ExtractorSampleSource来支持加载媒体流和在被加载的数据中提取样板。在这个示例中DefaultUriDataSourceMp4Extractor被用于播放从URIs中导入的MP4流。

    图1.ExoPlayer中播放MP4的对象模型
    总的来说,ExoPlayer实例被用来注解支持开发者需求的组件,这个模型使定制播放器变得非常简单,并支持自定义组件。以下部分介绍了在这个模型图种三个最最重要的部分:TrackRender,SampleSourceDataSource

    TrackRenderer

    一个TrackRenderer播放特定类型的媒体,例如视频,音频和文字。ExoPlayer类在它的TrackRenderer上执行方法,使用单独的线程,因此,导致每种类型的媒体被渲染全局的播放位置,ExoPlayer库提供MediaCodecVideoTrackRenderer作为默认的实现用于渲染视频,MediaCodecAudioTrackRender渲染音频。两种实现都是利用Android的 MediaCodec 去解码每个媒体样本。他们可以处理所有Android设备支持的音频和视频格式(详细信息请看支持媒体类型)。ExoPlayer库也提供了一个渲染文本的渲染器TextTrackRenderer

    以下代码示例使用标准的TrackRenderer 实现视频,音频播放需要的步骤:

    //1.初始化播放器
    player = ExoPlayer.Factory.newInstance(RENDERER_COUNT);
    //2.构建渲染器
    MediaCodecVideoTrackRender videoRender = ...
    MediaCodecAudioTrackRender audioRender = ...
    //3.通过prepare注入渲染器
    player.prepare(videoRender,audioRender);
    //4.将surface传递到渲染器
     player.sendMessage(videoRender,MediaCodecVideoTrackRenderer.MSG_SET_SURFACE,surface);
    //5.开始播放
    player.setPlayWhenReady(true);
    ....
    player.release(); //当播放完成,别忘了释放!
    

    想看完整的例子,请在ExoPlayer demo app中查看PlayerActivity和DemoPlayer。其中详细的示范如何使用ExoPlayer实例,以及ActivitySurface`的生命周期。

    SampleSource

    库中提供标准的TrackRenderer实现需要SampleSource实例被注入到他们的构造方法中。一个SampleSource对象提供了格式信息,和被渲染的媒体样本。ExoPlayer库提供了一些不同类型的SampleSource实例:

    • ExtractorSampleSource - 用于MP3,M4A,WebM,MPEG-TS和AAC;
    • ChunkSampleSource - 用于DASH和平滑流的播放;
    • HlsSampleSource - 用于HLS 播放;

    后面的部分会详细介绍这些实例的使用。

    DataSource

    ExoPlayer库提供的标准的SampleSource实例是利用了DataSource来加载媒体数据的。各种类型的实现都放在upstream包种。最最多用到的实现是:

    • DefaultUriDataSource - 用于播放本地和网络媒体;
    • AssetDataSource - 用于播放应用中assets文件夹下的媒体。

    Traditional media playbacks


    Explayer库提供了ExtractorSampleSource用于播放传统格式的媒体,包括MP3,M4A,MP4,WebM,MPEG-TS和AAC,图1中展示了ExoPlayer播放MP4流的对象模型,以下代码展示了如何构造和实例化TrackRenderer

    DataSource dataSource = new DefaultUriDataSource(userAgent, null);
    Mp4Extractor extractor = new Mp4Extractor();
    ExtractorSampleSource sampleSource = new ExtractorSampleSource(
    uri, dataSource, extractor, 2, BUFFER_SIZE);
    MediaCodecVideoTrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(
    sampleSource, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT);
    MediaCodecAudioTrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource);
    

    每种类型的媒体格式都需要一个对应的解析器(Extractor)。在ExoPlayer库的extractor包种包含了不同类型的解析器,你可以实现你自己的解析器,如果库中不包含你需要的类型的话。

    ExoPlayer的示例代码中提供了一个完整的ExtractorRendererBuilder的示例。PlayerActivity使用它播放一些可用的视频。

    Adaptive media playbacks


    ExoPlayer 支持自适应流,即在播放的时候,根据网络状况自动调节视频质量。DASH,SmoothStreaming和HLS展示了自适应流技术。以上三种,媒体都是通过小块的方式加载(通常2到10秒的长度)。每当一块媒体被请求,客户端将会选择一种可能的规格。例如:如果网络情况比较好,客户端将选择高质量的规格,如果网络比较差则会低质量的。在两种技术中,视频和音频都需要被分割。

    DASH android SmoothStreaming

    ExoPlayer库通过ChunkSampleSource支持DASH和SmoothStreaming动态播放,即通过读取独立的媒体块。每个ChunkSampleSOurce需要一个ChunkSource通过构造方法注入进来。ChunkSource主要负责加载和读取样本来提供媒体块。DashChunkSource类使用FMP4和WebM容器格式来提供DASH播放。SmoothStreamingChunkSource类使用FMP4容器格式。

    两种类型的ChunkSource实例需要一个解析器FormatEvaluator和一个数据源DataSource通过构造的方式注入。FormatEvaluator在每个块被加载之前选择一种可用的格式,DataSource提供数据源。最终,ChunkSampleSource需要一个LoadControl对象去控制缓冲块。
    图2演示了DASH动态播放通常的配置。通过FormatEvaluator实现视频质量的动态变化,但是音频的质量是固定的。

    图2:DASH动态播放对象模型

    这部分动态视频流暂时用不着,以后有机会翻译...


    Player events


    在播放阶段,你的App可以收到所有ExoPlayer产生的时间,这些事件对于提升用户体验有很大的帮助,如对播放的控制。一些ExoPlayer组件还提供了他们自己底层的事件,可以监听性能。

    High level events

    ExoPlayer允许通过addListener()removeListener()的方式添加ExoPlayer.Listener实例,被注册的监听器将会得到播放状态的回调,还要错误导致的播放失败,如果需要知道更多的播放状态和可能的状态直接的相互转换,请查阅ExoPlayer源码。

    Low level events

    除了高级事件,个别的组件还允许监听他们自己的时间,例如,MediaCodecVideoTrackRenderer的构造方法提供了MediaCodecVideoTrackRenderer.EventListener。在ExoPlayer的demo中,这给PlayerAcitivity调整目标surface的尺寸到合适的高度和宽度的途径。

    @Override
    public void onVideoSizeChanged(int width, int height, float pixelWidthAspectRatio) {
      surfaceView.setVideoWidthHeightRatio(
          height == 0 ? 1 : (width * pixelWidthAspectRatio) / height);
    }
    

    Customization


    懒得翻译了...

    转载请注明出处:
    http://www.jianshu.com/p/3251a5189f56

    相关文章

      网友评论

      • 迎刃:哈喽,麻烦问一下,ExoPlayer 这个软件有可以直接使用的安装版本了么?
      • 74cf8659ae9a:不错不错,收藏了。

        推荐下,分库分表中间件 Sharding-JDBC 源码解析 17 篇:http://t.cn/R0UfGFT


      • 文武锅:已经支持了jcenter仓库但是依旧Failed to resolve这个是什么原因
      • 3f270e490cb7:ExoPlayer对点播的支持非常友好,直播这块,可以参考 https://github.com/daniulive/SmarterStreaming
      • 3f270e490cb7:exoplayer做点播不错,而且不支持rtmp,如果直播的话可以看看 https://github.com/daniulive/SmarterStreaming
        大飛機:@对面的你 去你妈的
      • 048f398ea7b5:请问支持H.264裸流的播放吗?
      • 464c0fdd405d:大佬,现在遇到个问题,以前在service上写媒体类实例的时候可以在onDestroy方法上释放资源,现在我不在上面写了,又该在什么情况下去释放资源呢?
      • 七月未央君:app从后台返回到前台时会出现卡顿的问题,怎么解决呀,报错:ExtendedCodec: Failed to set frame packing format on component
      • 熬八马:你好,mediaplayer支持mp4v格式,而是用exoplayer的话就只有声音没有视频,有解决办法吗?
      • 我是李戴表:博主 请问exoplayer 播放音频文件 如果网络不稳定 在网络好的时候 会自动重连吗 。查了很多 没有相关的知识
      • chrc:楼主,当MediaSource有多个的时候,exoplayer在切换播放时会有卡顿,请问能消除么
      • packll:这个库分别渲染的话音视频同步是怎么做到的
      • Zokoo:谢谢分享。从guide上看,Exoplayer直接使用了mediacodec。如果想添加视频软解码支持,比如国内的AVS,AVS+,请问有什么好的办法不?
      • bdb6bf9183c5:支持 rtsp么,还有tcp方式的视频流
      • 0d6eb4d5b9b6:楼主大大,想问一下你有没有裁剪过 这个Library?
      • cc8fce6b8d12:楼主,请问我想得到视频流该怎么弄
      • ffefcf9738c8:楼主,请问支持视频分割么?
      • 惊魂甫定送:楼主,请问支持倍速播放吗 ,慢放,快放啥的。
        大飛機:@惊魂甫定送 原生不支持
      • KoreaHank:注册个账号给你点个赞~
        大飛機:@KoreaHank Thank u
      • 3452e7a96dbd:卤煮,有github地址吗
        安卓猿:https://github.com/google/ExoPlayer
      • Felix_lin:请问支持自定义视频渲染器吗
        大飛機:@Fmer_lin 支持
      • 紫豪:您好,请问本地视频播放怎么用啊?
        紫豪:@goyourfly 能留个企鹅交流下吗?
        紫豪:@goyourfly 我获取了Assets下的mp4文件的InputStream,然后写入到文件中,最后根据Uri.formFile(file)获取对应的Uri,但是怎么不能正常播放呢?
        大飛機:@紫豪 Uri.fromFile(file:File);
      • 谭冉冉:您好,它支持边下边播的缓存吗?
        chrc:@谭冉冉 可以缓存到本地文件的
      • 7f268a17fa91:播放ts 格式视频没有时间进度,问题处在哪里
        大飛機:@7f268a17fa91 不太清楚,可能是ExoPlayer解析器读取不到视频总时长吧,你可以试着把ExoPlayer的项目Clone下来,在相关的地方加日志测试一下
      • 一起睡个觉:支持列表播放吗,类似于今日头条。
        大飛機:@zxy_it 没有试过,如果及时的释放播放器应该不会
        一起睡个觉:@goyourfly 我的意思是,如果放到ListView里面,适合吗,会出现内存不足的情况吗。
        大飛機:@zxy_it 这个跟播放器本身没有关系吧
      • c1060cc069b6:很实用
      • devzhaoyou:写的非常好,感谢分享!!
        大飛機:@DuckBill 谢谢
      • xtl1889:MediaCodecVideoTrackRender videoRender = ...
        是什么意思?????
      • dc7fe5dcc690:支持udp吗
        大飛機:@飞飞飞1 支持:https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer/upstream/UdpDataSource.html
      • 桃子爸比:能问下支持本地播放吗?有本地播放的例子吗
        紫豪:@抓住那只大金毛 请问本地播放的用法是怎么整?我使用的Demo中,传入对应文件的URI貌似不可以啊,我参考的是https://github.com/google/ExoPlayer/tree/master/demo这个
        抓住那只大金毛:@Mr何员外 可以本地播放。。很快
      • 夜落乌啼:博主,能问下,ExoPlayer是否支持内嵌的多音频多字幕?

      本文标题:ExoPlayer 开发者指导

      本文链接:https://www.haomeiwen.com/subject/sqxjqttx.html