本文为您提供了使用Windows端播放器功能的操作步骤及SDK示例,通过本文内容您可以快速了解如何通过SDK使用Windows端播放器功能。
播放功能
Windows端播放器视频播放SDK操作步骤及功能示例如下:
- 创建播放器,示例如下:
如果有配置安全下载功能(即经过阿里云加密转码过后的),那么还需要设置一个加密校验信息,传入encryptedApp.dat文件的内容,请参见安全文件获取问题。using namespace alivc_player; AliPlayer* mPlayerPtr = AliPlayer::CreatePlayer();
mPlayerPtr->setListener(new AVPListenerImpl);
- 设置播放器Listener
播放器提供了各种事件回调,比如:onPlayerEvent,onError等事件。使用时需要一个类继承IAVPListener,并实现里面的纯虚函数。
mPlayerPtr->setListener(new AVPListenerImpl);
- 创建DataSource,准备播放
播放器支持4种播放源:
- AVPVidStsSource
- AVPVidAuthSource
- AVPVidMpsSource
- AVPUrlSource
AVPVidStsSource vidSource; vidSource.initWithVid(视频vid, "accessKeyId", "accessKeySecret", "安全token", "接入区域", nullptr); mPlayerPtr->setSource(vidSource); mPlayerPtr->prepare();
- 设置显示的view,示例如下:
mPlayerPtr->setView((void *)显示区域的HWND);
- 播放控制
在prepare成功之后(onPlayerEvent回调中收到eventType等于AVPEventPrepareDone的事件),用户可以开始播放及进行播放控制。用户自行创建播放器的播放控制按钮,在按钮事件里面实现播放器控制接口。基本控制功能有播放、停止、暂停、拖动(seek),其中Seek功能仅对点播有效,直播使用暂停功能时会使画面停留在当前画面,使用恢复后会开始播放当前画面。示例如下:
// 开始播放。 mPlayerPtr->start(); //暂停播放 mPlayerPtr->pause(); //停止播放 mPlayerPtr->stop(); // 跳转到特定时刻的视频画面。mode分为精确seek和非精确seek。非精确seek会跳转到向前最近的关键帧处。精确seek会精确到seek的时间,但比非精确seek慢一些。 mPlayerPtr->seekToTime(int64_t time_in_ms, mode); // 重置 mPlayerPtr->reset(); //销毁播放器 mPlayerPtr->destroy();
- 切换码率
播放器SDK支持HLS多码率地址播放。在prepare成功之后,通过getMediaInfo可以获取到各个码流的信息,即TrackInfo。示例如下:
在播放过程中,可以通过调用播放器的selectTrack方法切换播放的码流,切换的结果会在IAVPListener::onTrackChanged回调。示例如下:AVPMediaInfo mediaInfo = mPlayerPtr->getMediaInfo(); for (int i = 0; i < mediaInfo.trackCount; i++) { AVPTrackInfo *trackInfo = mediaInfo.tracks[i]; }
int trackIndex = trackInfo->trackIndex; mPlayerPtr->selectTrack(trackIndex);
- 自动播放
播放器SDK支持自动播放视频的设置。在prepare之前设置autoPlay。
设置自动播放之后,prepare成功之后,将会自动播放视频。示例如下:mPlayerPtr->setAutoPlay(true);
void onPlayerEvent(AliPlayer *player, AVPEventType eventType) { if (eventType == AVPEventPrepareDone) { //准备完成 } else if (eventType == AVPEventAutoPlayStart) { //自动起播完成 } }
注意 自动播放的时候将不会回调IAVPListener::onPlayerEvent中的AVPEventPrepareDone回调,而会回调AVPEventAutoPlayStart回调。 - 循环播放
播放器SDK提供了循环播放视频的功能。设置loop开启循环播放, 播放完成后,将会自动从头开始播放视频。同时循环开始的回调将会在AVPEventLoopingStart中通知。示例如下:
mPlayerPtr->setLoop(true);
- 画面旋转、填充、镜像操作
播放器SDK提供过了多种设置,可以对画面进行精确的控制。包括设置画面旋转模式,设置画面缩放模式,设置镜像模式。示例如下:
画面的旋转模式包括://设置画面的镜像模式:水平镜像,垂直镜像,无镜像。 mPlayerPtr->setMirrorMode(AVP_MIRRORMODE_HORIZONTAL); //设置画面旋转模式:旋转0度,90度,180度,270度 mPlayerPtr->setRotateMode(AVP_ROTATE_0); //设置画面缩放模式:宽高比填充,宽高比适应,拉伸填充 mPlayerPtr->setScalingMode(AVP_SCALINGMODE_SCALEASPECTFILL);
值 说明 AVP_ROTATE_0 顺时针旋转0度 AVP_ROTATE_90 顺时针旋转90度 AVP_ROTATE_180 顺时针旋转180度 AVP_ROTATE_270 顺时针旋转270度 值 说明 AVP_SCALINGMODE_SCALEASPECTFIT 宽高比适应(将按照视频宽高比等比缩小到view内部,不会有画面变形) AVP_SCALINGMODE_SCALEASPECTFILL 宽高比填充(将按照视频宽高比等比放大,充满view,不会有画面变形) AVP_SCALINGMODE_SCALETOFILL 拉伸填充(如果视频宽高比例与view比例不一致,会导致画面变形) 值 说明 AVP_MIRRORMODE_NONE 无镜像 AVP_MIRRORMODE_HORIZONTAL 水平镜像 AVP_MIRRORMODE_VERTICAL 垂直镜像 - 静音、音量控制
播放器SDK 提供了对视频的音量控制功能。设置mute播放器静音,设置volume控制音量大小,取值:0~2.0。示例如下:
mPlayerPtr->setMute(true); mPlayerPtr->setVolume(1.0f);
- 倍数播放
播放器SDK 提供了倍数播放视频的功能,通过设置rate方法, 能够以0.5倍~2倍数去播放视频。同时保持变声不变调。示例如下:
mPlayerPtr->setRate(1.5);
- 硬解开关
播放器SDK 提供了264,265的硬解码能力,同时提供了enableHardwareDecoder提供开关。默认开,并且在硬解初始化失败时,自动切换为软解,保证视频的正常播放。示例如下:
mPlayerPtr->enableHardwareDecoder(true);
- 设置Referer
播放器SDK提供了AVPConfig 用来设置请求referer。配合控制台的黑白名单referer,可以控制访问权限。示例如下:
//先获取配置 AVPConfig *pConfig = mPlayerPtr->getConfig(); //设置referer pConfig->referer = referer; ....//其他设置 //设置配置给播放器 mPlayerPtr->setConfig(pConfig);
- 设置UserAgent
播放器SDK提供了AVPConfig 用来设置请求UA。设置之后,播放器请求的过程中将会带上UA信息。示例如下:
//先获取配置 AVPConfig *pConfig = mPlayerPtr->getConfig(); //设置userAgent pConfig->userAgent = userAgent; ....//其他设置 //设置配置给播放器 mPlayerPtr->setConfig(pConfig);
- 配置网络重试时间和次数
通过AVPConfig,用户可以设置播放器SDK的网络超时的时间和重试次数。示例如下:
//先获取配置 AVPConfig *pConfig = mPlayerPtr->getConfig(); //设置网络超时时间,单位ms pConfig->networkTimeout = 5000; //设置超时重试次数。每次重试间隔为networkTimeout。networkRetryCount=0则表示不重试,重试策略app决定,默认值为2 pConfig->networkRetryCount = 2; ....//其他设置 //设置配置给播放器 mPlayerPtr->setConfig(pConfig);
说明- 如果设置了networkRetryCount:如此时发生网络问题,导致出现loading后,那么将会重试networkRetryCount次,每次的间隔时间为networkTimeout。
- 如果重试次数超过上限值之后,还是loading的状态,那么就会回调onError事件,此时AVPErrorModel.code为ERROR_LOADING_TIMEOUT。
- 如果networkRetryCount设置为0,当网络重试超时的时候,播放器就会回调onPlayerEvent,参数eventWithString为EVENT_PLAYER_NETWORK_RETRY。 此时可以调用播放器的reload方法进行重新加载网络,或者进行其他的处理。
- 配置缓存和延迟控制
对于播放器来说,缓存的控制非常重要。合理的配置,可以有效的加快起播速度,减少卡顿。播放器SDK通过AVPConfig提供了设置缓存和延迟的控制接口。示例如下:
//先获取配置 AVPConfig *pConfig = mPlayerPtr->getConfig(); //最大延迟。注意:直播有效。当延时比较大时,播放器sdk内部会追帧等,保证播放器的延时在这个范围内。 pConfig->maxDelayTime = 5000; // 最大缓冲区时长。单位ms。播放器每次最多加载这么长时间的缓冲数据。 pConfig->maxBufferDuration = 50000; //高缓冲时长。单位ms。当网络不好导致加载数据时,如果加载的缓冲时长到达这个值,结束加载状态。 pConfig->highBufferDuration = 3000; // 起播缓冲区时长。单位ms。这个时间设置越短,起播越快。也可能会导致播放之后很快就会进入加载状态。 pConfig->startBufferDuration = 500; //其他设置 //设置配置给播放器 mPlayerPtr->setConfig(pConfig);
注意 三个缓冲区时长的大小关系必须为:startBufferDuration<=highBufferDuration<=maxBufferDuration。 - 支持HTTP Header设置
播放器通过AVPConfig参数,可以给播放器中的请求加上http的header参数。示例如下:
//先获取配置 AVPConfig *pConfig = mPlayerPtr->getConfig(); //设置header pConfig->headerCount = 1; pConfig->httpHeaders = new char *[pConfig->headerCount]; //比如使用httpdns时,需要设置Host。 pConfig->httpHeaders[0] = strdup("Host:xxx.com"); ....//其他设置 //设置配置给播放器 mPlayerPtr->setConfig(pConfig);
- 截图功能
播放器SDK提供了对当前视频截图的功能 snapshot。截取的是原始的argb32格式的数据,回调接口为onSnapshotImageBuffer。示例如下:
//截取当前播放的画面 mPlayerPtr->snapshot(); //截图回调 void AlivcLivePlayerMainDlg::onSnapshotImageBuffer(AliPlayer *player, int width, int height, unsigned char *pARGBBuffer) { QString savePath = "save path"; QImage snapshot(pARGBBuffer, width, height, QImage::Format_ARGB32); snapshot.save(savePath); }
注意 截图不包含界面。 - 边播边缓存
播放器SDK提供了边播边缓存的功能,能够让用户重复播放视频时,达到省流量的目的。只需在prepare之前给播放器配置 AVPCacheConfig 即可实现此功能。如果播放了加密视频,还需要一个加密校验文件的配置,请参见本章节1.创建播放器。示例如下:
缓存成功之后,以下情况将会利用缓存文件(必须已经设置了setCacheConfig):AVPCacheConfig mCacheConfig; //开启缓存功能 mCacheConfig.enable = true; //能够缓存的单个文件最大时长。超过此长度则不缓存 mCacheConfig.maxDuration = 100; //缓存目录的最大大小。超过此大小,将会删除最旧的缓存文件 mCacheConfig.maxSizeMB = 200; //缓存目录的位置,需替换成app期望的路径 mCacheConfig.path = strdup("please use your cache path here"); //设置缓存配置给到播放器 mPlayerPtr->setCacheConfig(&mCacheConfig);
- 如果设置了循环播放,那么第二次播放的时候,将会自动播放缓存的文件。
- 缓存成功后,重新创建播放器,播放同样的资源,也会自动使用缓存文件。
注意 VID的缓存文件是通过vid等信息定位的,所以VID的缓存文件将需要网络请求信息之后才能确定使用哪个缓存文件。
- 对于直接播放URL的方式,即AVPUrlSource。如果是HLS(即m3u8)地址,将不会缓存。如果是其他支持的格式,则根据缓存配置进行缓存。
- 对于VID的方式播放,将会根据缓存配置进行缓存。
- 播放器读取完全部的数据则视为缓存成功。如果在此之前,调用stop,或者出错onError,则缓存将会失败。
- cache内的seek的操作不会影响缓存结果。cache外的seek会导致缓存失败。
- 如果加密文件与app信息不一致,将会缓存失败。
- cache的结果回调,会通过onPlayerEvent回调,EVENT_PLAYER_CACHE_SUCCESS,EVENT_PLAYER_CACHE_ERROR。
- 试看功能
当设置试看的时长,通过播放器SDK播放视频时,服务端将不会返回完整的视频内容,而是返回试看时间段的内容。播放器SDK 通过配合点播服务配置,可以实现试看功能,支持VidSts和VidAuth两种方式。配置和使用试看功能请参见点播试看。配置试看功能后,通过SDK的 VidPlayerConfigGenerator的setPreviewTime方法设置播放器的试看时长,以AVPVidStsSource为例。示例如下:
VidPlayerConfigGenerator playConfigGen; playConfigGen.setPreviewTime(10); AVPVidStsSource vidSource; vidSource.initWithVid(视频vid, "accessKeyId", "accessKeySecret", "安全token", "接入区域", playConfigGen.generatePlayerConfig()); mPlayerPtr->setSource(vidSource);
视频下载功能
阿里云SDK提供了点播服务视频的下载功能,能够通过VidSts和VidAuth下载点播服务上的视频。同时下载的方式提供了安全下载和普通下载的模式(在控制台设置)。
- 普通下载:使用点播服务加密视频后,下载的视频数据也不是经过阿里云加密的。用户可以用第三方播放器播放。
- 安全下载:使用点播服务没有加密视频,下载后的视频数据也是经过阿里云加密的。用户用第三方播放器是播放不了的。只能使用阿里云的播放器去播放。
- 创建下载器。示例如下:
下载SDK支持私有加密的下载。为了保证安全性,还需要设置一个加密校验信息,传入encryptedApp.dat文件的内容。示例如下:mMediaDownloader = AliMediaDownloader::CreateMediaDownloader(); mMediaDownloader->setListener(new AVDListenerImpl); mMediaDownloader->setSaveDirectory("saveDir");
InitPrivateService(fileContentBuffer, fileLength);
- 准备下载源
通过preapre方法准备下载源,支持下2种下载源:
- AVPVidStsSource
- AVPVidAuthSource
AVPVidStsSource vidSource; vidSource.initWithVid(视频vid, "accessKeyId", "accessKeySecret", "安全token", "接入区域", nullptr); mMediaDownloader->prepareWithVid(&vidSource);
- 准备成功后选择下载项
准备成功后,会回调onPrepared方法。选择某个Track进行下载,示例如下:
void YourClass::onPrepared(AliMediaDownloader *downloader, AVPMediaInfo *mediaInfo) { AVPTrackInfo *track = mediaInfo->tracks[0]; mMediaDownloader->selectTrack(track->trackIndex); }
- 更新下载源并开始下载
完成以上操作后,开始下载(为了防止VidSts和VidAuth过期,最好更新一下下载源的信息)。示例如下:
mMediaDownloader->updateWithVid(&vidSource); mMediaDownloader->start();
- 下载成功/失败后,释放下载器。
下载成功后,释放下载器。示例如下:
delete mMediaDownloader; mMediaDownloader = nullptr;
在文档使用中是否遇到以下问题
更多建议
匿名提交