接入文档

最近更新时间:2022-06-27 10:39:12

准备工作

  1. 为了您体验到更完整全面的播放器功能,建议您开通 云点播 相关服务,未注册用户可注册账号 试用。若您不使用云点播服务,可略过此步骤,但集成后仅可使用播放器基础能力。
  2. 下载 Android Studio,您可以进入 Android Studio 官网 下载安装,如已下载可略过该步骤。

通过本文你可以学会

  • 如何集成腾讯云视立方 Android 播放器SDK
  • 如何使用播放器 SDK 进行点播播放
  • 如何使用播放器 SDK 底层能力实现更多功能

SDK集成

步骤1:下载 SDK 开发包

下载 SDK 开发包,并按照 SDK 集成指引 将 SDK 嵌入您的 App 工程中。

步骤2:配置 License 授权

若您已获得相关 License 授权,需在 腾讯云视立方控制台 获取 License URL 和 License Key:

image

若您暂未获得 License 授权,需先参见 视频播放 License 获取相关授权。

获取到 License 信息后,在调用 SDK 的相关接口前,通过下面的接口初始化 License,建议在 Application 类中进行如下设置:

public class MApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        String licenceURL = ""; // 获取到的 licence url
        String licenceKey = ""; // 获取到的 licence key
        TXLiveBase.getInstance().setLicence(this, licenceURL, licenceKey);
        TXLiveBase.setListener(new TXLiveBaseListener() {
            @Override
            public void onLicenceLoaded(int result, String reason) {
                Log.i(TAG, "onLicenceLoaded: result:" + result + ", reason:" + reason);
            }
        });
    }
}

步骤3: 添加 View

SDK 默认提供 TXCloudVideoView 用于视频渲染,我们第一步要做的就是在布局 xml 文件里加入如下一段代码:

<com.tencent.rtmp.ui.TXCloudVideoView
            android:id="@+id/video_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true"
            android:visibility="gone"/>

步骤4:创建 Player

接下来创建一个 TXVodPlayer 的对象,并使用 setPlayerView 接口将它与我们刚添加到界面上的 video_view 控件进行关联。

//mPlayerView 即步骤3中添加的视频渲染 view
TXCloudVideoView mPlayerView = findViewById(R.id.video_view);
//创建 player 对象
TXVodPlayer mVodPlayer = new TXVodPlayer(getActivity());
//关联 player 对象与视频渲染 view
mVodPlayer.setPlayerView(mPlayerView);

步骤5:启动播放

TXVodPlayer 支持两种播放模式,您可以根据需要自行选择:

TXVodPlayer 内部会自动识别播放协议,您只需要将您的播放 URL 传给 startPlay 函数即可。

// 播放 URL 视频资源
String url = "http://1252463788.vod2.myqcloud.com/xxxxx/v.f20.mp4";
mVodPlayer.startPlay(url); 


// 播放本地视频资源
String localFile = "/sdcard/video.mp4";
mVodPlayer.startPlay(localFile); 

步骤6:结束播放

结束播放时记得销毁 view 控件,尤其是在下次 startPlay 之前,否则会产生大量的内存泄露以及闪屏问题。

同时,在退出播放界面时,记得一定要调用渲染 View 的onDestroy()函数,否则可能会产生内存泄露和“Receiver not registered”报警。

@Override
public void onDestroy() {
    super.onDestroy();
    mVodPlayer.stopPlay(true); // true 代表清除最后一帧画面
    mPlayerView.onDestroy(); 
}

说明:

stopPlay 的布尔型参数含义为:“是否清除最后一帧画面”。早期版本的 RTMP SDK 的直播播放器没有 pause 的概念,所以通过这个布尔值来控制最后一帧画面的清除。

如果是点播播放结束后,也想保留最后一帧画面,您可以在收到播放结束事件后什么也不做,默认停在最后一帧。

基础功能使用

1、播放控制

开始播放

// 开始播放
mVodPlayer.startPlay(url)

暂停播放

// 暂停播放
mVodPlayer.pause();

恢复播放

// 恢复播放
mVodPlayer.resume();

结束播放

// 结束播放
mVodPlayer.stopPlay(true);

调整进度(Seek)

当用户拖拽进度条时,可调用 seek 从指定位置开始播放,播放器 SDK 支持精准 seek。

int time = 600; // int类型时,单位为 秒
// float time = 600; // float 类型时单位为 秒
// 调整进度
mVodPlayer.seek(time);

从指定时间开始播放

首次调用 startPlay 之前,支持从指定时间开始播放。

float startTimeInMS = 600; // 单位:毫秒
mVodPlayer.setStartTime(startTimeInMS);   // 设置开始播放时间
mVodPlayer.startPlay(url);

2、画面调整

  • view:大小和位置
    如需修改画面的大小及位置,直接调整 SDK 集成时 添加 View 中添加的 “video_view” 控件的大小和位置即可。
  • setRenderMode:铺满或适应
    可选值 含义
    RENDER_MODE_FULL_FILL_SCREEN 将图像等比例铺满整个屏幕,多余部分裁剪掉,此模式下画面不会留黑边,但可能因为部分区域被裁剪而显示不全
    RENDER_MODE_ADJUST_RESOLUTION 将图像等比例缩放,适配最长边,缩放后的宽和高都不会超过显示区域,居中显示,画面可能会留有黑边
  • setRenderRotation:画面旋转
    可选值 含义
    RENDER_ROTATION_PORTRAIT 正常播放(Home 键在画面正下方)
    RENDER_ROTATION_LANDSCAPE 画面顺时针旋转270度(Home 键在画面正左方)
     // 将图像等比例铺满整个屏幕
    mVodPlayer.setRenderMode(TXLiveConstants.RENDER_MODE_FULL_FILL_SCREEN);
    // 正常播放(Home 键在画面正下方)
    mVodPlayer.setRenderRotation(TXLiveConstants.RENDER_ROTATION_PORTRAIT);

3、变速播放

点播播放器支持变速播放,通过接口setRate设置点播播放速率来完成,支持快速与慢速播放,如0.5X、1.0X、1.2X、2X等。

// 设置1.2倍速播放
mVodPlayer.setRate(1.2); 

4、循环播放

// 设置循环播放
mVodPlayer.setLoop(true);
// 获取当前循环播放状态
mVodPlayer.isLoop(); 

5、静音设置

// 设置静音,true 表示开启静音, false 表示关闭静音
mVodPlayer.setMute(true);

6、屏幕截图

通过调用 snapshot 您可以截取当前视频为一帧画面,此功能只会截取当前直播流的视频画面,如果您需要截取当前的整个 UI 界面,请调用 Android 的系统 API 来实现。

// 屏幕截图
mVodPlayer.snapshot(new ITXSnapshotListener() {
    @Override
    public void onSnapshot(Bitmap bmp) {
        if (null != bmp) {
           //获取到截图bitmap
        }
    }
});

7、贴片广告

播放器SDK支持在界面添加图片贴片,用于广告宣传等。实现方式如下:

  • autoPlay为 NO,此时播放器会正常加载,但视频不会立刻开始播放。
  • 在播放器加载出来后、视频尚未开始时,即可在播放器界面查看图片贴片广告。
  • 待达到广告展示结束条件时,使用resume接口启动视频播放。

mVodPlayer.setAutoPlay(false);  // 设置为非自动播放
mVodPlayer.startPlay(url);    // 调用startPlay 后会加载视频,加载成功后不会自动播放
// ......
// 在播放器界面上展示广告
// ......  
mVodPlayer.resume();  // 广告展示完调用 resume 开始播放视频

8、HTTP-REF

TXVodPlayConfig 中的 headers 可以用来设置 HTTP 请求头,例如常用的防止 URL 被到处拷贝的 Referer 字段(腾讯云可以提供更加安全的签名防盗链方案),以及用于验证客户端身份信息的 Cookie 字段。

9、硬件加速

对于蓝光级别(1080p)的画质,简单采用软件解码的方式很难获得较为流畅的播放体验,所以如果您的场景是以游戏直播为主,一般都推荐开启硬件加速。

软解和硬解的切换需要在切换之前先 stopPlay,切换之后再 startPlay,否则会产生比较严重的花屏问题。

 mVodPlayer.stopPlay(true);
 mVodPlayer.enableHardwareDecode(true);
 mVodPlayer.startPlay(flvUrl, type);

10、清晰度设置

SDK 支持 HLS 的多码率格式,方便用户切换不同码率的播放流,从而达到播放不同清晰的目标。在收到 PLAY_EVT_PLAY_BEGIN 事件后,可以通过下面方法进行清晰度设置。

ArrayList<TXBitrateItem> bitrates = mVodPlayer.getSupportedBitrates(); //获取多码率数组
int index = bitrates.get(i).index;  // 指定要播的码率下标
mVodPlayer.setBitrateIndex(index);  // 切换码率到想要的清晰度

在播放过程中,可以随时通过mVodPlayer.setBitrateIndex(int)切换码率。切换过程中,会重新拉取另一条流的数据,SDK 针对腾讯云的多码率文件做过优化,可以做到切换无卡顿。

11、码流自适应

SDK 支持 HLS 的多码流自适应,开启相关能力后播放器能够根据当前带宽,动态选择最合适的码率播放。在收到 PLAY_EVT_PLAY_BEGIN 事件后,可以通过下面方法开启码流自适应。

mVodPlayer.setBitrateIndex(-1); //index 参数传入-1
在播放过程中,可以随时通过 mVodPlayer.setBitrateIndex(int) 切换其它码率,切换后码流自适应也随之关闭。

12、播放进度监听

点播播放中的进度信息分为2种:加载进度播放进度,SDK 目前是以事件通知的方式将这两个进度实时通知出来的。更多事件通知内容参见事件监听

您可以为 TXVodPlayer 对象绑定一个 TXVodPlayerListener 监听器,进度通知会通过 PLAY_EVT_PLAY_PROGRESS 事件回调到您的应用程序,该事件的附加信息中即包含上述两个进度指标。

mVodPlayer.setVodListener(new ITXVodPlayListener() {
    @Override
    public void onPlayEvent(TXVodPlayer player, int event, Bundle param) {
        if (event == TXLiveConstants.PLAY_EVT_PLAY_PROGRESS) {
            // 加载进度, 单位是毫秒
            int playable_duration_ms = param.getInt(TXLiveConstants.EVT_PLAYABLE_DURATION_MS);
            mLoadBar.setProgress(playable_duration_ms); // 设置loading 进度条

            // 播放进度, 单位是毫秒
            int progress_ms = param.getInt(TXLiveConstants.EVT_PLAY_PROGRESS_MS);
            mSeekBar.setProgress(progress_ms);  // 设置播放进度条

            // 视频总长, 单位是毫秒
            int duration_ms = param.getInt(TXLiveConstants.EVT_PLAY_DURATION_MS);
            // 可以用于设置时长显示等等
        }
    }

    @Override
    public void onNetStatus(TXVodPlayer player, Bundle bundle) {
    }
});

13、播放网速监听

通过 事件监听 方式,可以在视频播放卡顿时在显示当前网速。

  • 通过onNetStatusNET_STATUS_NET_SPEED获取当前网速。具体使用方法见 状态反馈(onNetStatus)
  • 监听到PLAY_EVT_PLAY_LOADING事件后,显示当前网速。
  • 收到PLAY_EVT_VOD_LOADING_END事件后,对显示当前网速的 view 进行隐藏。

mVodPlayer.setVodListener(new ITXVodPlayListener() {
    @Override
    public void onPlayEvent(TXVodPlayer player, int event, Bundle param) {
        if (event == TXLiveConstants.PLAY_EVT_PLAY_LOADING) {
            // 显示当前网速

        } else if (event == TXLiveConstants.PLAY_EVT_VOD_LOADING_END) {
            // 对显示当前网速的 view 进行隐藏
        }
    }

    @Override
    public void onNetStatus(TXVodPlayer player, Bundle bundle) {
        // 获取实时速率, 单位:kbps
        int speed = bundle.getInt(TXLiveConstants.NET_STATUS_NET_SPEED);
    }
});

14、获取视频分辨率

播放器 SDK 通过 URL 字符串播放视频,URL 中本身不包含视频信息。为获取相关信息,需要通过访问云端服务器加载到相关视频信息,因此 SDK 只能以事件通知的方式将视频信息发送到您的应用程序中,更多内容参见 事件监听

可以通过下面两种方法获取分辨率信息

方法1:通过onNetStatusNET_STATUS_VIDEO_WIDTHNET_STATUS_VIDEO_HEIGHT获取视频的宽和高。具体使用方法见 状态反馈(onNetStatus)

方法2:在收到播放器的PLAY_EVT_VOD_PLAY_PREPARED 事件回调后,直接调用 TXVodPlayer.getWidth()TXVodPlayer.getHeight() 获取当前宽高。

mVodPlayer.setVodListener(new ITXVodPlayListener() {
    @Override
    public void onPlayEvent(TXVodPlayer player, int event, Bundle param) {
    }

    @Override
    public void onNetStatus(TXVodPlayer player, Bundle bundle) {
        //获取视频宽度
        int videoWidth = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_WIDTH);
        //获取视频高度
        int videoHeight = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_HEIGHT);
    }
});

// 获取视频宽高,需要在收到播放器的PLAY_EVT_VOD_PLAY_PREPARED 事件回调后才返回值
mVodPlayer.getWidth();
mVodPlayer.getHeight();

15、播放缓冲大小

在视频正常播放时,控制提前从网络缓冲的最大数据大小。如果不配置,则走播放器默认缓冲策略,保证流畅播放。

TXVodPlayConfig config = new TXVodPlayConfig();
config.setMaxBufferSize(10);  // 播放时最大缓冲大小。单位:MB
mVodPlayer.setConfig(config);  // 把config 传给 mVodPlayer

16、视频本地缓存

在短视频播放场景中,视频文件的本地缓存是很刚需的一个特性,对于普通用户而言,一个已经看过的视频再次观看时,不应该再消耗一次流量。

  • 格式支持:SDK 支持 HLS(m3u8) 和 MP4 两种常见点播格式的缓存功能。
  • 开启时机:SDK 并不默认开启缓存功能,对于用户回看率不高的场景,也并不推荐您开启此功能。
  • 开启方式:全局生效,在使用播放器开启。开启此功能需要配置两个参数:本地缓存目录及缓存大小。

File sdcardDir = getApplicationContext().getExternalFilesDir(null);
if (sdcardDir != null) {
    //设置播放引擎的全局缓存目录
   TXPlayerGlobalSetting.setCacheFolderPath(sdcardDir.getPath() + "/txcache");
    //设置播放引擎的全局缓存目录和缓存大小,//单位MB
    TXPlayerGlobalSetting.setMaxCacheSize(200); 
}

//使用播放器

说明:

旧版本通过 TXVodPlayConfig#setMaxCacheItems 接口配置已经废弃,不推荐使用。

高级功能使用

1、视频预播放

步骤1:视频预播放使用

在短视频播放场景中,视频预播放功能对于流畅的观看体验很有帮助:在观看当前视频的同时,在后台加载即将要播放的下一个视频 ,这样一来,当用户真正切换到下一个视频时,已经不需要从头开始加载了,而是可以做到立刻播放。

预播放视频会有很好的秒开效果,但有一定的性能开销,如果业务同时有较多的视频预加载需求,建议结合 视频预下载 一起使用。

这就是视频播放中无缝切换的背后技术支撑,您可以使用 TXVodPlayer 中的 setAutoPlay 开关来实现这个功能,具体做法如下:

// 播放视频 A: 如果将 autoPlay 设置为 true, 那么 startPlay 调用会立刻开始视频的加载和播放
String urlA = "http://1252463788.vod2.myqcloud.com/xxxxx/v.f10.mp4";
playerA.setAutoPlay(true);
playerA.startPlay(urlA);

// 在播放视频 A 的同时,预加载视频 B,做法是将 setAutoPlay 设置为 false
String urlB = @"http://1252463788.vod2.myqcloud.com/xxxxx/v.f20.mp4";
playerB.setAutoPlay(false);
playerB.startPlay(urlB); // 不会立刻开始播放,而只会开始加载视频

等到视频 A 播放结束,自动(或者用户手动切换到)视频 B 时,调用 resume 函数即可实现立刻播放。

注意:

设置了 autoPlay 为 false 之后,调用 resume 之前需要保证视频 B 已准备完成,即需要在监听到视频 B 的 PLAY_EVT_VOD_PLAY_PREPARED (2013 ,播放器已准备完成,可以播放)事件后调用。

public void onPlayEvent(TXVodPlayer player, int event, Bundle param) {
    // 在视频 A 播放结束的时候,直接启动视频 B 的播放,可以做到无缝切换
    if (event == PLAY_EVT_PLAY_END) {
           playerA.stop();
           playerB.setPlayerView(mPlayerView);
           playerB.resume();
        }
}

步骤2:视频预播放缓冲配置

  • 设置较大的缓冲可以更好的应对网络的波动,达到流畅播放的目的。
  • 设置较小的缓冲可以帮助节省流量消耗。
预播放缓冲大小

此接口针对预加载场景(即在视频启播前,且设置 player 的 AutoPlay 为 false),用于控制启播前阶段的最大缓冲大小。

TXVodPlayConfig config = new TXVodPlayConfig();
config.setMaxPreloadSize(2);  // 预播放最大缓冲大小。单位:MB, 根据业务情况设置去节省流量
mVodPlayer.setConfig(config);  // 把config 传给 mVodPlayer

播放缓冲大小

在视频正常播放时,控制提前从网络缓冲的最大数据大小。如果不配置,则走播放器默认缓冲策略,保证流畅播放。

TXVodPlayConfig config = new TXVodPlayConfig();
config.setMaxBufferSize(10);  // 播放时最大缓冲大小。单位:MB
mVodPlayer.setConfig(config);  // 把config 传给 mVodPlayer

2、视频预下载

不需要创建播放器实例,预先下载视频部分内容,使用播放器时,可以加快视频启播速度,提供更好的播放体验。

在使用播放服务前,请确保先设置好 视频缓存

说明:

  1. TXPlayerGlobalSetting 是全局缓存设置接口,原有 TXVodConfig 的缓存配置接口废弃。
  2. 全局缓存目录和大小设置的优先级高于播放器 TXVodConfig 配置的缓存设置。

使用示例:

//先设置播放引擎的全局缓存目录和缓存大小
File sdcardDir = getApplicationContext().getExternalFilesDir(null);
//设置播放引擎的全局缓存目录和缓存大小
if (sdcardDir != null) {
    TXPlayerGlobalSetting.setCacheFolderPath(sdcardDir.getPath() + "/PlayerCache");
    TXPlayerGlobalSetting.setMaxCacheSize(200); //单位MB
}

String palyrl = "http://****";
//启动预下载
final TXVodPreloadManager downloadManager = TXVodPreloadManager.getInstance(getApplicationContext());
final int taskID = downloadManager.startPreload(playUrl, 3, 1920*1080, new ITXVodPreloadListener() {
    @Override
    public void onComplete(int taskID, String url) {
        Log.d(TAG, "preload: onComplete: url: " + url);
    }

    @Override
    public void onError(int taskID, String url, int code, String msg) {
        Log.d(TAG, "preload: onError: url: " + url + ", code: " + code + ", msg: " + msg);
    }

});

//取消预下载
downloadManager.stopPreload(taskID);

3、视频下载

视频下载支持用户在有网络的条件下下载视频,随后在无网络的环境下观看。同时播放器 SDK 提供本地加密能力,下载后的本地视频仍为加密状态,仅可通过指定播放器对视频进行解密播放,可有效防止下载后视频的非法传播,保护视频安全。

由于 HLS 流媒体无法直接保存到本地,因此也无法通过播放本地文件的方式实现 HLS 下载到本地后播放,对于该问题,您可以通过基于TXVodDownloadManager的视频下载方案实现 HLS 的离线播放。

注意:

  • TXVodDownloadManager 暂不支持缓存 MP4 和 FLV 格式的文件,仅支持缓存非嵌套 HLS 格式文件。
  • 播放器 SDK 已支持 MP4 和 FLV 格式的本地文件播放。

步骤1:准备工作

TXVodDownloadManager被设计为单例,因此您不能创建多个下载对象。用法如下:

TXVodDownloadManager downloader = TXVodDownloadManager.getInstance();
downloader.setDownloadPath("<指定您的下载目录>");

步骤2: 开始下载

开始下载有 URLFileid 两种方式,具体操作如下:

至少需要传入下载地址 URL,不支持嵌套 HLS 格式,仅支持非嵌套 HLS 格式下载。userName 不传入具体值时,默认为"default"。

downloader.startDownloadUrl("http://1500005830.vod2.myqcloud.com/43843ec0vodtranscq1500005830/00eb06a88602268011437356984/video_10_0.m3u8", "");

步骤3:任务信息

在接收任务信息前,需要先设置回调 listener。

downloader.setListener(this);

可能收到的任务回调有:

回调信息 说明
void onDownloadStart(TXVodDownloadMediaInfo mediaInfo) 任务开始,表示 SDK 已经开始下载
void onDownloadProgress(TXVodDownloadMediaInfo mediaInfo) 任务进度,下载过程中,SDK 会频繁回调此接口,您可以通过mediaInfo.getProgress() 获取当前进度
void onDownloadStop(TXVodDownloadMediaInfo mediaInfo) 任务停止,当您调用 stopDownload 停止下载,收到此消息表示停止成功
void onDownloadFinish(TXVodDownloadMediaInfo mediaInfo) 下载完成,收到此回调表示已全部下载。此时下载文件可以给 TXVodPlayer 播放
void onDownloadError(TXVodDownloadMediaInfo mediaInfo, int error, String reason) 下载错误,下载过程中遇到网络断开会回调此接口,同时下载任务停止。错误码位于TXVodDownloadManager

由于 downloader 可以同时下载多个任务,所以回调接口里带上了TXVodDownloadMediaInfo对象,您可以访问 URL 或 dataSource 判断下载源,同时还可以获取到下载进度、文件大小等信息。

步骤4:中断下载

停止下载请调用downloader.stopDownload()方法,参数为downloader.startDownload()返回的对象。SDK 支持断点续传,当下载目录没有发生改变时,下次下载同一个文件时会从上次停止的地方重新开始。

步骤5:管理下载

获取所有用户账户的下载列表信息, 也可获取指定用户账户的下载列表信息。

// 获取所有用户的下载列表信息
// 接入方可根据下载信息中的userName区分不同用户的下载列表信息
List<TXVodDownloadMediaInfo> downloadList = downloader.getDownloadMediaInfoList(); 
if (downloadInfoList == null || downloadInfoList.size() <= 0) return;
// 获取默认“default”用户的下载列表
List<TXVodDownloadMediaInfo> defaultUserDownloadList = new ArrayList<>();
for(TXVodDownloadMediaInfo downloadMediaInfo : downloadInfoList) {
  if ("default".equals(downloadMediaInfo.getUserName())) {
      defaultUserDownloadList.add(downloadMediaInfo);
  }
}

获取某个 Fileid 相关下载信息,包括当前下载状态,获取当前下载进度,判断是否下载完成等,需要传入 AppID、 Fileid 和 qualityId。

// 获取某个fileId相关下载信息
TXVodDownloadMediaInfo downloadInfo = downloader.getDownloadMediaInfo(1252463788, "4564972819220421305", QUALITYHD);
int duration = downloadInfo.getDuration();    // 获取总时长
int playableDuration = downloadInfo.getPlayableDuration(); // 获取已下载的可播放时长
float progress = downloadInfo.getProgress();    // 获取下载进度
String playPath = downloadInfo.getPlayPath(); // 获取离线播放路径,传给播放器即可离线播放
int downloadState = downloadInfo.getDownloadState(); // 获取下载状态,具体参考STATE_xxx常量
boolean isDownloadFinished = downloadInfo.isDownloadFinished(); // 返回true表示下载完成

获取某个 URL 相关下载信息,需要传入 URL 信息。

// 获取某个url下载信息
TXVodDownloadMediaInfo downloadInfo = downloader.getDownloadMediaInfo("http://1253131631.vod2.myqcloud.com/26f327f9vodgzp1253131631/f4bdff799031868222924043041/playlist.m3u8”);

删除下载信息和相关文件,需传入 TXVodDownloadMediaInfo 参数。

// 删除下载信息
boolean deleteRst = downloader.deleteDownloadMediaInfo(downloadInfo);

4、加密播放

视频加密方案主要用于在线教育等需要对视频版权进行保护的场景。如果要对您的视频资源进行加密保护,就不仅需要在播放器上做改造,还需要对视频源本身进行加密转码,亦需要您的后台和终端研发工程师都参与其中。在 视频加密解决方案 中您会了解到全部细节内容。

5、播放器配置

在调用 statPlay 之前可以通过 setConfig 对播放器进行参数配置,例如:设置播放器连接超时时间、设置进度回调间隔、设置缓存文件个数等配置,TXVodPlayConfig 支持配置的详细参数请单击 基础配置接口 了解。使用示例:

TXVodPlayConfig config = new TXVodPlayConfig();
config.setEnableAccurateSeek(true);  // 设置是否精确 seek,默认 true
config.setMaxCacheItems(5);  // 设置缓存文件个数为5
config.setProgressInterval(200);  // 设置进度回调间隔,单位毫秒
config.setMaxBufferSize(50);  // 最大预加载大小,单位 MB
mVodPlayer.setConfig(config);  // 把config 传给 mVodPlayer

启播时指定分辨率

播放 HLS 的多码率视频源,如果你提前知道视频流的分辨率信息,可以在启播前优先指定播放的视频分辨率。 播放器会查找小于或等于偏好分辨率的流进行启播,启播后没有必要再通过 setBitrateIndex 切换到需要的码流。

TXVodPlayConfig config = new TXVodPlayConfig();
// 传入参数为视频宽和高的乘积(宽 *  高),可以自定义值传入
config.setPreferredResolution(TXLiveConstants.VIDEO_RESOLUTION_720X1280); 
mVodPlayer.setConfig(config);  // 把config 传给 mVodPlayer

设置播放进度回调时间间隔

TXVodPlayConfig config = new TXVodPlayConfig();
config.setProgressInterval(200);  // 设置进度回调间隔,单位毫秒
mVodPlayer.setConfig(config);  // 把config 传给 mVodPlayer

播放器事件监听

您可以为 TXVodPlayer 对象绑定一个 TXVodPlayListener 监听器,即可通过onPlayEvent(事件通知) 和 onNetStatus(状态反馈)向您的应用程序同步信息。

播放事件通知(onPlayEvent)

事件 ID 数值 含义说明
PLAY_EVT_PLAY_BEGIN 2004 视频播放开始
PLAY_EVT_PLAY_PROGRESS 2005 视频播放进度,会通知当前播放进度、加载进度 和总体时长
PLAY_EVT_PLAY_LOADING 2007 视频播放 loading,如果能够恢复,之后会有 LOADING_END 事件
PLAY_EVT_VOD_LOADING_END 2014 视频播放 loading 结束,视频继续播放

结束事件

事件 ID 数值 含义说明
PLAY_EVT_PLAY_END 2006 视频播放结束
PLAY_ERR_NET_DISCONNECT -2301 网络断连,且经多次重连亦不能恢复,更多重试请自行重启播放
PLAY_ERR_HLS_KEY -2305 HLS 解密 key 获取失败

警告事件

如下的这些事件您可以不用关心,它只是用来告知您 SDK 内部的一些事件。

事件 ID 数值 含义说明
PLAY_WARNING_VIDEO_DECODE_FAIL 2101 当前视频帧解码失败
PLAY_WARNING_AUDIO_DECODE_FAIL 2102 当前音频帧解码失败
PLAY_WARNING_RECONNECT 2103 网络断连, 已启动自动重连 (重连超过三次就直接抛送 PLAY_ERR_NET_DISCONNECT 了)
PLAY_WARNING_HW_ACCELERATION_FAIL 2106 硬解启动失败,采用软解

连接事件

连接服务器的事件,主要用于测定和统计服务器连接时间:

事件 ID 数值 含义说明
PLAY_EVT_VOD_PLAY_PREPARED 2013 播放器已准备完成,可以播放。设置了 autoPlay 为 false 之后,需要在收到此事件后,调用 resume 才会开始播放
PLAY_EVT_RCV_FIRST_I_FRAME 2003 网络接收到首个可渲染的视频数据包(IDR)

画面事件

以下事件用于获取画面变化信息:

事件 ID 数值 含义说明
PLAY_EVT_CHANGE_RESOLUTION 2009 视频分辨率改变
PLAY_EVT_CHANGE_ROTATION 2011 MP4 视频旋转角度

视频信息事件

事件 ID 数值 含义说明
TXLiveConstants.PLAY_EVT_GET_PLAYINFO_SUCC 2010 成功获取播放文件信息

如果通过 fileId 方式播放且请求成功(接口:startPlay(TXPlayerAuthBuilder authBuilder)),SDK 会将一些请求信息通知到上层。您可以在收到TXLiveConstants.PLAY_EVT_GET_PLAYINFO_SUCC事件后,解析 param 获取视频信息。

视频信息 含义说明
EVT_PLAY_COVER_URL 视频封面地址
EVT_PLAY_URL 视频播放地址
EVT_PLAY_DURATION 视频时长
EVT_TIME 事件发生时间
EVT_UTC_TIME UTC 时间
EVT_DESCRIPTION 事件说明
EVT_PLAY_NAME 视频名称
TXVodConstants.EVT_IMAGESPRIT_WEBVTTURL 雪碧图 web vtt 描述文件下载 URL,10.2版本开始支持
TXVodConstants.EVT_IMAGESPRIT_IMAGEURL_LIST 雪碧图图片下载URL,10.2版本开始支持
TXVodConstants.EVT_DRM_TYPE 加密类型,10.2版本开始支持

通过 onPlayEvent 获取视频播放过程信息示例:

mVodPlayer.setVodListener(new ITXVodPlayListener() {
    @Override
    public void onPlayEvent(TXVodPlayer player, int event, Bundle param) {
        if (event == TXLiveConstants.PLAY_EVT_VOD_PLAY_PREPARED) {
            // 收到播放器已经准备完成事件,此时可以调用pause、resume、getWidth、getSupportedBitrates 等接口
        } else if (event == TXLiveConstants.PLAY_EVT_PLAY_BEGIN) {
            // 收到开始播放事件
        } else if (event == TXLiveConstants.PLAY_EVT_PLAY_END) {
            // 收到开始结束事件
        }
    }

    @Override
    public void onNetStatus(TXVodPlayer player, Bundle bundle) {
    }
});

播放状态反馈(onNetStatus)

状态反馈每0.5秒都会被触发一次,目的是实时反馈当前的推流器状态,它就像汽车的仪表盘,可以告知您目前 SDK 内部的一些具体情况,以便您能对当前视频播放状态等有所了解。

评估参数含义说明
NET_STATUS_CPU_USAGE当前瞬时 CPU 使用率
NET_STATUS_VIDEO_WIDTH视频分辨率 - 宽
NET_STATUS_VIDEO_HEIGHT视频分辨率 - 高
NET_STATUS_NET_SPEED当前的网络数据接收速度
NET_STATUS_VIDEO_FPS当前流媒体的视频帧率
NET_STATUS_VIDEO_BITRATE当前流媒体的视频码率,单位 kbps
NET_STATUS_AUDIO_BITRATE当前流媒体的音频码率,单位 kbps
NET_STATUS_VIDEO_CACHE缓冲区(jitterbuffer)大小,缓冲区当前长度为0,说明离卡顿就不远了
NET_STATUS_SERVER_IP连接的服务器 IP
通过 onNetStatus 获取视频播放过程信息示例:

mVodPlayer.setVodListener(new ITXVodPlayListener() {
    @Override
    public void onPlayEvent(TXVodPlayer player, int event, Bundle param) {
    }

    @Override
    public void onNetStatus(TXVodPlayer player, Bundle bundle) {
        //获取当前CPU使用率
        CharSequence cpuUsage = bundle.getCharSequence(TXLiveConstants.NET_STATUS_CPU_USAGE);
        //获取视频宽度
        int videoWidth = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_WIDTH);
        //获取视频高度
        int videoHeight = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_HEIGHT);
        //获取实时速率,  单位:kbps
        int speed = bundle.getInt(TXLiveConstants.NET_STATUS_NET_SPEED);
        //获取当前流媒体的视频帧率
        int fps = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_FPS);
        //获取当前流媒体的视频码率,单位 kbps
        int videoBitRate = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_BITRATE);
        //获取当前流媒体的音频码率,单位 kbps
        int audioBitRate = bundle.getInt(TXLiveConstants.NET_STATUS_AUDIO_BITRATE);
        //获取缓冲区(jitterbuffer)大小,缓冲区当前长度为0,说明离卡顿就不远了
        int jitterbuffer = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_CACHE);
        //获取连接的服务器的IP地址
        String ip = bundle.getString(TXLiveConstants.NET_STATUS_SERVER_IP);
    }
});

场景化功能

1、基于 SDK 的 Demo 组件

基于播放器 SDK,腾讯云研发了一款 播放器组件,集质量监控、视频加密、极速高清、清晰度切换、小窗播放等功能于一体,适用于所有点播、直播播放场景。封装了完整功能并提供上层 UI,可帮助您在短时间内,打造一个媲美市面上各种流行视频 App 的播放软件。

2、开源 Github

基于播放器 SDK,腾讯云研发了沉浸式视频播放器组件、视频 Feed 流、多播放器复用组件等,而且随着版本发布,我们会提供跟多的基于用户场景的组件。您可以通过 Player_Android 下载体验。

目录