HarmonyOS 鸿蒙Next中通过图库拿到视频路径如何转化成可以编辑视频的实际路径呢

HarmonyOS 鸿蒙Next中通过图库拿到视频路径如何转化成可以编辑视频的实际路径呢

5 回复

步骤概述:

  1. 使用图库选择器(PhotoViewPicker)选择视频,获取视频的媒体库URI。
  2. 通过PhotoAccessHelper获取PhotoAsset对象,使用URI检索对应的媒体资源。
  3. 使用MediaAssetManager.requestVideoFile将视频文件写入应用沙箱,得到可访问的沙箱路径,该路径可用于编辑视频。

详细步骤:

1. 使用PhotoViewPicker选择视频,获取URI

首先,通过图库选择器(PhotoViewPicker)选择视频文件,返回视频的媒体库URI。这些URI具有永久授权,可用于后续操作。

import { picker } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 创建PhotoViewPicker实例
const photoViewPicker = new picker.PhotoViewPicker();
// 设置选择选项:选择视频类型,最大选择数量为1
const photoSelectOptions: picker.PhotoSelectOptions = {
  MIMEType: picker.PhotoViewMIMETypes.VIDEO_TYPE,
  maxSelectNumber: 1
};

// 拉起图库选择视频
photoViewPicker.select(photoSelectOptions).then((photoSelectResult: picker.PhotoSelectResult) => {
  const videoUri = photoSelectResult.photoUris[0]; // 获取第一个视频的URI
  console.info('Selected video URI: ' + videoUri);
  // 调用下一步:通过URI获取PhotoAsset
  getPhotoAssetFromUri(videoUri);
}).catch((err: BusinessError) => {
  console.error(`PhotoViewPicker failed, code: ${err.code}, message: ${err.message}`);
});

2. 通过PhotoAccessHelper获取PhotoAsset对象

使用获取的URI,通过PhotoAccessHelper的getAssets方法检索对应的PhotoAsset对象。PhotoAsset代表媒体资源,可用于请求文件数据。

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { dataSharePredicates } from '@kit.ArkData';

async function getPhotoAssetFromUri(uri: string) {
  let phAccessHelper: photoAccessHelper.PhotoAccessHelper; // 假设已初始化
  const predicates = new dataSharePredicates.DataSharePredicates();
  predicates.equalTo(photoAccessHelper.PhotoKeys.URI, uri); // 根据URI检索
  const fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [], // 可选:指定需要获取的列
    predicates: predicates
  };

  try {
    const fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions);
    const photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
    console.info('PhotoAsset obtained: ' + photoAsset.displayName);
    // 调用下一步:将视频写入沙箱路径
    requestVideoToSandbox(photoAsset);
  } catch (err) {
    console.error('getAssets failed with err: ' + err);
  }
}

3. 使用MediaAssetManager.requestVideoFile将视频写入沙箱路径

通过MediaAssetManager的requestVideoFile方法,将视频资源写入应用沙箱路径。该方法返回Promise,表示写入文件的沙箱路径,该路径可直接用于编辑操作。

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { common } from '@kit.AbilityKit';

async function requestVideoToSandbox(photoAsset: photoAccessHelper.PhotoAsset) {
  const context: common.Context = ...; // 获取Ability上下文
  const requestOptions: photoAccessHelper.RequestOptions = {
    // 配置请求选项,例如质量、模式等(RequestOptions需根据需求设置)
  };
  const fileUri = 'file://com.example.temptest/data/storage/el2/base/haps/entry/files/edit_video.mp4'; // 目标沙箱路径,确保目录存在且有写权限
  const dataHandler: photoAccessHelper.MediaAssetDataHandler<boolean> = {
    onDataPrepared: (data: boolean) => {
      if (data) {
        console.info('Video file written to sandbox successfully.');
        // 此时fileUri即为可编辑的实际路径,可用于视频编辑API
        editVideo(fileUri);
      } else {
        console.error('Failed to write video file.');
      }
    }
  };

  try {
    const requestId = await photoAccessHelper.MediaAssetManager.requestVideoFile(context, photoAsset, requestOptions, fileUri, dataHandler);
    console.info('Request ID: ' + requestId);
    // 注意:写入操作是异步的,实际路径在onDataPrepared回调中确认
  } catch (err) {
    console.error('requestVideoFile failed, code: ' + err.code + ', message: ' + err.message);
  }
}

function editVideo(videoPath: string) {
  // 使用videoPath进行视频编辑,例如调用视频编辑API或文件操作
  console.info('Editing video at path: ' + videoPath);
}

注意事项:

  • 权限要求:上述步骤需要申请相册管理模块权限ohos.permission.READ_IMAGEVIDEO。如果通过Picker选择,则不需要额外申请权限。
  • 错误处理:每个步骤都可能抛出错误,请根据错误码进行适当处理。
  • 沙箱路径:应用沙箱路径是应用私有的,确保路径正确且有写权限。示例路径为file://com.example.temptest/...,请替换为您的实际应用沙箱路径。

更多关于HarmonyOS 鸿蒙Next中通过图库拿到视频路径如何转化成可以编辑视频的实际路径呢的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


使用 PhotoViewPicker 选择视频
通过系统组件获取视频的 URI(类似 file://media/photo/1),此时需注意该 URI 并非可直接访问的物理路径:

通过图库选择器获取视频的原始URI:

// 调用图库选择器获取视频URI
let photoSelectResult = await photoViewPicker.select({
  MIMEType: photoAccessHelper.PhotoViewMIMETypes.VIDEO_TYPE,
  maxSelectNumber: 1
});
let videoUri = photoSelectResult.photoUris;

通过文件描述符访问视频资源:

// 打开文件描述符
let fileAlbum = fileIo.openSync(videoUri, fileIo.OpenMode.READ_ONLY);
let avFileDescriptor = { fd: fileAlbum.fd };

// 创建媒体处理器
let avImageGenerator = await media.createAVImageGenerator();
avImageGenerator.fdSrc = avFileDescriptor;

通过文件描述符转换为可访问路径:

// 获取应用沙箱路径
let context = getContext(this);
let sandboxPath = context.filesDir + '/video_cache.mp4';

// 将文件复制到沙箱目录
fileIo.copyFileSync(videoUri, sandboxPath);

在HarmonyOS鸿蒙Next中,通过图库获取的URI需使用@ohos.file.fs模块转换为实际路径。调用fs.getFileAccessAbility()获取文件访问助手,再通过getFileAssetsFromUri(uri)获取文件资源对象,使用open()方法打开文件后,可通过path属性获取实际可编辑的沙箱路径。注意需申请ohos.permission.READ_IMAGEVIDEO权限。

在HarmonyOS Next中,通过图库获取的视频URI(如content://media/…)需要通过文件管理API转换为实际可编辑的文件路径。可以使用@ohos.file.fs@ohos.fileuri模块处理:

  1. 使用getFileAccessAbility()获取文件访问能力,通过openFile()打开URI对应的文件。
  2. 通过fs.openSync()fs.fdToPath()将文件描述符转换为实际路径(如/data/storage/...)。
  3. 注意权限声明:需在module.json5中请求ohos.permission.READ_MEDIA和文件访问权限。

示例代码:

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

let uri = "content://media/..."; // 从图库获取的URI
let file = await fileUri.getFileAccessAbility().openFile(uri);
let fd = fs.openSync(file.uri, fs.OpenMode.READ_WRITE);
let realPath = fs.fdToPath(fd);
// realPath即为可编辑的实际路径

确保目标路径具备读写权限,方可进行后续视频编辑操作。

回到顶部