简介

视频服务(HUAWEI Video Kit)提供视频播放服务,后续将提供视频编辑和视频托管服务,助力开发者快速构建视频特性,帮助开发者向用户提供视频媒体体验。

您将建立什么

在这个Codelab中,您将使用已经创建好的示例Sample实现对Video Kit的API调用,通过示例Sample您可以体验到:

您将会学到什么

硬件要求

软件要求

需要的知识点

Android基础开发能力

集成HUAWEI HMS Core能力,需要完成以下准备工作:

具体操作,请按照《HUAWEI HMS Core集成准备》中详细说明来完成。

添加AppGallery Connect配置文件

  1. 登录AppGallery Connect网站,点击"我的项目"。
  2. 在项目列表中找到您的项目,在项目中点击需要集成HMS Core SDK的应用。
  3. 在"项目设置"页面的"应用"区域,点击"agconnect-services.json"下载配置文件。
  4. 将"agconnect-services.json"文件拷贝到应用级根目录下。

添加SDK依赖

  1. 在项目级的build.gradle文件中,添加HUAWEI agcp插件以及Maven代码库。
    buildscript { repositories { ...... maven {url 'https://developer.huawei.com/repo/'} } dependencies { ...... classpath 'com.huawei.agconnect:agcp:1.6.0.300' // HUAWEI agcp plugin } } allprojects { repositories { ...... maven {url 'https://developer.huawei.com/repo/'} } }
  2. 打开应用级的build.gradle文件,添加HUAWEIagcp插件。
    apply plugin: 'com.android.application' // Add the following line apply plugin: 'com.huawei.agconnect' // HUAWEI agconnect Gradle plugin android { ...... }
  3. 在应用级app目录下的build.gradle中配置Maven依赖。
    dependencies { ...... implementation 'com.huawei.hms:videokit-player:1.0.14.300' }
  4. 如果您想在不依赖HMS Core(APK)的场景下使用Video Kit,则需在"dependencies"中添加如下编译依赖,集成两个fallback
    dependencies { implementation 'com.huawei.hms:videokit-player-fallback:1.0.14.300' }
  5. 在应用级app目录下的build.gradle中配置ndk配置。
    android { defaultConfig { ...... ndk { abiFilters "armeabi-v7a", "arm64-v8a" } } ...... }
  6. AndroidManifest.xml中添加权限。
    // 获取访问网络权限 <uses-permission android:name="android.permission.INTERNET" /> // 获取网络状态信息权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> // 获取访问wifi网络状态权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> // 获取写入存储权限 <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" /> // 获取检查手机是否root权限 <uses-permission android:name="com.huawei.permission.SECURITY_DIAGNOSE" /> // (可选)获取设置手机唤醒状态权限,调用setWakeMode方法需要添加该权限 <uses-permission android:name="android.permission.WAKE_LOCK" />

配置混淆脚本

开发者编译APK前需要配置混淆配置文件,避免混淆HMS Core SDK导致功能异常。
Android Studio开发环境里的配置文件是"proguard-rules.pro"。

  1. 打开Android Studio工程的混淆配置文件。
  2. 加入排除HMS Core SDK的混淆配置。
    -ignorewarnings -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.huawei.updatesdk.**{*;} -keep class com.huawei.hms.**{*;} -keep class com.huawei.hianalytics.**{*;} # 集成fallback SDK需要添加动态加载dynamic不混淆 -keep class com.huawei.hms.feature.dynamic.descriptors.huawei_module_videoplayer.AssetModuleDescriptor{*;}
  3. 如果开发者使用了AndResGuard,需要在混淆配置文件中加入AndResGuard允许清单。
    "R.string.hms*", "R.string.connect_server_fail_prompt_toast", "R.string.getting_message_fail_prompt_toast", "R.string.no_available_network_prompt_toast", "R.string.third_app_*", "R.string.upsdk_*", "R.layout.hms*", "R.layout.upsdk_*", "R.drawable.upsdk*", "R.color.upsdk*", "R.dimen.upsdk*", "R.style.upsdk*", "R.string.agc*"

初始化播放器

App需要实现一个继承Application的类,在onCreate()方法中调用播放器SDK初始化接口WisePlayerFactory.initFactory()。

public class VideoKitApplication extends Application { private static final String TAG = "VideoKitApplication"; private static WisePlayerFactory factory; @Override public void onCreate() { super.onCreate(); // setDeviceId方法需要传入手机的DeviceId // setServeCountry方法需要传入国家/地区码 WisePlayerFactoryOptionsExt.Builder factoryOptions = new WisePlayerFactoryOptionsExt.Builder().setDeviceId("xxx"); // 设置日志配置信息 LogConfigInfo logCfgInfo = new LogConfigInfo(1, "", 20, 1024); factoryOptions.setLogConfigInfo(logCfgInfo); // Application onCreate在多进程的场景下会被调用多次 // App需要在App进程(App包名)和播放器进程(App包名:player)的Application onCreate中调用WisePlayerFactory.initFactory()接口 WisePlayerFactory.initFactory(this, factoryOptions.build(), new InitFactoryCallback() { @Override public void onSuccess(WisePlayerFactory wisePlayerFactory) { Logger.d(TAG, "onSuccess wisePlayerFactory:" + wisePlayerFactory); factory = wisePlayerFactory; } @Override public void onFailure(int errorCode, String msg) { Logger.e(TAG, "onFailure errorcode:" + errorCode + " reason:" + msg); } }); } public static WisePlayerFactory getWisePlayerFactory() { return factory; } }

播放视频

  1. 创建继承自AppCompatActivity的PlayActivity,并实现Callback和SurfaceTextureListener接口。在布局文件中添加播放器显示的SurfaceView或者TextureView。同时需要实现播放器监听器接口,监听播放器状态变更。
    import android.view.SurfaceHolder.Callback; import android.view.TextureView.SurfaceTextureListener; public class PlayActivity extends AppCompatActivity implements Callback, SurfaceTextureListener, WisePlayer.ErrorListener, WisePlayer.ReadyListener, WisePlayer.EventListener, WisePlayer.PlayEndListener,WisePlayer.ResolutionUpdatedListener, WisePlayer.SeekEndListener, WisePlayer.LoadingListener
  2. 在Application中初始化播放器成功后会返回一个WisePlayerFactory实例,通过onCreate方法获取Application中的WisePlayerFactory实例,调用createWisePlayer()创建播放器。
    WisePlayer player = VideoKitApplication.getWisePlayerFactory().createWisePlayer();
  3. 初始化播放器布局,并添加布局监听事件。
    // 方式1:SurfaceView显示界面 SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surface_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 方式2:TextureView显示界面 TextureView textureView = (TextureView) findViewById(R.id.texture_view); textureView.setSurfaceTextureListener(this);
  4. 注册播放器监听事件,后面App根据监听回调做相应的处理。
    // 设置播放器错误信息上报监听器 player.setErrorListener(this); // 设置播放器媒体以及播放信息上报监听器 player.setEventListener(this); // 设置播放视频分辨率发生变化监听器 player.setResolutionUpdatedListener(this); // 设置媒体内容已经完成准备监听器 player.setReadyListener(this); // 设置播放器缓冲相关事件的监听器 player.setLoadingListener(this); // 设置播放完成监听器 player.setPlayEndListener(this); // 设置seek操作完成的监听器 player.setSeekEndListener(this);
  5. 设置播放类型、书签播放、循环播放等参数。
    player.setVideoType(PlayMode.PLAY_MODE_NORMAL); player.setBookmark(10000); player.setCycleMode(CycleMode.MODE_CYCLE);
  6. 设置播放地址。播放器提供了多个设置播放地址的接口,App按需调用。
    // 方式1:设置单个播放地址 player.setPlayUrl("https://videoplay-mos-dra.dbankcdn.com/P_VT/video_injection/92/v3/C072F990370950198572111872/MP4Mix_H.264_1920x1080_6000_HEAAC1_PVC_NoCut.mp4"); // 方式2:设置多个播放地址(同一个视频内容,主备播放地址) // player.setPlayUrl(new String[] {"https://videoplay-mos-dra.dbankcdn.com/P_VT/video_injection/92/v3/C072F990370950198572111872/MP4Mix_H.264_1920x1080_6000_HEAAC1_PVC_NoCut.mp4", "https://videoplay-mos-dra.dbankcdn.com/P_VT/video_injection/92/v3/C072F990370950198572111872/MP4Mix_H.264_1920x1080_6000_HEAAC1_PVC_NoCut.mp4"});
  7. 设置View,用于显示视频画面。播放器当前支持SurfaceView、TextureView,App要保证View可用,否则无法播放。
    // SurfaceView监听回调 @Override public void surfaceCreated(SurfaceHolder holder) { player.setView(surfaceView); } // TextureView监听回调 @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { player.setView(textureView); // 切换到前台需要调用resume接口,通过传入参数可以控制是否自动播放 player.resume(ResumeType.KEEP); }
  8. 准备播放,开始请求数据。
    player.ready();
  9. 在PlayActivity中实现WisePlayer.ReadyListener接口,在onReady的响应函数中开始播放。
    @Override public void onReady(WisePlayer wisePlayer) { player.start(); }

示例代码运行效果

在Android Studio中,点击图标,在设备上启动示例应用程序。程序运行界面如下:

首页界面

首页设置界面

播放界面

播放设置界面

干得好,您已经成功完成了Codelab并学到了

您可以阅读下面链接,了解更多相关的信息。
相关文档
您可以点击下方按钮下载源码。

源码下载

Code copied