HarmonyOS 鸿蒙Next media.AVPlayer 无法播放picker选择的视频uri

发布于 1周前 作者 ionicwang 来自 鸿蒙OS

HarmonyOS 鸿蒙Next media.AVPlayer 无法播放picker选择的视频uri

通过相机录制的视频,使用picker选中后获得该视频的uri,然后使用media.AVPlayer播放报错

关键代码:
// 1.uri转fd
let filePath = “file://media/Photo/13/Vx’x’x’x’x.mp4”;
let fd = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE).fd;
let state = fileIo.statSync(fd)
let avFileDescriptor: media.AVFileDescriptor = { fd:fd, offset: 0, length: state.size };
this.avPlayer.fdSrc = avFileDescriptor;

2 回复

AVPlayer设置url,有2种来源;

1:如果使用本地资源播放,必须确认资源文件可用,并使用应用沙箱路径访问对应资源,参考获取应用文件路径。应用沙箱的介绍及如何向应用沙箱推送文件,请参考文件管理。---也就是来源于沙箱路径

2:如果使用网络播放路径,需声明权限:ohos.permission.INTERNET。

3:如果使用ResourceManager.getRawFd打开HAP资源文件描述符,使用方法可参考ResourceManager API参考。

关于这块说明可参考官方文档该链接下的设置资源环节:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/using-avplayer-for-playback-V5#开发步骤及注意事项

有个demo可供伙伴参考,同样Video组件如何播放图库内的某一个视频,可以拿到url后直接播放吗?不可以,需要复制到沙箱中;

如下是video组件播放图库视频得demo,可以直接运行,思路就是先拉起视频选择获得url后,将视频资源copy到沙箱中,然后播放</p

import photoAccessHelper from '@ohos.file.photoAccessHelper';

import fs from '@ohos.file.fs';

import { BusinessError } from '@ohos.base';

import common from '@ohos.app.ability.common';

@Entry

@Component

struct Index {

  private controller: VideoController | undefined;

  @State  videoSrc: string = ''

  private context = getContext(this) as common.UIAbilityContext;

  build() {

    Column({ space: 30 }) {

      Button('选择视频')

        .width(200)

        .height(30)

        .onClick(() => {

          this.PickerVideo()

        })

      Video({

        src: this.videoSrc,

        controller: this.controller

      })

        .width('100%')

        .height(300)

    }

    .width('100%')

    .height('100%')

  }

  PickerVideo() {

    let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();

    PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.VIDEO_TYPE;

    PhotoSelectOptions.maxSelectNumber = 5;

    let photoPicker = new photoAccessHelper.PhotoViewPicker();

    photoPicker.select(PhotoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {

      const fileUri = photoSelectResult.photoUris[0]

      console.info('photoViewPicker.select to file succeed and uris are:' + fileUri);

      this.getFileInfo(fileUri)

    }).catch((err: BusinessError) => {

      console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);

    })

  }

  async getFileInfo(filePathString: string) {

    let resFile = fs.openSync(filePathString, fs.OpenMode.READ_ONLY)

    const dateStr = (new Date().getTime()).toString()

    // 临时文件目录

    let newPath =  this.context.filesDir + `/${dateStr + resFile.name}`;

    // 转化路径

    fs.copyFileSync(resFile.fd, newPath);

    // 新的路径

    let realUri = 'file://' + newPath;

    this.videoSrc = realUri

    console.log(this.videoSrc)

  }

}

针对您提到的HarmonyOS鸿蒙系统中Next media.AVPlayer无法播放通过picker选择的视频URI的问题,这通常可能是由于URI格式不正确、权限设置不足或AVPlayer的使用方式有误所导致。

  1. URI格式检查:确保从picker获取的URI是有效的,并且格式符合AVPlayer的要求。有时URI可能包含非法字符或路径错误,需要对其进行适当的编码和格式化。

  2. 权限验证:检查应用是否已正确申请并获得了读取外部存储的权限。在HarmonyOS中,访问外部存储需要显式声明权限并在运行时请求。

  3. AVPlayer使用:确认AVPlayer的初始化及播放逻辑是否正确。包括设置数据源、准备播放、监听播放状态等步骤是否按照官方文档正确执行。

  4. 系统兼容性:检查您的代码是否兼容当前HarmonyOS的版本,有时系统更新会带来API的变化或限制。

如果上述检查后问题依旧没法解决,请直接联系官网客服,他们将提供更具体的帮助。官网地址是:https://www.itying.com/category-93-b0.html 。这样可以确保您的问题得到专业且及时的解决。

回到顶部