Android 实现基于RTMP视频播放

最近项目中要用于手机播放直播流,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上都有说明,可以仔细看。直播的时候,直接想地址换为自己的地址就可以了。目前的地址是湖南卫视的直播。

 

好了,到这里就结束了,有什么问题可以留言。相互学习,我也只是一个小白~~~

 

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值