android exoplayer 直播流,android – Exoplayer自适应hls流媒体
开始使用ExoPlayer的最简单方法是将其添加为gradle依赖项.您需要确保在项目的根目录中的build.gradle文件中包含jcenter存储库:
存储库{
jcenter()
}
接下来,在模块的build.gradle文件中包含以下内容:
编译’com.google.android.exoplayer:exoplayer:r2.2.0′
1.您的布局文件
android:id="@+id/activity_main"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
app:resize_mode="fill"/>
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"/>
2.你的班级档案(活动)
public class VideoPlayerActivity extends AppCompatActivity implements ExoPlayer.EventListener {
private SimpleExoPlayerView simpleExoPlayerView;
private String hlsVideoUri = "http://playertest.longtailvideo.com/adaptive/bbbfull/bbbfull.m3u8";
private SimpleExoPlayer player;
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_player);
// 1. Create a default TrackSelector
Handler mainHandler = new Handler();
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
// 2. Create a default LoadControl
LoadControl loadControl = new DefaultLoadControl();
// 3. Create the player
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view);
simpleExoPlayerView.setPlayer(player);
// Measures bandwidth during playback. Can be null if not required.
DefaultBandwidthMeter defaultBandwidthMeter = new DefaultBandwidthMeter();
// Produces DataSource instances through which media data is loaded.
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
Util.getUserAgent(this, "Exo2"), defaultBandwidthMeter);
// Produces Extractor instances for parsing the media data.
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
// This is the MediaSource representing the media to be played.
HlsMediaSource hlsMediaSource = new HlsMediaSource(Uri.parse(hlsVideoUri), dataSourceFactory, mainHandler, new AdaptiveMediaSourceEventListener() {
@Override
public void onLoadStarted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs) {
}
@Override
public void onLoadCompleted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded) {
}
@Override
public void onLoadCanceled(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded) {
}
@Override
public void onLoadError(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded, IOException error, boolean wasCanceled) {
}
@Override
public void onUpstreamDiscarded(int trackType, long mediaStartTimeMs, long mediaEndTimeMs) {
}
@Override
public void onDownstreamFormatChanged(int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaTimeMs) {
}
});
player.addListener(this);
player.prepare(hlsMediaSource);
simpleExoPlayerView.requestFocus();
player.setPlayWhenReady(true);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
}
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
}
@Override
public void onLoadingChanged(boolean isLoading) {
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
switch (playbackState) {
case Player.STATE_BUFFERING:
//You can use progress dialog to show user that video is preparing or buffering so please wait
progressBar.setVisibility(View.VISIBLE);
break;
case Player.STATE_IDLE:
//idle state
break;
case Player.STATE_READY:
// dismiss your dialog here because our video is ready to play now
progressBar.setVisibility(View.GONE);
break;
case Player.STATE_ENDED:
// do your processing after ending of video
break;
}
}
@Override
public void onPlayerError(ExoPlaybackException error) {
AlertDialog.Builder adb = new AlertDialog.Builder(VideoPlayerActivity.this);
adb.setTitle("Could not able to stream video");
adb.setMessage("It seems that something is going wrong.\nPlease try again.");
adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish(); // take out user from this activity. you can skip this
}
});
AlertDialog ad = adb.create();
ad.show();
}
@Override
public void onPositionDiscontinuity() {
}
@Override
protected void onPause() {
super.onPause();
if (player != null) {
player.setPlayWhenReady(false); //to pause a video because now our video player is not in focus
}
}
@Override
protected void onDestroy() {
super.onDestroy();
player.release();
}
}
我认为这对初学者来说已经足够了.另请注意,此库的标准音频和视频组件依赖于Android的MediaCodec API,该API是在Android 4.1(API级别16)中发布的.因此它不适用于Android 4.0及更低版本.
不要忘记将此权限添加到清单文件中:
< uses-permission android:name =“android.permission.INTERNET”/>
android exoplayer 直播流,android – Exoplayer自适应hls流媒体相关推荐
- LiveNVR配置拉转RTSP传统海康大华安防摄像机直播流输出RTSP/RTMP/HLS/HTTP-FLV如何获取直播流地址
LiveNVR配置拉转RTSP传统海康大华安防摄像机直播流输出RTSP/RTMP/HLS/HTTP-FLV如何获取直播流地址 1. Onvif/RTSP流媒体服务 2.配置拉转直播流 2.1 RTSP ...
- android 播放直播流,【报Bug】video组件播放直播流无法重连 android app
详细问题描述 android app nvue页面使用video播放直播流视频(非普通在线视频),切换网络会导致视频一直缓冲无法继续播放,一直触发@error事件,只用用4g或者wifi均可正常播放, ...
- Android判断直播结束,Android 直播打断事件处理
打断事件处理 1 简介 使用 ZegoLiveRoom SDK 直播过程中,可能会被来电.切后台等事件打断,此时开发者需要处理打断事件. SDK 提供了与音频打断事件相关的API,如下所示: /** ...
- android 图片文件流,Android 如何以流的方式读取图片文件
在读取sdcard中的图片文件时,如何以流的方式读取图片文件,请参阅下面的函数: public static void ShowImg(String uri, ImageView iv) throws ...
- android 关闭直播视频,Android WebView无法播放视频或直播,关闭界面后任在播放的问题;...
1.设置webview属性: webView.setWebChromeClient(new MyWebChromeClient()); webSettings = webView.getSetting ...
- android 横屏直播界面,Android安卓腾讯云互动直播随心播横屏的实现方式1.8.2
研究过腾讯云互动直播的人,估计很心烦,这能横屏吗?官方说:暂时不支持.二线客户说,有人做出来了.但是 这东西到底怎么横屏呢? 鉴于笔者研究了一天时间,终于做出来了,发表一片博客,为在腾讯云中爬坑的人垫 ...
- android最新直播框架,Android直播类框架
释放双眼,带上耳机,听听看~! 直播 KingTV jjdxm-ijkplayer 直播相关开源框架 compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:1.0 ...
- Vue项目中播放直播流
直播流播放协议 视频直播服务支出输出RTMP.FLV.HLS三种协议 阿里云视频直播 RTMP(Real Time Message Protocol:实时消息传输协议)延时低(1s~3s),TCP长连 ...
- php安卓直播抓取,hls,android_安卓大部分浏览器播放HLS协议直播流会从头开始,hls,android,ffmpeg,m3u8 - phpStudy...
安卓大部分浏览器播放HLS协议直播流会从头开始 遇到的问题 HLS直播流在iOS系统中表现正常, 但在安卓使用大部分浏览器(UC浏览器除外)播放ffmpeg生成的HLS直播流都会发生从头播放的问题, ...
- android4.4 hls,Android VideoView直播电视流(HLS)
我试图开发电视流(HLS)的应用程序.使用下面的代码我测试了2.3.3,3.0和4.0.1版Android设备上的流,但遇到了几个问题. 在Android 2.3.3上,播放时间大于1分钟,然后停止播 ...
最新文章
- idea 在tomcat中部署的时候 莫名其妙的错误
- Mac 开发中如何设置 关闭 以及最小化 最大化按钮事件处理
- C++一天一个程序(七)
- 很用心的为你写了 9 道 MySQL 面试题,建议收藏!
- python+requests接口测试基础
- SAP License:SAP学习笔记
- REPNZ SCANS
- winserver 08 64位安装sql05 64位提示asp版本注册
- python opencv 身份证照片识别,包含正面、反面(附完整代码,可直接使用)
- Newtonsoft.Json.dll 的使用
- 转载多线程下载(HTTPWebRequest)
- nosqlbooster pojie
- 总结SSL/TLS协议运行机制
- 《通天秘笈》学习笔记
- python取省边界_提取行政区边界经纬度坐标(高德+百度)
- 2012年华为杯校园编程大赛决赛 类别:软件C/C++语言
- 实验记录 | BWA的安装
- java微信扫码登录代码在这里
- 【暴力枚举】速算游戏 fun.pas/c/cpp
- DB-Engines 5月数据库排名:MySQL或将超越Oracle?