最近项目中要用于手机播放直播流,RTMP协议的视频。刚开始一顿蒙圈,这个和直播有什么区别。(以为需要用到大厂商的直播框架...)然后在网上找了好多视频播放框架。一开始集成的Android Vitamio。这个怎么说,确实很坑,确实能实现播放视频的功能,但是需要build的版本太低,无法兼容别的功能(eg:权限的管理,build版本必须在23一下,这个就很坑了)。果断的放弃了。再烂别的,中间也找了很多,最后用到的是:基于ijkplayer项目进行的播放器,jjdxm_ijkplayer。
项目地址:jjdxm_ijkplayer
简介:基于 ijkplayer 简单的 UI 界面 当前项目是基于 ijkplayer 项目进行的播放器界面 UI 封装。 是一个适用于 Android 的 RTMP 直播推流 SDK,可高度定制化和二次开发。特色是同时支持 H.264 软编/硬编和 AAC 软编/硬编。主要是支持 RIMP、HLS、MP4、M4A 等视频格式的播放。
关于jjdxm_ijkplayer就说这么多了。项目地址已经贴上了,大家可以在GitHub上自习的查看。
接下来就来说说我的集成步骤,并贴上相关的主意事项与代码:
先看下效果:(由于是直播湖南卫视的,所以我把底部的进度条给取消了。你们可以根据自己的UI,来改变界面)
首先导入项目:
在app的build中,加入
api project(':jjdxm-ijkplayer')
基本上就这些了,详细的过程就不说了。导入之后,将导入的项目中的相关版本改为与app的版本一致,以免发生冲突。
导入依赖:
// 根据需要支持去拓展,在jjdxm-ijkplayer中默认加入了armv7a的了
api 'com.dou361.ijkplayer-armv7a:jjdxm-ijkplayer-armv7a:1.0.0'
api 'com.dou361.ijkplayer-armv5:jjdxm-ijkplayer-armv5:1.0.0'
api 'com.dou361.ijkplayer-arm64:jjdxm-ijkplayer-arm64:1.0.0'
api 'com.dou361.ijkplayer-x86:jjdxm-ijkplayer-x86:1.0.0'
api 'com.dou361.ijkplayer-x86_64:jjdxm-ijkplayer-x86_64:1.0.0'
有可能在编译时,出现 找不到jjdxm-ijkplayer-armv7a包。不要慌~~
先将jjdxm-ijkplayer-armv7a依赖注释掉(导入的项目中可能也有,同样注释掉)
找到你下载的demon中的release 目录,其中有so文件,直接将其中的文件拷贝到app的libs目录中。
好了,大功告成,到这里就集成成功了。接下来就到了码代码的环节了。。。
ViewIjkplayerActivity:
package com.project.evaluationmobile.activity;
import android.content.Context;
import android.content.res.Configuration;
import android.os.PowerManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.dou361.ijkplayer.listener.OnShowThumbnailListener;
import com.dou361.ijkplayer.widget.PlayStateParams;
import com.dou361.ijkplayer.widget.PlayerView;
import com.project.evaluationmobile.R;
import com.project.evaluationmobile.util.MediaUtils;
public class ViewIjkplayerActivity extends AppCompatActivity {
private View rootView;
private PowerManager.WakeLock wakeLock;
private PlayerView player;
private String videoPath = "rtmp://58.200.131.2:1935/livetv/hunantv";
// private String videoPath = "rtmp://192.168.100.177:1935/live/test1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
rootView = getLayoutInflater().from(this).inflate(R.layout.simple_player_view_player, null);
setContentView(rootView);
/**常亮*/
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "liveTAG");
wakeLock.acquire();
player = new PlayerView(this, rootView)
.setTitle("这是标题")
.setScaleType(PlayStateParams.fitparent)
// 禁止双击(双击切换全屏)
.setForbidDoulbeUp(true)
// 隐藏菜单键
.hideMenu(true)
// 隐藏分辨率
.hideSteam(true)
// 隐藏全屏按钮
.hideFullscreen(true)
//隐藏中间播放按钮,ture为隐藏
.hideCenterPlayer(true)
// 隐藏屏幕旋转按钮
.hideRotation(true)
//是否隐藏bottonbar
// .hideBottonBar(true)
//是否隐藏上下bar
.hideControlPanl(false)
//是否仅仅为全屏
.setOnlyFullScreen(false)
//设置2/3/4/5G和WiFi网络类型提示 true为进行2/3/4/5G网络类型提示 false 不进行网络类型提示
.setNetWorkTypeTie(true)
//显示加载网速
.setShowSpeed(true)
// .pausePlay()// 暂停
//显示缩略图
.showThumbnail(new OnShowThumbnailListener() {
@Override
public void onShowThumbnail(ImageView ivThumbnail) {
// Glide.with(ViewIjkplayerActivity.this)
// // .load(R.mipmap.banner1)
// .load("http://pic2.nipic.com/20090413/406638_125424003_2.jpg")
// .placeholder(R.color.black)
// .error(R.color.bg_white)
// .into(ivThumbnail);
Glide.with(ViewIjkplayerActivity.this)
// .load(R.mipmap.banner1)
.load(R.color.black)
.placeholder(R.color.black)
.error(R.color.black)
.into(ivThumbnail);
}
});
player.setPlaySource(videoPath)
.startPlay();
}
@Override
protected void onPause() {
super.onPause();
if (player != null) {
player.onPause();
}
MediaUtils.muteAudioFocus(ViewIjkplayerActivity.this, true);
}
@Override
protected void onResume() {
super.onResume();
if (player != null) {
player.onResume();
}
MediaUtils.muteAudioFocus(ViewIjkplayerActivity.this, false);
if (wakeLock != null) {
wakeLock.acquire();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (player != null) {
player.onDestroy();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (player != null) {
player.onConfigurationChanged(newConfig);
}
}
@Override
public void onBackPressed() {
if (player != null && player.onBackPressed()) {
return;
}
super.onBackPressed();
if (wakeLock != null) {
wakeLock.release();
}
}
}
simple_player_view_player.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/app_video_box"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:orientation="vertical">
<com.dou361.ijkplayer.widget.IjkVideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<LinearLayout
android:id="@+id/ll_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:orientation="vertical">
<!-- 封面显示-->
<ImageView
android:id="@+id/iv_trumb"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:visibility="visible"/>
</LinearLayout>
<!--重新播放-->
<LinearLayout
android:id="@+id/app_video_replay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#33000000"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<!-- 播放状态-->
<TextView
android:id="@+id/app_video_status_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/small_problem"
android:textColor="@android:color/white"
android:textSize="14dp"/>
<ImageView
android:id="@+id/app_video_replay_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="8dp"
android:src="@drawable/simple_player_circle_outline_white_36dp"/>
</LinearLayout>
<!-- 网络提示-->
<LinearLayout
android:id="@+id/app_video_netTie"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#33000000"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:gravity="center"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:text="您正在使用移动网络播放视频\n可能产生较高流量费用"
android:textColor="@android:color/white"/>
<TextView
android:id="@+id/app_video_netTie_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/simple_player_btn"
android:gravity="center"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:text="继续"
android:textColor="@android:color/white"/>
</LinearLayout>
<!-- 最大试看时长提示-->
<LinearLayout
android:id="@+id/app_video_freeTie"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#33000000"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:gravity="center"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:text="试看时间已到请购买继续观看"
android:textColor="@android:color/white"/>
<TextView
android:id="@+id/app_video_freeTie_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:text="购买"
android:textColor="@android:color/white"/>
</LinearLayout>
<!--加载中-->
<LinearLayout
android:id="@+id/app_video_loading"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<ProgressBar
android:layout_width="50dp"
android:layout_height="50dp"
android:indeterminateBehavior="repeat"
android:indeterminateOnly="true"/>
<TextView
android:id="@+id/app_video_speed"
android:layout_width="wrap_content"
android:layout_marginTop="4dp"
android:layout_height="wrap_content"
android:gravity="center"
android:visibility="gone"
android:text="188Kb/s"
android:textColor="@android:color/white"/>
</LinearLayout>
<!-- 中间触摸提示-->
<include
layout="@layout/simple_player_touch_gestures"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
<!-- 顶部栏-->
<include layout="@layout/simple_player_topbar"/>
<!-- 底部栏-->
<include
layout="@layout/simple_player_controlbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"/>
<!--声音亮度控制-->
<LinearLayout
android:id="@+id/simple_player_settings_container"
android:layout_width="250dp"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:background="#80000000"
android:gravity="center_vertical"
android:orientation="vertical"
android:visibility="visible">
<LinearLayout
android:id="@+id/simple_player_volume_controller_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/qcloud_player_icon_audio_vol_mute"/>
<SeekBar
android:id="@+id/simple_player_volume_controller"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="150dp"
android:layout_height="wrap_content"/>
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/qcloud_player_icon_audio_vol"/>
</LinearLayout>
<LinearLayout
android:id="@+id/simple_player_brightness_controller_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:padding="5dp"
android:src="@drawable/qcloud_player_icon_brightness"/>
<SeekBar
android:id="@+id/simple_player_brightness_controller"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="150dp"
android:layout_height="wrap_content"/>
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/qcloud_player_icon_brightness"/>
</LinearLayout>
</LinearLayout>
<!--分辨率选择-->
<LinearLayout
android:id="@+id/simple_player_select_stream_container"
android:layout_width="150dp"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:background="#80000000"
android:gravity="center_vertical"
android:visibility="gone">
<ListView
android:id="@+id/simple_player_select_streams_list"
android:layout_width="150dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<ImageView
android:id="@+id/play_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginTop="8dp"
android:src="@drawable/simple_player_center_play"/>
</RelativeLayout>
可以根据自己的要求来定制界面。很多的api在GitHub上都有说明,可以仔细看。直播的时候,直接想地址换为自己的地址就可以了。目前的地址是湖南卫视的直播。
好了,到这里就结束了,有什么问题可以留言。相互学习,我也只是一个小白~~~