本文为您提供了使用Windows端播放器功能的操作步骤及SDK示例,通过本文内容您可以快速了解如何通过SDK使用Windows端播放器功能。

播放功能

Windows端播放器视频播放SDK操作步骤及功能示例如下:

  1. 创建播放器,示例如下:
    using namespace alivc_player;
    AliPlayer* mPlayerPtr = AliPlayer::CreatePlayer();
    如果有配置安全下载功能(即经过阿里云加密转码过后的),那么还需要设置一个加密校验信息,传入encryptedApp.dat文件的内容,请参见安全文件获取问题
    mPlayerPtr->setListener(new AVPListenerImpl);
  2. 设置播放器Listener
    播放器提供了各种事件回调,比如:onPlayerEvent,onError等事件。使用时需要一个类继承IAVPListener,并实现里面的纯虚函数。
    mPlayerPtr->setListener(new AVPListenerImpl);
  3. 创建DataSource,准备播放
    播放器支持4种播放源:
    • AVPVidStsSource
    • AVPVidAuthSource
    • AVPVidMpsSource
    • AVPUrlSource
    其中AVPUrlSource是直接通过url进行播放,其余的三种是通过vid进行播放:点播用户推荐使用AVPVidAuthSource;AVPVidMpsSource仅限MPS用户使用。以VidSts举例,示例如下:
    AVPVidStsSource vidSource;
    vidSource.initWithVid(视频vid,
                            "accessKeyId",
                            "accessKeySecret",
                            "安全token",
                            "接入区域",
                            nullptr);
    mPlayerPtr->setSource(vidSource);
    mPlayerPtr->prepare();
  4. 设置显示的view,示例如下:
    mPlayerPtr->setView((void *)显示区域的HWND);
  5. 播放控制
    在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();
  6. 切换码率
    播放器SDK支持HLS多码率地址播放。在prepare成功之后,通过getMediaInfo可以获取到各个码流的信息,即TrackInfo。示例如下:
    AVPMediaInfo mediaInfo = mPlayerPtr->getMediaInfo();
    for (int i = 0; i < mediaInfo.trackCount; i++) {
        AVPTrackInfo *trackInfo = mediaInfo.tracks[i];
    }
    在播放过程中,可以通过调用播放器的selectTrack方法切换播放的码流,切换的结果会在IAVPListener::onTrackChanged回调。示例如下:
    int trackIndex = trackInfo->trackIndex;
    mPlayerPtr->selectTrack(trackIndex);
  7. 自动播放
    播放器SDK支持自动播放视频的设置。在prepare之前设置autoPlay。
    mPlayerPtr->setAutoPlay(true);
    设置自动播放之后,prepare成功之后,将会自动播放视频。示例如下:
    void onPlayerEvent(AliPlayer *player, AVPEventType eventType)
    {
        if (eventType == AVPEventPrepareDone) {
            //准备完成
        }
        else if (eventType == AVPEventAutoPlayStart) {
            //自动起播完成
        }
    }
    注意 自动播放的时候将不会回调IAVPListener::onPlayerEvent中的AVPEventPrepareDone回调,而会回调AVPEventAutoPlayStart回调。
  8. 循环播放
    播放器SDK提供了循环播放视频的功能。设置loop开启循环播放, 播放完成后,将会自动从头开始播放视频。同时循环开始的回调将会在AVPEventLoopingStart中通知。示例如下:
    mPlayerPtr->setLoop(true);
  9. 画面旋转、填充、镜像操作
    播放器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 垂直镜像
  10. 静音、音量控制
    播放器SDK 提供了对视频的音量控制功能。设置mute播放器静音,设置volume控制音量大小,取值:0~2.0。示例如下:
    mPlayerPtr->setMute(true);
    mPlayerPtr->setVolume(1.0f);
  11. 倍数播放
    播放器SDK 提供了倍数播放视频的功能,通过设置rate方法, 能够以0.5倍~2倍数去播放视频。同时保持变声不变调。示例如下:
    mPlayerPtr->setRate(1.5);
  12. 硬解开关
    播放器SDK 提供了264,265的硬解码能力,同时提供了enableHardwareDecoder提供开关。默认开,并且在硬解初始化失败时,自动切换为软解,保证视频的正常播放。示例如下:
    mPlayerPtr->enableHardwareDecoder(true);
  13. 设置Referer
    播放器SDK提供了AVPConfig 用来设置请求referer。配合控制台的黑白名单referer,可以控制访问权限。示例如下:
    //先获取配置
    AVPConfig *pConfig = mPlayerPtr->getConfig();
    //设置referer
    pConfig->referer = referer;
    ....//其他设置
    //设置配置给播放器
    mPlayerPtr->setConfig(pConfig);
  14. 设置UserAgent
    播放器SDK提供了AVPConfig 用来设置请求UA。设置之后,播放器请求的过程中将会带上UA信息。示例如下:
    //先获取配置
    AVPConfig *pConfig = mPlayerPtr->getConfig();
    //设置userAgent
    pConfig->userAgent = userAgent;
    ....//其他设置
    //设置配置给播放器
    mPlayerPtr->setConfig(pConfig);
  15. 配置网络重试时间和次数
    通过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方法进行重新加载网络,或者进行其他的处理。
  16. 配置缓存和延迟控制
    对于播放器来说,缓存的控制非常重要。合理的配置,可以有效的加快起播速度,减少卡顿。播放器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。
  17. 支持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);
  18. 截图功能
    播放器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);
    }
    注意 截图不包含界面。
  19. 边播边缓存
    播放器SDK提供了边播边缓存的功能,能够让用户重复播放视频时,达到省流量的目的。只需在prepare之前给播放器配置 AVPCacheConfig 即可实现此功能。如果播放了加密视频,还需要一个加密校验文件的配置,请参见本章节1.创建播放器。示例如下:
    AVPCacheConfig mCacheConfig;
    //开启缓存功能
    mCacheConfig.enable = true;
    //能够缓存的单个文件最大时长。超过此长度则不缓存
    mCacheConfig.maxDuration = 100;
    //缓存目录的最大大小。超过此大小,将会删除最旧的缓存文件
    mCacheConfig.maxSizeMB = 200;
    //缓存目录的位置,需替换成app期望的路径
    mCacheConfig.path = strdup("please use your cache path here");
    //设置缓存配置给到播放器
    mPlayerPtr->setCacheConfig(&mCacheConfig);
    缓存成功之后,以下情况将会利用缓存文件(必须已经设置了setCacheConfig):
    • 如果设置了循环播放,那么第二次播放的时候,将会自动播放缓存的文件。
    • 缓存成功后,重新创建播放器,播放同样的资源,也会自动使用缓存文件。
      注意 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。
  20. 试看功能
    当设置试看的时长,通过播放器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下载点播服务上的视频。同时下载的方式提供了安全下载和普通下载的模式(在控制台设置)。
  • 普通下载:使用点播服务加密视频后,下载的视频数据也不是经过阿里云加密的。用户可以用第三方播放器播放。
  • 安全下载:使用点播服务没有加密视频,下载后的视频数据也是经过阿里云加密的。用户用第三方播放器是播放不了的。只能使用阿里云的播放器去播放。
Windows端播放器视频下载功能SDK操作步骤如下:
  1. 创建下载器。示例如下:
    mMediaDownloader = AliMediaDownloader::CreateMediaDownloader();
    mMediaDownloader->setListener(new AVDListenerImpl);
    mMediaDownloader->setSaveDirectory("saveDir");
    下载SDK支持私有加密的下载。为了保证安全性,还需要设置一个加密校验信息,传入encryptedApp.dat文件的内容。示例如下:
    InitPrivateService(fileContentBuffer, fileLength);
  2. 准备下载源
    通过preapre方法准备下载源,支持下2种下载源:
    • AVPVidStsSource
    • AVPVidAuthSource
    以AVPVidStsSource举例。示例如下:
    AVPVidStsSource vidSource;
    vidSource.initWithVid(视频vid,
                            "accessKeyId",
                            "accessKeySecret",
                            "安全token",
                            "接入区域",
                            nullptr);
    mMediaDownloader->prepareWithVid(&vidSource);
  3. 准备成功后选择下载项
    准备成功后,会回调onPrepared方法。选择某个Track进行下载,示例如下:
    void YourClass::onPrepared(AliMediaDownloader *downloader, AVPMediaInfo *mediaInfo) {
        AVPTrackInfo *track = mediaInfo->tracks[0];
        mMediaDownloader->selectTrack(track->trackIndex);
    }
  4. 更新下载源并开始下载
    完成以上操作后,开始下载(为了防止VidSts和VidAuth过期,最好更新一下下载源的信息)。示例如下:
    mMediaDownloader->updateWithVid(&vidSource);
    mMediaDownloader->start();
  5. 下载成功/失败后,释放下载器。
    下载成功后,释放下载器。示例如下:
    delete mMediaDownloader;
    mMediaDownloader = nullptr;