HarmonyOS鸿蒙Next中使用media kit播放视频,使用的沙盒路径,播放黑屏

HarmonyOS鸿蒙Next中使用media kit播放视频,使用的沙盒路径,播放黑屏 【问题描述】:media kit使用沙盒路径播放视频黑屏

【问题现象】:media kit avplayer播放视频黑屏

【版本信息】:DevEco Studio 6.0.1 Release  api版本21

【复现代码】:不适用

【尝试解决方案】:保存视频文件到沙盒路径 权限申请

5 回复

尊敬的开发者,您好,

关于您的反馈的问题,非常抱歉,回复偏慢。

AVPlayer的surfaceId属性只能在AVPlayer处于initialized状态下初始化。伙伴的代码中,在创建AVPlayer后直接设置surfaceId,此时AVPlayer处于idle状态,无法初始化surfaceId。具体可参考:使用AVPlayer播放视频中的播放状态变化示意图、AVPlayer属性中surfaceId。

async initAVPlayer() {
    if (!this.surfaceId) {
      console.error('surfaceId not ready');
      return;
    }
    // 创建AVPlayer,创建后AVPlayer处于idle状态
    this.avPlayer = await media.createAVPlayer();
    // idle状态下无法初始化surfaceId
    this.avPlayer.surfaceId = this.surfaceId
  }
this.avPlayer = await media.createAVPlayer();
this.avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
    switch (state) {
      case 'initialized':
        if (this.avPlayer) {
          this.avPlayer.surfaceId = this.surfaceId;
        }
        console.info('initialized prepared called');
        break;
      // ...
      default:
        console.info('unknown state :' + state);
        break;
    }
}

更多关于HarmonyOS鸿蒙Next中使用media kit播放视频,使用的沙盒路径,播放黑屏的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


学习了

为什么我的没有通过,

鸿蒙Next中media kit播放视频黑屏问题

沙盒路径需使用正确的URI格式。确保路径以file:///data/storage/el2/base/haps/开头,并包含应用包名和文件路径。

检查文件是否存在及权限设置,使用ohos.file.fs API验证可访问性。

确认视频编码格式支持,如H.264/AVC。

根据你的描述,在HarmonyOS Next(API 21)中使用Media Kit的AVPlayer播放沙盒路径视频出现黑屏,这是一个典型的路径或权限问题。核心原因在于应用沙盒目录的访问权限在HarmonyOS Next中管理严格。

最可能的原因是AVPlayer没有权限直接读取应用私有目录(沙盒)下的文件。在HarmonyOS Next中,即使应用自身创建了文件,Media Kit服务(作为一个独立的安全进程)默认也无法直接访问你的应用沙盒路径。

解决方案是使用FileDescriptor(文件描述符)来提供访问。

请按以下步骤操作:

  1. 获取沙盒文件路径:首先,确保你的视频文件已正确保存到应用沙盒目录,例如 context.filesDircontext.cacheDir 下。获取该文件的绝对路径。

  2. 使用FileDescriptor打开文件:不要直接将 file:// 路径字符串(如 ‘file://’ + absolutePath)传递给AVPlayer。你需要使用 ohos.file.fs 模块打开文件,获取一个 FileDescriptor 对象。

    import fs from '@ohos.file.fs';
    // ... 假设你的文件绝对路径是 filePath
    let file;
    try {
      file = await fs.open(filePath, fs.OpenMode.READ_ONLY);
      let fd = file.fd; // 这是关键的文件描述符
    } catch (error) {
      console.error('Failed to open file with error: ' + error);
      return;
    }
    
  3. 配置AVPlayer的Source:在设置AVPlayer的 AVPlayerSource 时,使用 fdSrc 属性来传递这个文件描述符。

    import media from '@ohos.multimedia.media';
    // ... 创建avPlayer实例后
    let avPlayerSource = {
      fdSrc: {
        fd: fd, // 步骤2中获取的fd
        offset: 0, // 文件起始偏移量,通常为0
        length: -1 // 文件长度,-1表示直到文件末尾
      }
    };
    avPlayer.src = avPlayerSource;
    
  4. 记得关闭文件:在播放结束后或组件销毁时,记得关闭打开的文件描述符。

    fs.close(file);
    

关键点总结

  • 直接传递沙盒路径字符串给AVPlayer在HarmonyOS Next上通常无效,因为跨进程访问被限制。
  • 必须通过 fs.open() 获取 FileDescriptor,并将其通过 fdSrc 配置给AVPlayer。这样系统内核会管理权限,允许Media Kit服务安全地读取文件内容。
  • 确保你的应用已经申请了必要的存储权限(ohos.permission.READ_MEDIAohos.permission.MEDIA_LOCATION,根据视频来源),但这对私有沙盒文件通常不是主因,主因是上述的访问方式。

按照此方法将路径访问改为FileDescriptor方式,应该能解决沙盒视频播放黑屏的问题。

回到顶部