CDN加速

移动端播放器SDK

更新时间:2020-12-14 17:06:40

简介

网宿提供移动端播放器SDK,分别包括Android版、IOS版,用于嵌入到移动APP应用中,实现流媒体直播、点播播放。

SDK下载

请联系网宿技术支持申请。

使用说明

  • 播放器分为轻量版和完整版,供用户应用于不同场景中,通常轻量版已经足以覆盖 大部分使用场景,因此通常推荐使用轻量版本,可以有效的减少引入播放器带来的 体积增长。
  • 轻量版播放器支持 MP4/FLV/HLS/RTMP,完整版更支持 MKV/RMVB 等更全面的 功能项,除此外两个版本并无其他区别。
  • 配合云点播、云直播服务获取播放地址,集成播放器 SDK 框架,然后调用播放器的 URL 播放接口即可播放视频或观看直播。

image

快速集成

系统支持

  • Android:支持 Android 4.0 以上, 支 持 armv5 / armv7a / arm64 / x86 / x86_64 等芯片架构;
  • iOS:支持 iOS 8.0 以上。

运行环境

  • Android:推荐开发者使用 Android Studio 作为自己的开发工具,本开发文档也 是基于 Android Studio 开发环境下进行编写的;
  • iOS:建议使用 XCode8.0 以上版本进行编译。

如何导入

Android
  1. 下载播放器 SDK
  2. 添加对 CNCMediaPlayerSDK 的依赖
    (针对 Android Plugin Version 3.0.0 以下版本的依赖),以工程库的方式将 CNCMediaPlayerSDK 依赖到工程中(修改 build.gradle 的 dependencies)。
    完整版使用:
fullCompile project(path: ':CNCMediaPlayerSDK', configuration: 'fullRelease')

轻量版使用:

liveCompile project(path: ':CNCMediaPlayerSDK', configuration: 'liveRelease')
  1. 添加布局
    在 FrameLayout 布局下添加 CNCVideoViewEx 和 CNCMediaController,用于渲染播放 器的播放界面和控制界面
<FrameLayout
android:id="@+id/video_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/black">
<com.cnc.mediaplayer.sdk.CNCVideoViewEx android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center"/>
<com.cnc.mediaplayer.sdk.controller.CNCMediaController android:id="@+id/media_controller" android:layout_width="match_parent" android:layout_height="match_parent"/>
</FrameLayout>
  1. 修改 AndroidManifest.xml,添加权限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.READ_LOGS" />

修改相应 Activity 的 configChanges:

android:configChanges="keyboardHidden|orientation|screenSize"

修改相应 Activity 的 screenOrientation 锁定竖屏,避免 Android 系统自带的自动翻转:

android:screenOrientation="portrait"
IOS
  1. 下载播放器 SDK
  2. 需 要 导 入 CNCMediaPlayerFramework.framework ( 完 整 版 ) 或
    CNCLiveMediaPlayerFramework.framework(轻量版)到工程中(以下以完整版为例)

image

  1. 打开工程,选中目标 target,依次选择 General -> Embededed Binaries, 点击 + 号,点击 Add Other… ,导入下载好的 CNCMediaPlayerFramework.framework 到项目中,并勾选 copy 选项添加 Embedded Binaries

image

  1. 若 Framework 不在工程根目录内部,则需要在工程的 Build Setting 中的 Framework Search Pahts 中添加 framework 的所在路径。在工程的 Info.plist 添加如下 Http 权限

image

  1. 在工程的 targets -> Capabilities 中打开 Background Modes,并选择第一 个 Audio,AirPlay,and Picture in Picture

image

  1. 设置 Build Settings -> Build Options -> Enable Bitcode 为 YES

image

SDK使用

Android
  1. 在初始化播放器之前需对 SDK 进行鉴权,SDK 内部会检查鉴权结果,请求鉴
    权的接口为:
void requestAuth(Context context, String appId, String authKey, ValidListener listener);

理论上一个自然日内只会发起一次网络鉴权(可能较耗时),为避免在 SDK 内部发起网络 鉴权请求,建议在 app 启动时调用:

CNCMediaPlayerAuthentication.requestAuth(getApplicationContext(), mAuthAppId, mAuthKey, null);
 void requestAuth(Context context, String appId, String authKey, ValidListener listener);
  1. 初始化播放器,对播放器做初始化配置(请参考 SinglePlayerFragment 类的 initSDKSettings)
//首先获取配置参数,避免作用到当前播放
Bundle bundle = getArguments();
//获取播放 url
mUrl = bundle.getString(Constants.URL);
//获取配置类对象
mSDKSettings = new CNCSDKSettings();
//初始化配置
initSDKSettings(mSDKSettings, bundle);
  1. 播放和控制界面布局,CNCVideoViewEx 和 CNCMediaController 分别是 SDK 显示布局和控制界面布局。
    首 先 从 activity_cnc_mediaplayer.xml 布 局 文 件 中 获 取 mCNCVideoViewEx 和 mCNCMediaController 两个实例,然后添加全屏变化的监听以在全屏时做 UI 调整。
setContentView(R.layout.activity_cnc_mediaplayer);
mCNCVideoViewEx = (CNCVideoViewEx) findViewById(R.id.video_view); mCNCMediaController = (CNCMediaController) findViewById(R.id.media_controller);
//关联 CNCVideoViewEx 和 CNCMediaController mCNCVideoViewEx.setMediaController(mCNCMediaController);
//全屏变化监听 mCNCVideoViewEx.setOnFullscreenChangeListener(mOnFullscreenChangeListener); //监听视频事件 mCNCVideoViewEx.setOnMediaEventsListener(mMediaEventsListener);
  1. 调用 mCNCVideoViewEx 的方法启动播放器开始播放,调用 mCNCMediaController 的方法设置视频的 title 用于显示在播放器顶部。
mCNCVideoViewEx.play(url);
if (mCNCMediaController != null) {
mCNCMediaController.setTitle(url); }
IOS
  1. 初始化前 SDK 内部会检查鉴权结果,请求鉴权的接口为:
+ (CNC_MediaPlayer_ret_Code)regist_app:(NSString *_Nonnull)app_id auth_key:(NSString *_Nonnull)auth_key;

也可以采用异步方式完成:

+ (void)async_regist_app:(NSString *_Nonnull)app_id auth_key:(NSString *_Nonnull)auth_key;

理论上一个自然日内只会发起一次网络鉴权(可能较耗时),为避免在 SDK 内部发起网络 鉴权请求,建议在 app 启动时调用。

  1. CNCMediaPlayerController 类中的 view,是播放器的渲染视图,初始化 CNCMediaPlayerController 之后对 view 进行 frame 的设置后,在需要展示的父视图上对 view 进行 addSubview,即可完成播放布局:
self.player = [[CNCMediaPlayerController alloc] initWithContentURL:self.URL option:option];
[self.viewFullScreen addSubview:self.player.view];
  1. 启动播放器,配置相关参数(未设置则启动时以默认参数进行播放)。启动播 放器是异步操作,调用 CNCMediaPlayerController 的实例方法 prepareToPlay:
[self.player prepareToPlay];

SDK配置

在初始化完成后,可根据需要对播放器进行配置,否则 SDK 将按照默认配置执行。

Android
//设置是否允许后台播放
mSDKSettings.setEnableBackgroundPlay(bundle.getBoolean(Constants.ENABLE_BAC KGROUND_PLAY));
//设置是否后台时不解码视频以降低 cpu 消耗 mSDKSettings.setDisableDecodeVideoInBackground(bundle.getBoolean(Constants. DISABLE_DECODE_VIDEO_IN_BACKGROUND));
//设置是否使能手势控制
mSDKSettings.setUsingGestureController(bundle.getBoolean(Constants.USING_GE STURE_CONTROLLER));
//设置是否自动旋转 mSDKSettings.setAutoRotate(bundle.getBoolean(Constants.AUTO_ROTATE)); //手势控制时,设置控制亮度和音量的区域 mSDKSettings.setGestureBrightnessVolume(Constants.GESTURE_LEFT_BRIGHTNESS_R IGHT_VOLUME);
//设置是否直播
mSDKSettings.setLive(bundle.getBoolean(Constants.LIVE));
//设置是否使用延时追赶
mSDKSettings.setUsingCatchLiveDelay(bundle.getBoolean(Constants.USING_CATCH _LIVE_DELAY));
//设置是否使用硬件解码视频 mSDKSettings.setUsingMediaCodec(bundle.getBoolean(Constants.USING_MEDIACODE C));
//设置是否使用 OpenSL ES 音频加速
mSDKSettings.setUsingOpenSLES(bundle.getBoolean(Constants.USING_OPENSLES));
//设置触发延时追赶的阈值
mSDKSettings.setCatchLiveDelayTimeInMs(bundle.getInt(Constants.CATCH_LIVE_D ELAY_TIME_IN_MS));
//设置缓冲阈值,默认 0,最小 0,最大 5000 mSDKSettings.setBufferingTimeInMs(bundle.getInt(Constants.BUFFERING_TIME_IN _MS));
//传入鉴权 id
mSDKSettings.setAuthAppId(bundle.getString(Constants.AUTH_APP_ID));
//传入鉴权 key
mSDKSettings.setAuthKey(bundle.getString(Constants.AUTH_KEY));
//设置是否使用分辨率重建
mSDKSettings.setIsSuperRes(bundle.getBoolean(Constants.USING_SUPER_SR));
//设置是否 MP4 解密播放
mSDKSettings.setUsingMp4Encryption(bundle.getBoolean(Constants.USING_MP4_EN CRYPTION));
//设置是否使 hls 解密播放 mSDKSettings.setUsingHls(bundle.getBoolean(Constants.USING_HLS)); mSDKSettings.setHlsVideoId(bundle.getString(Constants.HLS_VIDEO_ID));
IOS
//debug 模式下可选 debug,若日志太多干扰,可选 warn [self.player setLogLevel:CNC_MediaPlayer_Loglevel_Debug]; //设置直播或者点播
 [self.player setPlayMode:self.setting.isLive ? CNC_MEDIA_PLAYER_MODE_LIVE : CNC_MEDIA_PLAYER_MODE_VOD];
//设置是否自动播放
[self.player setShouldAutoPlay:self.setting.isAutoPlay]; //设置解码方式:(软解、硬解)
[self.player setVideoDecoderMode:self.setting.isHardware ?
CNC_VIDEO_DECODER_MODE_HARDWARE : CNC_VIDEO_DECODER_MODE_SOFTWARE]; //设置延时追赶(直播场景下使用,如果在点播使用会导致缓存不断被清除) [self.player setShouldAutoClearCache:self.setting.isAutoClearCache]; //设置是否后台播放
[self.player setAbleVideoPlayingInBackground:self.setting.isPlayBackground];
//设置是否进行后台视频解码,不解码可以节约设备资源,节省电量
[self.player setDisableVideoDecodeInBackground:self.setting.isDisableDecodeBackground];
//设置快启,加快首屏
[self.player accelerateOpen:self.setting.isAccelerateOpen]; //设置是否兼容其他 app 的音频,开启时其他 app 的音频不会中断播放器音频,否则
其他 app 的音频播放会中断播放器的播放
[self.player setMixOtherPlayer:self.setting.isMixOtherPlayer]; //设置缓冲最小时长,卡顿时需加载到这里设置的时长才会恢复播放状态 [self.player setMinBufferTime:self.setting.minBufferTime]; //设置延时追赶时间,缓存时长超过此阈值时,进行追赶
[self.player setMaxCacheTime:self.setting.maxCacheTime]; //设置低延时模式,延时追赶采用变速播放进行,使追赶更加平滑,点播不生效 [self.player setShouldLowLatencyMode:self.setting.isLowLatencyMode]; //设置 HLS 码率自适应
[self.player setHLSAdaptation:self.setting.isHLSAdaptation];
//设置 HLS 码率自适应的默认播放码率
[self.player setDefaultHLSBitrate:self.setting.HLSDefaultBitrate];

//设置解码前缓冲队列大小,默认 15MB,设置值较大时则加载更多但影响内存占用 [self.player setMaxBufferSize:self.setting.maxBufferSize]; //设置缩放模式,参见 CncMpVideoScalingMode
[self.player setScalingMode:CNC_MP_VIDEO_SCALE_MODE_ASPECTFIT];
/*
设置是否开启精准 seek
精准 seek 会在触发 seek 时找到相应位置的关键帧后,
快速解码到 seek 位置,不会产生找关键帧而导致 seek 后位置左右跳动
*/
[self.player setEnableAccurateSeek:self.setting.isAccurateSeek]; //设置循环播放次数
[self.player setLoop:self.setting.loopCount];
//设置 HLS 解密参数
[_player openHLSEncryption:self.setting.isOpenHLSEncryption
withVideoID:self.setting.hlsDecryptionVideoId]; );

混淆配置

Android

混淆时,注意添加以下代码:

-keep class cnc.cad.validsdk.** { *;
}
-keep class com.cnc.mediaplayer.sdk.lib.** {
*; }
-keep class tv.danmaku.ijk.media.player.** { *;
}

如果使用到 CNCMediaPlayerSDK 包,添加以下这行

 -keep class com.cnc.mediaplayer.sdk.**{ *;
}

SDK 其他功能

详见随 SDK 一起提供的使用说明文档和 API 接口文档。