作为多媒体应用的开发者,你是否想为媒体播放器快速开发创新AI功能?例如:

  • 在播放低画质视频过程中对其进行逐帧超分
  • 让满屏飘飞的弹幕自动绕过画面的主体人物

HMS Core 6.0.0开放的多媒体管线服务(AV Pipeline Kit),帮助媒体应用开发者降低创新功能的开发难度。通过定义插件的标准接口和数据流在插件之间的流转方式,开发者只需要按照标准接口完成插件开发,就可以迅速构建出新型的媒体场景。

多媒体管线服务(AV Pipeline Kit)定义了一套插件标准接口,且已经内置了对插件的数据流管理、线程管理、内存管理、消息管理等,开发者只需要实现插件的核心处理逻辑即可,无需关注线程同异步、流控、音视频同步等逻辑。目前已预置了3个可应用在播放场景的Pipeline:视频播放、视频超分、声音事件检测,并提供Java接口供开发者使用,同时也支持开发者通过C++接口直接调用单个预置插件。若预置插件或预置Pipeline不满足使用要求,开发者可以自定义插件、自定义Pipeline。

下面我们详细描述内置的高性能视频超分插件,穿插在视频流的解码和显示流程之间,将低分辨率视频实时转换成高分辨率视频,改善视频清晰度,增加视频细节表现力,提升用户观看体验。

1. 新建Android Studio工程,修改工程级build.gradle文件如下
在“allprojects > repositories”里面增加Maven仓地址。

  1. allprojects {
  2. repositories {
  3. google()
  4. jcenter()
  5. maven {url \'https://developer.huawei.com/repo/\'}
  6. }
  7. }

2. 修改项目级build.gradle文件如下
targetSdkVersion设为28;并在dependencies中添加编译依赖。

  1. dependencies {
  2. implementation \'com.huawei.hms:avpipelinesdk:6.0.0.302\'
  3. implementation \'com.huawei.hms:avpipeline-aidl:6.0.0.302\'
  4. implementation \'com.huawei.hms:avpipeline-fallback-base:6.0.0.302\'
  5. implementation \'com.huawei.hms:avpipeline-fallback-cvfoundry:6.0.0.302\'
  6. }

3. 配置manifest
修改AndroidManifest.xml文件,添加读取外部存储的权限。

  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

4. 同步工程

点击工具栏中的gradle同步图标,完成“build.gradle”文件的同步,将相关依赖下载到本地。

详细示例代码请参见GitHub

1. 动态申请存储权限

  1. String[] permissionLists = {
  2. Manifest.permission.READ_EXTERNAL_STORAGE
  3. };
  4. int requestPermissionCode = 1;
  5. for (String permission : permissionLists) {
  6. if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
  7. ActivityCompat.requestPermissions(this, permissionLists, requestPermissionCode);
  8. }
  9. }

2. 初始化AV Pipeline框架

  1. Context context = getApplicationContext();
  2. boolean ret = AVPLoader.initFwk(context);
  3. if(!ret) return;

3. 创建MediaPlayer实例

播放过程的控制由该实例来完成。

  1. MediaPlayer mPlayer = MediaPlayer.create(MediaPlayer.PLAYER_TYPE_AV);
  2. if (mPlayer == null) return;

4. 设置graph配置文件
AV Pipeline框架依赖于该配置文件来编排各个插件。此外还需要将MEDIA_ENABLE_CV的值设置为1,使能视频超分插件。

  1. MediaMeta meta = new MediaMeta();
  2. meta.setString(MediaMeta.MEDIA_GRAPH_PATH, getExternalFilesDir(null).getPath() + "/PlayerGraphCV.xml");
  3. meta.setInt32(MediaMeta.MEDIA_ENABLE_CV, 1);
  4. mPlayer.setParameter(meta);

5. 设置以下参数后调用prepare接口,启动MediaPlayer准备工作。
若需要监听某些事件,通过setOnPreparedListener、setOnErrorListener等接口设置回调函数。(可选)

  1. // 设置视频渲染的surface
  2. SurfaceView mSurfaceVideo = findViewById(R.id.surfaceViewup);
  3. SurfaceHolder mVideoHolder = mSurfaceVideo.getHolder();
  4. mVideoHolder.addCallback(new SurfaceHolder.Callback() {
  5. // 用户自定义回调函数内容,可参考codelab_视频播放
  6. });
  7. mPlayer.setVideoDisplay(mVideoHolder.getSurface());
  8. // 设置待播放媒体文件的路径
  9. mPlayer.setDataSource(mFilePath);
  10. // 若需要监听某些事件,则还需要通过setXXXListener接口设置回调函数
  11. // 例如需要监听prepare完成的事件,需进行如下设置
  12. mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  13. @Override
  14. public void onPrepared(MediaPlayer mp, int param1, int param2, MediaParcel parcel) {
  15. // 用户自定义回调函数内容
  16. }
  17. });
  18. mPlayer.prepare();

6. 调用start开始播放

  1. mPlayer.start();

7. 调用stop停止播放

  1. mPlayer.stop();

8. 销毁播放器

  1. mPlayer.reset();
  2. mPlayer.release();

9. 其他注意事项
视频超分插件的约束详见文档

访问华为多媒体管线服务官网,了解更多相关内容
获取华为多媒体管线服务开发指导文档
华为多媒体管线服务开源仓库地址GitHubGitee
华为HMS Core官方论坛
解决集成问题请到Stack Overflow

点击右上角头像右方的关注,第一时间了解HMS Core最新技术~

版权声明:本文为hmscore原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hmscore/p/15099206.html