Android播放器sdk

概述

YaguPlayer 是一款基于 Android 平台的多媒体视频播放 SDK。它为 Android 的开发者提供了简单易用的接口,帮助开发者方便快捷、低门槛的实现多媒体播放功能的开发。它支持 HLS、RTMP、HTTP FLV、MP4 等多种流媒体播放格式,视频支持 h264 格式、音频支持 AAC 格式。

功能

支持 HLS、RTMP、HTTP FLV、MP4 等流格式

支持 h264+aac

支持 armv7、arm64

支持直播首帧秒开

支持弱网条件下的丢帧策略

支持多实例,支持 https

支持带切边的视频渲染模式

开发准备

环境要求

  • android 4.1(SDK API 16)及以上
  • Android Studio 3.5+
  • 支持 armeabi, armeabi-v7a 和 arm64-v8a

集成 SDK

  • 集成原内核引擎

    1. yaguplayer.aar yaguplayer-engine.aar放入 app/libs

    2. app/build.gradle 加入

      implementation (name: 'yaguplayer', ext: 'aar')
      implementation (name: 'yaguplayer-engine', ext: 'aar')
      

配置 App 权限

app/AndroidManifest.xml 中声明以下权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

如 targetSdkVersion >= 30

AndroidManifast.xml 的 application 中需要加 android:allowNativeHeapPointerTagging="false"

<application
  android:allowNativeHeapPointerTagging="false"
    ...

快速开发

开发步骤

1、在 xml 中使用 videoView

<com.mudu.yaguplayer.video.widget.media.MuduVideoView
    android:id="@+id/video_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center">
</com.mudu.yaguplayer.video.widget.media.MuduVideoView>

2、获取 VideoView,设置播放地址并播放

mVideoView = findViewById(R.id.video_view);
mVideoView.setUrl(url);
mVideoView.start();

3、跳转

mVideoView.seekTo(1000);

4、暂停

mVideoView.pause();

5、继续播放

mVideoView.resume();

6、退出释放

mVideoView.release();

事件通知

准备完成通知

 private IMediaPlayer.OnPreparedListener preparedListener = new IMediaPlayer.OnPreparedListener() {

        @Override
        public void onPrepared(IMediaPlayer iMediaPlayer) {

        }
    };

完成事件通知

 private IMediaPlayer.OnCompletionListener completionListener = new IMediaPlayer.OnCompletionListener() {

        @Override
        public void onCompletion(IMediaPlayer iMediaPlayer) {

        }
    };

播放错误通知

 private IMediaPlayer.OnErrorListener errorListener = new IMediaPlayer.OnErrorListener() {

        @Override
        public boolean onError(IMediaPlayer iMediaPlayer, int what, int extra) {
            Log.e("mVideoView", what+"  "+extra);
            return false;
        }
    };

播放事件通知

 private IMediaPlayer.OnInfoListener infoListener = new IMediaPlayer.OnInfoListener() {
        @Override
        public boolean onInfo(IMediaPlayer mp, int arg1, int arg2) {
            Log.e("mVideoView", arg1+"  "+arg2);

            switch (arg1) {
                case IMediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:
                    Log.e(TAG, "MEDIA_INFO_VIDEO_TRACK_LAGGING:");
                    break;
                case IMediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
                    Log.e(TAG, "MEDIA_INFO_VIDEO_RENDERING_START  ");
                    break;
                case IMediaPlayer.MEDIA_INFO_BUFFERING_START:
                    Log.e(TAG, "MEDIA_INFO_BUFFERING_START:");
                    break;
                case IMediaPlayer.MEDIA_INFO_BUFFERING_END:
                    Log.e(TAG, "MEDIA_INFO_BUFFERING_END:");
                    break;
                case IMediaPlayer.MEDIA_INFO_NETWORK_BANDWIDTH:
                    Log.e(TAG, "MEDIA_INFO_NETWORK_BANDWIDTH: arg1" + arg1 + "  arg2: " + arg2);
                    break;
                case IMediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:
                    Log.e(TAG, "MEDIA_INFO_BAD_INTERLEAVING:");
                    break;
                case IMediaPlayer.MEDIA_INFO_NOT_SEEKABLE:
                    Log.e(TAG, "MEDIA_INFO_NOT_SEEKABLE:");
                    break;
                case IMediaPlayer.MEDIA_INFO_METADATA_UPDATE:
                    Log.e(TAG, "MEDIA_INFO_METADATA_UPDATE:");
                    break;
                case IMediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBTITLE:
                    Log.e(TAG, "MEDIA_INFO_UNSUPPORTED_SUBTITLE:");
                    break;
                case IMediaPlayer.MEDIA_INFO_SUBTITLE_TIMED_OUT:
                    Log.e(TAG, "MEDIA_INFO_SUBTITLE_TIMED_OUT:");
                    break;
                case IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED:
                    Log.e(TAG, "MEDIA_INFO_VIDEO_ROTATION_CHANGED: " + arg2);
                    break;
                case IMediaPlayer.MEDIA_INFO_NETWORK_SPEED:
                    break;
                case IMediaPlayer.MEDIA_INFO_PKTSIZE:
                    break;
                case IMediaPlayer.MEDIA_INFO_AUDIO_RENDERING_START:
                    Log.e(TAG, "MEDIA_INFO_AUDIO_RENDERING_START:");
                    break;
                case IMediaPlayer.MEDIA_INFO_PLAY_DISCONTINUOUS:
                    Log.e(TAG, " getmessage MEDIA_INFO_PLAY_DISCONTINUOUS time = " );
                    break;
                case IMediaPlayer.MEDIA_INFO_DOMAINANALYTIC_TIME:
                    int time1 = arg2;
                    Log.e(TAG,"Test MEDIA_INFO_DOMAINANALYTIC_TIME = " + time1);
                    break;
                case IMediaPlayer.MEDIA_INFO_CONNECT_TIME:
                    int time2 = arg2;
                    Log.e(TAG,"Test MEDIA_INFO_CONNECT_TIME = " + time2);
                    break;
            }
            return false;
        }
    };

接口说明

MuduVideoView

功能:媒体播放器提供,提供播放封装

成员方法 功能
setUrl 设置播放地址
setVideoRadius 设置圆角
setOnlyPlayAudio 只播放音频(播放音频资源时使用)
setSpeed 调整播放速率(1:为正常速率)
setPTSInterval 设置PTS
seekTo 跳转到指定位置(毫秒)
isPlaying 是否正在播放
isError 是否播放错误
isPaused 是否播放暂停
getDuration 获取总进度
getCurrentPosition 获取当前进度
getScreenImage 获取截图
getNetSpeedText 获取网络速度(已格式化)
setAspectRatio 设置画面比例
start 开始播放
pause 暂停播放
resume 继续播放
release 释放播放器
setOnPreparedListener 注册视频准备完成通知 (开始播放监听)
setOnErrorListener 注册播放错误通知 (结束播放或播放错误-10000)
setOnInfoListener 注册播放信息通知
setOnCompletionListener 注册播放完成通知
setOnSeekCompleteListener 注册跳转完成通知

错误码说明

  • INFO
字段 说明
MEDIA_INFO_UNKNOWN 1 未知信息
MEDIA_INFO_STARTED_AS_NEXT 2 播放下一条
MEDIA_INFO_VIDEO_RENDERING_START 3 视频开始整备中,准备渲染
MEDIA_INFO_VIDEO_TRACK_LAGGING 700 视频日志跟踪
MEDIA_INFO_BUFFERING_START 701 开始缓冲中 开始缓冲
MEDIA_INFO_BUFFERING_END 702 网络带宽,网速方面
MEDIA_INFO_NETWORK_BANDWIDTH 703 缓冲结束
MEDIA_INFO_BAD_INTERLEAVING 800
MEDIA_INFO_NOT_SEEKABLE 801 不可设置播放位置,直播方面
MEDIA_INFO_METADATA_UPDATE 802
MEDIA_INFO_TIMED_TEXT_ERROR 900
MEDIA_INFO_UNSUPPORTED_SUBTITLE 901 不支持字幕
MEDIA_INFO_SUBTITLE_TIMED_OUT 902 字幕超时
MEDIA_INFO_VIDEO_INTERRUPT 10000 数据连接中断,一般是视频源有问题或者数据格式不支持,比如音频不是AAC之类的
MEDIA_INFO_VIDEO_ROTATION_CHANGED 10001 视频方向改变,视频选择信息
MEDIA_INFO_AUDIO_RENDERING_START 10002 音频开始整备中
MEDIA_INFO_AUDIO_DECODED_START 10003
MEDIA_INFO_VIDEO_DECODED_START 10004
MEDIA_INFO_OPEN_INPUT 10005
MEDIA_INFO_FIND_STREAM_INFO 10006
MEDIA_INFO_COMPONENT_OPEN 10007
MEDIA_INFO_VIDEO_SEEK_RENDERING_START 10008
MEDIA_INFO_AUDIO_SEEK_RENDERING_START 10009
MEDIA_INFO_MEDIA_ACCURATE_SEEK_COMPLETE 10100
MEDIA_INFO_NETWORK_SPEED 10003
MEDIA_INFO_PKTSIZE 10004
MEDIA_INFO_PLAY_DISCONTINUOUS 704
MEDIA_INFO_SNAP 705
MEDIA_INFO_DOMAINANALYTIC_TIME 706
MEDIA_INFO_CONNECT_TIME 707
  • ERROR
字段 说明
MEDIA_ERROR_UNKNOWN 1
MEDIA_ERROR_PLAY_STOP -10000 播放停止或失败
MEDIA_ERROR_SERVER_DIED 100 服务挂掉,视频中断,一般是视频源异常或者不支持的视频类型。
MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK 200 数据错误没有有效的回收
MEDIA_ERROR_IO -1004 IO 错误
MEDIA_ERROR_MALFORMED -1007
MEDIA_ERROR_UNSUPPORTED -1010 数据不支持
MEDIA_ERROR_TIMED_OUT -110 数据超时

添加混淆文件

proguard-rules.pro 文件下添加如下代码:

-keep class com.mudu.**{*;}
-dontwarn com.mudu.**

-keep class com.yagu.**{*;}
-dontwarn com.yagu.**

-keep class tv.danmaku.**{*;}
-dontwarn tv.danmaku.**

results matching ""

    No results matching ""