前言

前段时间的工作安排,需要做一个视频监控的功能,其实就是采用 m3u8 做一个直播。

确定需求后进行了一堆调研,最后在B站的 ijkplayer 与 Google 的 ExoPlayer 中做出了选择,对于为啥选择了 ExoPlayer ,后面会做具体分析,目前先留点悬念,目前根据选择 ExoPlayer,从最初调研到集成成功打算做一个专题,分别从众多框架中为何选择了 ExoPlayer、硬解码与软解码的区别和对比、自定义 ExoPlayer、集成中所遇到的坑、源码分析,作为开头第一篇,目前只是一篇短暂的集成,并附上大量的注释,具体不做太多分析。

项目相关地址

ExoPlayer 源码地址:https://github.com/google/ExoPlayer

ExoPlayer api地址:http://google.github.io/ExoPlayer/doc/reference/

ExoPlayer 开发者指南:https://google.github.io/ExoPlayer/guide.html

优点和缺点

相比 Android 内置的 MediaPlayer,ExoPlayer 具有许多优于优势:

  • 支持 Dynamic Adaptive Streaming over HTTP (DASH) 和SmoothStreaming进行动态自适应流,这两种都不受 MediaPlayer 支持,还支持许多其它格式。有关详细信息,请参考开发者指南。
  • 支持高级 HLS 功能,如正确处理 #EXT-X-DISCONTINUITY的标签。
  • 能够无缝融合,连接和循环媒体资源。
  • 自定义和扩展播放器以适应您的用例的能力。 ExoPlayer专门设计了这一点,并允许许多组件被替换为自定义实现。
  • 轻松更新播放器与您的应用程序。 因为 ExoPlayer 是您的应用程序apk中包含的库,所以您可以控制使用哪个版本,你可以轻松地将其更新为常规应用程序更新的一部分。
  • 设备通用性更强。
  • 支持在Android 4.4(API级别19)以上的Widevine通用加密。

需要注意的是,也有一些缺点,这一点很重要:

  • ExoPlayer的标准音频和视频部件依赖于Android的 MediaCodecAPI,MediaCodecAPI 在搭载Android 4.1(API级别16)发布。因此,他们不会在较早版本的 Android 的工作。Widevine 的通用加密可以在 Android 4.4(API级别19)和更高。

附上原文

Pros and consExoPlayer has a number of advantages over Android’s built in MediaPlayer:
  • Support for Dynamic Adaptive Streaming over HTTP (DASH) and SmoothStreaming, neither of which are supported by MediaPlayer. Many other formats are also supported. See the Supported formats page for details.
  • Support for advanced HLS features, such as correct handling of#EXT-X-DISCONTINUITY tags.
  • The ability to seamlessly merge, concatenate and loop media.
  • The ability to update the player along with your application. Because ExoPlayer is a library that you include in your application apk, you have control over which version you use and you can easily update to a newer version as part of a regular application update.
  • Fewer device specific issues and less variation in behavior across different devices and versions of Android.
  • Support for Widevine common encryption on Android 4.4 (API level 19) and higher.
  • The ability to customize and extend the player to suit your use case. ExoPlayer is designed specifically with this in mind, and allows many components to be replaced with custom implementations.
  • The ability to quickly integrate with a number of additional libraries using official extensions. For example the IMA extension makes it easy to monetize your content using the Interactive Media Ads SDK.

It’s important to note that there are also some disadvantages:

  • ExoPlayer’s standard audio and video components rely on Android’sMediaCodec API, which was released in Android 4.1 (API level 16). Hence they do not work on earlier versions of Android. Widevine common encryption is available on Android 4.4 (API level 19) and higher.

**

支持的格式

**

ExoPlayer支持播放DASH,SmoothStreaming和HLS自适应流,以及如MP4,M4A,FMP4,WebM,MKV,MP3,Ogg,WAV,MPEG-TS,MPEG-PS,FLV和ADTS (AAC)。

集成

先上代码在做分析,首先导入ExoPlayer需要的包:

compile 'com.google.android.exoplayer:exoplayer:r2.4.1'

xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.exoplayer2.ui.SimpleExoPlayerView
    xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/player_view"android:layout_width="match_parent"android:layout_height="match_parent"android:focusable="true" />

是的,就这么短,Google考虑得很全面,提供了exoplayer2-ui的包,给开发者省去了很多事情。

核心代码如下:

/*** 播放器页面** Created by Zero on 2017/9/16.*/
public class ExoPlayerActivity extends AppCompatActivity {@BindView(R.id.player_view)SimpleExoPlayerView playerView;private SimpleExoPlayer player;/*** 网上找的一个m3u8地址*/private static  final String url = "http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_exo_player);ButterKnife.bind(this);initPlayer();}private void initPlayer(){/*** Provides estimates of the currently available bandwidth.*/BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);/*** TrackSelector用来选择磁道,由MediaSource所提供,并会被任意的可用的Renderers所使用,当播放器被创建时,TrackSelector会被注入.*/TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);/*** SimpleExoPlayer单例*/player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);/*** 设置用户控制,其实就是屏幕上的功能按钮,默认显示,false则不显示,设置false后可自定义** 源码中:Sets whether the playback controls can be shown. If set to {@code false} the playback controls* are never visible and are disconnected from the player.** @param useController Whether the playback controls can be shown.*/playerView.setUseController(true);playerView.requestFocus();/*** 将播放器添加到视图*/playerView.setPlayer(player);Uri uri =Uri.parse(url);/*** Estimates bandwidth by listening to data transfers*/DefaultBandwidthMeter bandwidthMeterA = new DefaultBandwidthMeter();/*** PS:* DefaultUriDataSource - 用于播放本地和网络媒体;* AssetDataSource - 用于播放应用中assets文件夹下的媒体。*/DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "ExoPlayerDemo"), bandwidthMeterA);/*** ExoPlayer每帧是通过MediaSource展示的,播放的每一帧必须先创建对应的MediaSource** MediaSource 定义了加载、播放媒体,并且可以读取已经加载的媒体,使用ExoPlayer.prepare 可在播放开始传入MediaSource*/MediaSource videoSource = new HlsMediaSource(uri, dataSourceFactory, 1, null, null);/*** 无缝循环播放视频*/LoopingMediaSource loopingSource = new LoopingMediaSource(videoSource);player.prepare(loopingSource);/*** 开始播放*/player.setPlayWhenReady(true);}
}

就这么简单?是的,现在一个播放器就这么搞定了,亲测可以,来张图证明下:

好了,就这么搞定一个 m3u8 格式的视频直播,上述也说了,支持的格式很多,可根据不同的格式做出相应的处理,主要是对MediaSource(DashMediaSource),SmoothStreaming(SsMediaSource),HLS(HlsMediaSource)和常规的媒体文件(ExtractorMediaSource)做出相应的处理,在此不做多余的赘述,敬请期待,^_^。

友情推荐:

快速集成一个视频直播功能相关推荐

  1. iOS 快速集成ijkplayer视频直播与录播框架

    最近由于需求的变动,项目内把最初最简单的原生直播框架变成了B站开源的ijkplayer框架,下面把具体的过程总结一下整个过程都比较简单,重要的是理解的过程,集成完毕之后,视频的用户体验比苹果原生好了很 ...

  2. 短视频app开发:如何实现视频直播功能

    短视频源码的实现 在短视频app开发中,实现视频直播功能需要借助短视频源码.短视频源码可以提供一个完整的视频直播功能模块,包括视频采集.编码.推流等.因此,我们可以选择一些开源的短视频源码,例如LFL ...

  3. 在线教育系统网页版,观看视频直播功能更多,更适合用户学习

    与传统教育相比,线上教育是一种更符合如今社会大背景的教育模式,在强大的互联网技术的支撑下,让教育与学习突破时间与空间的限制,更具开放性.交互性.自主性的优势,且根据系统平台的不同功能,又能实现教育的异 ...

  4. HTML5实现视频直播功能思路详解

    HTML5实现视频直播功能思路详解 最近视频直播比较火,发现目前 WEB 上主流的视频直播方案有 HLS 和 RTMP,移动 WEB 端目前以 HLS 为主,PC端则以 RTMP 为主实时性较好,接下 ...

  5. D1net阅闻:Facebook视频直播功能正式开放

    Apple收购K12数据分析工具LearnSprout Apple公司称已经收了教育科技创业公司LearnSprout,后者主要提供K12数据分析工具,Apple并未透露收购价格和具体目的.Learn ...

  6. iOS中 视频直播功能-流媒体的使用(详解)韩俊强的CSDN博客

    上一篇博客:(流媒体实现视频播放和下载功能):http://blog.csdn.net/qq_31810357/article/details/50574914 最近视频直播功能比较火,处于需求,研究 ...

  7. video.min.js php,使用flv.js与video.js做一个视频直播效果

    这次给大家带来使用flv.js与video.js做一个视频直播效果,使用flv.js与video.js做出视频直播效果的注意事项有哪些,下面就是实战案例,一起来看一下. 环境配置 首先运行livego ...

  8. 阿里社交软件“点点虫”推“24小时”视频直播功能

    月6日消息,主打阅后即焚的阿里社交软件"点点虫"发布新版本,推出"24小时"视频直播功能,提供朋友间及达人圈的图片和视频共享服务,所有内容只能在24小时内重复播 ...

  9. iOS 集成ijkplayer视频直播框架

    上篇文章我刚介绍了ffmpeg的编译及基于它的kxmovie实现视频播放,但前两天刚看到一个视频直播软件bilibili,发现它用的B站的一个开源框架ijkplayer.ijkplayer 是一款做视 ...

  10. 深度解读:阿里云视频直播功能升级

    2022年注定是体育超级大年,冬奥.亚运会.大运会.世界杯等各类大型体育赛事应接不暇.随之而来便是各类赛事直播,客户对直播服务要求变得越来越高,视频直播技术创新显得格外重要.如何利用直播技术创新降低线 ...

最新文章

  1. 招聘 | 旷视研究院博士后招聘
  2. pandas 绘图 机器学习看特征相关性
  3. Entity Framework 数据部分更新之Attach Detach
  4. Facebook市值赶超股神巴菲特公司 全美排名第五
  5. MyBatis知多少(10)应用程序数据库
  6. JVM监控-命令行篇
  7. 了解零信任-SDP关系
  8. oracle 服务管理,管理 Oracle 内容服务类别
  9. Bootstrap+MetroNic_1.5.4 Head meta
  10. modbus-tcp qt4-socket ---------micro2440 as device
  11. 关于“我的藏书阁:.NET/数据库应用开发”的几点看法。
  12. 好书推荐!从事数据挖掘、数据分析必看的书!
  13. 【ROS】编译软件包packages遇到进度缓慢或卡死,使用swap
  14. FUP AMD300-27便携式拉曼食品安全分析仪 检测微痕量农兽药残留 非法添加
  15. 如何让背景图片居中?
  16. linux下搭建ecshop教程,linux下安装ecshop,
  17. 强制修改服务器时间,修改服务器时间脚本
  18. 戴尔r330服务器怎么用u盘装系统,怎么用U盘装系统
  19. rasp 系统_RASP研发踩坑之 解释器与编译器
  20. 提取DWI数据的FA和MD

热门文章

  1. [转载]每天早晨含姜片含出三大奇迹/姜的二十种食疗功/生姜克
  2. ios图片放大之后如何不模糊_图片放大后模糊怎么办 怎么放大图片不失真|放大图片保持清晰度的方法...
  3. 重新理解泰勒公式 牛顿法
  4. 如何在PDF文件中提取图片?PDF图片提取教程
  5. win10+Ubuntu20.04双系统安装
  6. 快速排序qsort函数的compar参数
  7. ElementUI修改Dialog的标题样式
  8. 微信群二维码被动加了100人了还怎么扫码进入?
  9. 流行编曲(6)副旋律&合声
  10. php对接抖音快手小红书短视频去水印接口的代码