产品文档 点播技术文档 Android 点播core 2.0

Android点播Core SDK2.0集成文档

changeLog

简介

百家云Android点播回放core sdk2.0是一个集点播和回放于一体的无UI纯实现的代码集,点播功能包括在线视频、离线下载、离线播放, 底层采用ijkplayer。回放功能依赖点播播放器之外还包含PPT、聊天消息等模块,百分百还原直播场景,同时也支持离线下载和播放。您可以方便地添加到您自己的app当中。推荐使用Android Studio集成。

2.0将点播和回放SDK合并,如果需要1.x版本的文档请前往以下页面。

1.x版本点播Core文档链接

功能描述

SDK支持Android4.1(api level 16)及以上

功能 描述
在线播放 支持百家云后台配置视频播放
离线播放 支持本地视频绝对路径,加密和不加密详见视频缓存模块
自定义界面 sdk仅提供原始界面,用户需参考UI SDK自定义实现
视频缓存 支持百家云后台配置视频的缓存功能

示例工程

竖屏
github链接:http://git.baijiashilian.com/open-android/VideoPlayer2.0Demo(apk在apk_bin目录下)

集成SDK

集成前的准备

1)推荐使用最新版Android studio集成SDK 点击下载(需科学上网)
2)在工程根目录下build.gradle添加远程仓库

maven { url 'http://git.baijiashilian.com/open-android/maven/raw/master/' }

3)在需要集成的module添加如下依赖

implementation'com.baijia.player:VideoplayerCore:2.1.2'

videoplayer默认依赖supprot包的版本为27,如与本地support版本冲突,可以使用如下集成方式

implementation ('com.baijia.player:VideoplayerCore:2.1.2'){
    exclude group: 'com.android.support'
}

4)在build.gradle中添加ndk过滤
请在过滤so库文件务必同时包含armabi和armeabi-v7a两种类型,否则某些机型上可能出现音视频不同步的情况

ndk {
    abiFilters 'armeabi-v7a', 'armeabi', 'x86' //x86虚拟机测试用,发版可去掉
}

快速集成

1)在Application初始化sdk

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
         new BJYPlayerSDK.Builder(this)
                .setDevelopMode(true)
                //如果没有个性域名请注释
                .setCustomDomain("demo123")
                .setEncrypt(true)
                .build();
    }
}

通过BJYPlayerSDK.Builder配置参数,可配置的参数有

  • 设置开发者模式。开发者模式开启后会打印关键日志、显示播放器调试模板,方便开发,正式发版建议关掉
  /**
    * 设置开发者模式
    * @param isDevelopMode true 设置为开发者模式
    * @return
    */
    public Builder setDevelopMode(boolean isDevelopMode)
  • 设置专属域名。专属域名从百家云账号中心获取,传入规则:例如专属域名为 demo123.at.baijiayun.com,则前缀为 demo123,参考 专属域名说明
 /**
   * 设置专属域名
   *
   * @param domain 专属域名
   */
   public Builder setCustomDomain(String domain)
  • 设置是否加密,对在线播放和下载均有效
/**
  * 设置加密
  * @param isEncrypt true 加密,对在线和下载均有效
  * @return
  */
  public Builder setEncrypt(boolean isEncrypt)

初始化播放器

通过VideoPlayerFactory构造播放器,示例代码如下,请按需配置

videoPlayer = new VideoPlayerFactory.Builder()
                //开启循环播放
                .setSupportLooping(true)
                //关闭后台音频播放
                .setSupportBackgroundAudio(false)
                //开启记忆播放
                .setSupportBreakPointPlay(true, this)
                //设置在线播放清晰度匹配规则,这里仅传Audio则优先播放纯音频,如无纯音频则播放服务器返回的默认清晰度
                .setPreferredDefinitions(new ArrayList<VideoDefinition>(){{add(VideoDefinition.Audio);}})
                //绑定activity生命周期
                .setLifecycle(getLifecycle())
                .build();

IBJYVideoPlayer仅实现播放器相关逻辑,视频展示需要结合surfaceview或textureview进行显示。

初始化视频播放控件

  • Java代码初始化
BJYPlayerView playerView = findViewById(R.id.activity_new_video_fl);
videoPlayer.bindPlayerView(playerView);
//设置视频渲染载体,需在bindPlayerView之后设置。默认textureView,IRender.RENDER_TYPE_TEXTURE_VIEW和IRender.RENDER_TYPE_SURFACE_VIEW可选
playerView.setRenderType(IRender.RENDER_TYPE_TEXTURE_VIEW);
//设置视频画面裁剪方式,默认16:9
playerView.setAspectRatio(AspectRatio.AspectRatio_16_9);
  • xml初始化
   <com.baijiayun.videoplayer.widget.BJYPlayerView
        android:id="@+id/activity_new_video_fl"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:render_type="texture_view"
        app:aspect_ratio="fit_parent_16_9"
        />

BJYPlayerView是视频播放控件,继承自FrameLayout。对外可设置实际的渲染载体(surfaceView或textureView),5.0以上默认使用textureView。可设置视频界面裁剪方式,分别有如下五种: 宽高比16:9

类型 描述
fit_parent_16_9 宽高比16:9
fit_parent_4_3 宽高比4:3
match_parent 宽高直接为surfaceview或textureView的宽高
fill_parent 完全填充(宽优先)
fit_parent 等比填充(高度优先)
wrap_content 原画

播放器绑定视图

IBJYVideoPlayer videoPlayer.bindPlayerView(playerView);

IBJYVideoPlayer持有BJYPlayerView视图进行视频播放。

绑定视频源

  • 传入videoId和token,播放在线视频
videoPlayer.setupOnlineVideoWithId(Long.parseLong(vid), token);

参数说明如下

/**
  * 设置播放百家云在线视频
  *
  * @param videoId   视频id
  * @param token     需要集成方后端调用百家云后端的API获取
  */
  void setupOnlineVideoWithId(long videoId, String token);
  • 传入本地视频路径,播放本地视频
videoPlayer.setupLocalVideoWithFilePath(path);

参数说明如下:

/**
  * 设置播放本地文件路径
  *
  * @param path 视频文件绝对路径
  */
  void setupLocalVideoWithFilePath(String path);

设置完视频源之后,调用IBJYVideoPlayer.play()即可播放视频。

IBJYVideoPlayer播放器接口清单

public interface IBJYVideoPlayer extends LifecycleObserver {

    /**
     * 绑定PlayerView
     *
     * @param view
     */
    void bindPlayerView(BJYPlayerView view);

    /**
     * 设置第三方用户信息,用于统计
     *
     * @param userName     第三方用户名
     * @param userIdentity 第三方用户标识
     */
    void setUserInfo(String userName, String userIdentity);

    /**
     * 设置播放本地文件路径
     *
     * @param path 视频文件绝对路径
     */
    void setupLocalVideoWithFilePath(String path);

    /**
     * 设置播放百家云下载的本地视频
     *
     * @param downloadModel 百家云下载的model
     */
    void setupLocalVideoWithDownloadModel(DownloadModel downloadModel);

    /**
     * 设置播放百家云在线视频
     *
     * @param videoId 视频id
     * @param token   需要集成方后端调用百家云后端的API获取
     */
    void setupOnlineVideoWithId(long videoId, String token);

    /**
     * 设置播放百家云在线视频
     * @param videoId    视频id
     * @param token      需要集成方后端调用百家云后端的API获取
     * @param accessKey  第三方鉴权(可选)
     */
    void setupOnlineVideoWithId(long videoId, String token, String accessKey);

    void setupOnlineVideoWithVideoItem(VideoItem videoItem);

    /**
     * 开始播放
     */
    void play();

    /**
     * 从startOffset开始播放,单位为秒
     *
     * @param startOffset
     */
    void play(int startOffset);

    /**
     * 暂停播放
     */
    void pause();

    /**
     * 是否正在播放
     *
     * @return
     */
    boolean isPlaying();

    /**
     * 停止播放
     */
    void stop();

    /**
     * 释放播放器
     */
    void release();

    /**
     * seek
     *
     * @param time 时间
     */
    void seek(int time);

    /**
     * 倍速播放[0.5 ~ 2.0]倍
     *
     * @param rate 倍率
     */
    void setPlayRate(float rate);

    /**
     * 改变清晰度
     * 播放的时候调用,如果没有对应的清晰度不做处理,播本地文件不生效
     *
     * @param definition 清晰度
     * @return true切换清晰度成功  false切换清晰度失败
     */
    boolean changeDefinition(VideoDefinition definition);

    /**
     * 设置清晰度偏好
     * 优先使用此列表中的清晰度播放在线视频,优先级按数组元素顺序递减
     *
     * @param definitions 清晰度列表
     */
    void setPreferredDefinitions(Iterable<VideoDefinition> definitions);


    /**
     * 设置是否支持进入后台时继续播放音频
     *
     * @param enable boolean 默认false
     */
    void supportBackgroundAudio(boolean enable);

    /**
     * 设置是否支持循环播放
     *
     * @param looping 是否循环播放
     */
    void supportLooping(boolean looping);

    /**
     * 设置启用记忆播放
     *
     * @param context needed by SharedPrefs 做持久化需要用到
     */
    void enableBreakPointMemory(Context context);

    /**
     * 设置是否支持广告
     *
     * @param enable boolean 默认false
     */
    void supportAdvertisement(boolean enable);

    /**
     * 设置token失效回调
     *
     * @param listener token失效回调
     */
    void setOnTokenInvalidListener(OnTokenInvalidListener listener);

    /**
     * 设置播放器状态改变回调
     *
     * @param listener 播放状态改变回调
     */
    void addOnPlayerStatusChangeListener(OnPlayerStatusChangeListener listener);

    /**
     * 设置播放进度回调
     *
     * @param listener 播放进度回调
     */
    void addOnPlayingTimeChangeListener(OnPlayingTimeChangeListener listener);

    /**
     * 设置播放缓存进度回调
     *
     * @param listener 播放缓存进度回调
     */
    void addOnBufferUpdateListener(OnBufferedUpdateListener listener);

    /**
     * 设置缓冲状态回调
     *
     * @param listener 缓冲状态回调
     */
    void addOnBufferingListener(OnBufferingListener listener);

    /**
     * 设置播放器出错回调
     *
     * @param listener 播放器出错回调
     */
    void addOnPlayerErrorListener(OnPlayerErrorListener listener);

    /**
     * 播放上报监听
     */
    void addReportListener(OnPlayerReportListener onPlayerReportListener);

    /**
     * 设置seek结束回调
     * @param onSeekCompleteListener
     */
    void addOnSeekCompleteListener(OnSeekCompleteListener onSeekCompleteListener);

    void rePlay();

    /**
     * 获取播放器状态
     *
     * @return 播放器状态
     */
    PlayerStatus getPlayerStatus();

    /**
     * get player current play progress.
     *
     * @return
     */
    int getCurrentPosition();

    /**
     * get video duration
     *
     * @return
     */
    int getDuration();

    /**
     * get player buffering percentage.
     *
     * @return
     */
    int getBufferPercentage();

    /**
     * 获取播放速率
     * @return
     */
    float getPlayRate();

    /**
     * 获取当前播放的视频信息,如果通过setupLocalVideoWithFilePath设置数据源则该方法返回null
     *
     * @return Video Info
     */
    @Nullable
    BJYVideoInfo getVideoInfo();

    /**
     * 是否播放本地视频
     * @return true,播放本地视频
     */
    boolean isPlayLocalVideo();

    /**
     * 获取播放器调试相关参数
     * @return
     */
    MediaPlayerDebugInfo getMediaPlayerDebugInfo();

    /**
     * 设置setupVideoIdWithToken之后是否自动播放,默认自动播放
     * @param autoPlay
     */
    void setAutoPlay(boolean autoPlay);
}

下载

下载记录迁移

1.x新版下载使用本地文件保存下载记录(DiskCache实现),2.0使用微信开源MMKV存储方案,因此需要进行下载记录迁移。
升级方案根据1.x版本设置的下载记录保存文件目录(后续用cacheFolder表示)不同而不同

  • 未自定义cacheFolder,外部无需操作,sdk内部已实现下载记录迁移
  • 调用1.x DownloadManager.setCacheFoler()设置cacheFolder路径,需在升级到2.0后在DownloadManager.loadDownloadInfo()之前调用DownloadManager.upgrade().
//初始化下载
manager = CustomDownloadService.getDownloadManager(getApplicationContext());
//设置缓存文件路径  manager.setTargetFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + "/bb_video_downloaded/");
//设置下载清晰度优先匹配顺序,SDK内部匹配规则同definitionList
manager.setPreferredDefinitionList(definitionList);
//迁移下载记录
manager.upgrade();
manager.loadDownloadInfo();
  • 调用1.x DownloadMananger.setCacheFolder(String userIdentity) 按用户保存下载记录,需在升级2.0后在DownloadManager.loadDownloadInfo()之前调用DownloadManager.upgrade(String userIdentity) userIdentity需保持一致。
//迁移下载记录
manager.upgrade("userIdentify");
manager.loadDownloadInfo();
  • 调用1.x DownloadManager.setCacheFolderPath(String cacheFolderPath) 自定义路径,需在升级2.0后在DownloadMananger.loadDownloadInfo()之前调用DownloadManager.upgrade(Folder cacheFolder, String userIdentify)
/**
  * 兼容1.x SDK 下载记录,需在loadDownloadInfo()之前调用
  * @param cacheFolder   自定义下载记录保存路径
  * @param userIdentify  用户唯一识别id,如果自定义路径但没有区分用户则传空字符即可
  */
manager.upgrade(File cacheFolder, String userIdentify);
manager.loadDownloadInfo();

Android 8.0兼容

android 8.0之后不再支持应用后台创建service,需要用户自行实现后台下载保活,具体可以参考core demo下的CustomDownloadService。之前的DonwloadService依旧保留,不过不再兼容8.0系统,同时被标记废弃。

初始化DownloadManager

DownloadMananger使用单例模式,方便获取实例。

DownloadManager downloadManager = DownloadManager.getInstance(context);

设置缓存路径

manager.setTargetFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + "/bb_video_downloaded/")

加载缓存记录

manager.loadDownloadInfo();

默认只加载一次,如需重新加载,需调用loadDownloadInfo(true);

/**
     * 加载下载记录
     */
    public void loadDownloadInfo() {
        loadDownloadInfo(false);
    }
 /**
     * @param reload true:每次都清零后重新获取
     */
    public void loadDownloadInfo(boolean reload) {
        loadDownloadInfo("", reload);
    }
/**
     * 按用户角色加载下载记录
     * @param userIdentify 用户唯一标识
     * @param reload 是否每次强制刷新,默认传false
     */
    public void loadDownloadInfo(String userIdentify, boolean reload)

设置下载清晰度匹配规则

manager.setPreferredDefinitionList(definitionList);
 /**
   * 设置下载清晰度优先匹配顺序
   * @param definitionList
   */
public void setPreferredDefinitionList(List<VideoDefinition> definitionList)

如不设置,sdk默认的匹配规则如下,用户可参考自行调整顺序。

 //下载清晰度匹配规则,音频>720P>超清>高清>标清>1080P
private List<VideoDefinition> preferredDefinitionList = new ArrayList<>(Arrays.asList(VideoDefinition.Audio, VideoDefinition._720P,
            VideoDefinition.SHD, VideoDefinition.HD, VideoDefinition.SD, VideoDefinition._1080P));

获取下载记录

downloadManager.getAllTask();
/**
  *
  * 获取下载记录,需在loadDownloadInfo之后
  * @return
  */
public List<DownloadTask> getAllTasks()

删除下载

downloadManager.deleteTask(task);
/**
  * 删除任务 并同时删除文件
  *
  * @param task
  */
public void deleteTask(DownloadTask task)

点播下载

创建点播DownloadTask

videoDownloadDisposable = downloadManager.newVideoDownloadTask("video", videoId, token, "extraInfo")
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(downloadTask -> adapter.notifyDataSetChanged(), throwable -> {
                    throwable.printStackTrace();
                    Toast.makeText(SimpleVideoDownloadActivity.this, throwable.getMessage(), Toast.LENGTH_LONG).show();
                });

参数说明:

/**
     * 创建点播下载
     *
     * @param fileName    保存的下载的文件名称
     * @param videoId     视频id
     * @param token       视频token
     * @param extraInfo   额外信息,客户自己定义,这里只是转存
     * @return
     */
    public Observable<DownloadTask> newVideoDownloadTask(final String fileName, final long videoId, final String token,
                                                         final List<VideoDefinition> definitions, final String extraInfo)

其它重载的参数说明如下:

/**
     * 创建点播下载
     *
     * @param fileName    保存的下载的文件名称
     * @param videoId     视频id
     * @param token       视频token
     * @param extraInfo   额外信息,客户自己定义,这里只是转存
     * @param accessKey   第三方鉴权key
     * @return
     */
    public Observable<DownloadTask> newVideoDownloadTask(String fileName, long videoId, String token, String extraInfo, String accessKey) {
        return newVideoDownloadTask(fileName, videoId, token, extraInfo, accessKey, BJYPlayerSDK.IS_ENCRYPT);
    }
/**
     * 创建点播下载
     *
     * @param fileName    保存的下载的文件名称
     * @param videoId     视频id
     * @param token       视频token
     * @param extraInfo   额外信息,客户自己定义,这里只是转存
     * @param accessKey   第三方鉴权key
     * @param isEncrypt   加密参数,true加密 (仅对当前下载有效)
     * @return
     */
    public Observable<DownloadTask> newVideoDownloadTask(String fileName, long videoId, String token, String extraInfo, String accessKey, boolean isEncrypt) {

        return newVideoDownloadTask(fileName, videoId, token, extraInfo, accessKey, isEncrypt, preferredDefinitionList);
    }
    /**
     * 创建点播下载
     *
     * @param fileName        保存的下载的文件名称
     * @param videoId         视频id
     * @param token           视频token
     * @param accessKey       第三方鉴权key
     * @param extraInfo       额外信息,客户自己定义,这里只是转存
     * @param isEncrypt       加密参数,true加密 (仅对当前下载有效)
     * @param definitionList  清晰度匹配列表,从前往后匹配 (仅对当前下载有效)
     * @return
     */
    public Observable<DownloadTask> newVideoDownloadTask(final String fileName, final long videoId, final String token, final String extraInfo, String accessKey, boolean isEncrypt, List<VideoDefinition> definitionList)

下载状态回调

downloadTask.setDownloadListener(new DownloadListener() {
                @Override
                public void onProgress(DownloadTask task) {
                    //更新下载进度
                    int progress = (int) (task.getDownloadedLength() / (float) task.getTotalLength() * 100);
                }

                @Override
                public void onError(DownloadTask task, HttpException e) {
                    //下载出错
                    Log.e("download", "onError " + e.getCode() + ", message=" + e.getMessage());
                }

                @Override
                public void onPaused(DownloadTask task) {
                    //暂停
                }

                @Override
                public void onStarted(DownloadTask task) {
                    //开启下载
                }

                @Override
                public void onFinish(DownloadTask task) {
                    //下载完成
                }

                @Override
                public void onDeleted(DownloadTask task) {
                    //删除下载任务及文件
                }
            });

DownloadTask接口清单

public interface DownloadTask {

    /**
     * 开始任务
     */
    void start();

    /**
     * 暂停任务
     */
    void pause();

    /**
     * 重新开始任务
     */
    void restart();

    /**
     * 取消任务
     */
    void cancel();

    /**
     * 删除任务和文件
     */
    void deleteFiles();

    /**
     * 设置下载状态的监听
     *
     * @param listener
     */
    void setDownloadListener(DownloadListener listener);

    /**
     * 获取视频相关信息
     *
     * @return
     */
    DownloadModel getVideoDownloadInfo();

    /**
     * 获取信令相关信息
     * @return
     */
    DownloadModel getSignalDownloadInfo();

    /**
     * 获取下载状态
     * New(0),          // new -> downloading
     * Downloading(1),  // downloading -> pause, error, finish
     * Pause(2),        // pause -> downloading
     * Error(3),        // error -> new
     * Finish(4),       //
     * Cancel(5);
     * @return
     */
    TaskStatus getTaskStatus();

    /**
     * 获取下载速度,单位为byte
     * @return
     */
    long getSpeed();

    /**
     * 获取下载进度
     * @return
     */
    float getProgress();

    /**
     * 获取要下载的总字节数
     * @return
     */
    long getTotalLength();

    /**
     * 获取已下载字节数
     * @return
     */
    long getDownloadedLength();

    /**
     * 获取下载类别
     * @return
     */
    DownloadType getDownloadType();

    /**获取视频文件名称
     * @return
     */
    String getVideoFileName();

    /**
     * 获取信令文件名称
     * @return
     */
    String getSignalFileName();

    /**
     * 获取视频时长
     * @return
     */
    long getVideoDuration();

    /**
     * 获取下载视频的全路径
     * @return
     */
    String getVideoFilePath();

    /**
     * 获取下载的信令文件的全路径
     * @return
     */
    String getSignalFilePath();
}

DownloadModel字段说明

DownloadModel包含下载任务的全部信息,为链表结构,链头为视频/音频信息,链尾为信令信息,如果为点播则仅有链尾,nextModel为null。

 public long videoId;                //vid
    public long sessionId;              //sessionId
    public long roomId;                 //roomId
    public String url;                  //url
    public VideoDefinition definition;  //清晰度
    public long videoDuration;          //视频长度(服务器没传就是0)
    public FileType fileType;           //file type, Audio/Video/Signal
    public String targetName;           //保存的文件名
    public String videoName;            //视频标题
    public TaskStatus status = TaskStatus.New;              //当前状态
    public String targetFolder;        //保存文件夹
    public long totalLength;           //总大小
    public long downloadLength;        //已下载大小
    public long speed;                  //下载瞬时速度
    public Serializable data;          //额外的数据
    public boolean isEncrypt;            //加密类型 true加密
    public String videoToken;             //视频token,过期逻辑上层处理
    public String extraInfo;           //额外信息,客户自己定义,这里只是转存

    public DownloadModel nextModel;

参数说明

PlayerStatus

public enum PlayerStatus {

    STATE_ERROR,//出错
    STATE_IDLE,//未初始化
    STATE_INITIALIZED,//初始化
    STATE_PREPARED,//已准备好数据
    STATE_STARTED,//播放中
    STATE_PAUSED,//暂停状态
    STATE_STOPPED,//终止状态(已释放播放器实例)
    STATE_PLAYBACK_COMPLETED//播放结束
}

VideoDefinition

public enum VideoDefinition {
    UNKNOWN(-1),未知
    SD(0),//标清
    HD(1),//高清
    SHD(2),//超清
    _720P(3),//720p
    _1080P(4),//1080p
    Audio(5);//音频
}

错误码

错误码 说明
-10000 ijkplayer内部错误,比如文件异常
-1 无网络连接
-2 移动网络播放
-4 未知错误
-5 没有找到对应清晰度
-6 离线播放传入非法路径
-7 离线播放对应路径的文件不存在
5101、5102、5103 token异常
403 视频地址过期

注:ijkplayer没有给出具体错误码,详见源码的头文件ijkplayer_ android_def.h
其余错误码可参考AndroidSDK的MediaPlayer(需科学上网)

混淆规则

混淆规则同直播

//百家云混淆规则
-dontwarn com.baijiahulian.**
-dontwarn com.bjhl.**
-keep class com.baijiahulian.**{*;}
-keep class com.bjhl.**{*;}
-keep class com.baijia.**{*;}
-keep class com.baijiayun.**{*;}
-keep class org.webrtc.**{*;}

// 点播SDK
-keep class tv.danmaku.ijk.**{*;}

// RxJava混淆规则
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
    long producerIndex;
    long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
}

常见问题

1)为什么播本地视频总是提示-10000错误?
-10000错误码为ijkplayer底层报出的错误,请检查本地文件是否为合法视频文件,尝试使用系统播放器能不能正常播放。
2)为什么我集成之后播放视频一直在loading,没有播放出来?
首先检查网络连接是否正常,再者视频渲染采用surfaceview,初始化需要一定的时间,可在调用播放视频方法的时候尝试加入500ms左右延时。
3)为什么一直提示我token解析失败?
一个视频id对应一个token,token是百家云后台生成的,您可以联系后台开发人员确定token是否是正确的,再者查看初始化播放器的时候部署环境是否为在线环境。
4)播放器提示-10000,什么原因导致?
播放器报-10000错误码,可能出现的原因比较多,比如connect timeout IO Error等都会导致播放器提示-10000。这种情况下重试播放即可恢复正常。
5)为什么某些机器上音视频不同步?
请确认同时引入armeabi-v7a和armeabi两种so库。
6)为什么视频黑屏但是声音正常播放?
请检查是否使用textureview渲染,textureview需要打开硬件加速否则无法正常显示。
7) 为什么提示没有开通服务或者视频不存在?
请确认是否有个性域名,需在BJYPlayerSDK中配置对应的个性域名。
8)9.0机器上提示java.net.UnknownServiceException: CLEARTEXT communication to video.baijiayun.com
9.0后默认不支持http明文请求。

1、直接配置支持http明文传输

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

2、配置过滤规则

Create file res/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
         <domain includeSubdomains="true">baijiayun.com</domain>
         <domain includeSubdomains="true">baijiacloud.com</domain>
    </domain-config>
</network-security-config>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config"
        ...>
        ...
    </application>
</manifest>