HarmonyOS鸿蒙Next中用photoViewPicker.select方法让用户选择视频,返回的uri通过三方库的ffmpeg-tools工具类去提取音频出现报错 报错信息是Error: FFmpeg error: code=1
HarmonyOS鸿蒙Next中用photoViewPicker.select方法让用户选择视频,返回的uri通过三方库的ffmpeg-tools工具类去提取音频出现报错 报错信息是Error: FFmpeg error: code=1 用photoViewPicker.select方法让用户选择视频,返回的uri通过三方库的ffmpeg-tools工具类去提取音频出现报错 报错信息是Error: FFmpeg error: code=1
开发者您好,不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,类似使用一个按钮去触发打开文件。
而想要操作该文件,则需要先将文件保存到沙箱,再进一步对沙箱的路径文件进行处理,不允许直接修改非沙箱文件。
使用Picker选择媒体库资源:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/photoaccesshelper-photoviewpicker
应用沙箱目录:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-sandbox-directory
更多关于HarmonyOS鸿蒙Next中用photoViewPicker.select方法让用户选择视频,返回的uri通过三方库的ffmpeg-tools工具类去提取音频出现报错 报错信息是Error: FFmpeg error: code=1的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
photoViewPicker 返回的 URI 是 content:// 媒体库格式,FFmpeg 这类原生库无法直接识别访问。
错误 code=1 通常表示无法打开输入文件。解决思路:先将该 URI 指向的视频数据复制到应用沙箱目录,获得真实文件路径后再传给 ffmpeg。
示例代码(核心逻辑):
import { photoViewPicker } from '@kit.MediaLibraryKit';
import { fileIo } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 1. 选择视频
let picker = new photoViewPicker.PhotoViewPicker();
picker.select({ MIMEType: 'video/*', maxSelectNumber: 1 }).then((result) => {
let uri = result.photoUris[0]; // content://media/xxx
copyToSandbox(uri);
});
// 2. 拷贝到应用缓存目录并返回沙箱路径
async function copyToSandbox(uri: string) {
try {
let srcFile = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY);
let localPath = getContext().cacheDir + '/input.mp4';
let destFile = fileIo.openSync(localPath, fileIo.OpenMode.CREATE | fileIo.OpenMode.WRITE_ONLY);
let buffer = new ArrayBuffer(4096);
let readLen = 0;
while ((readLen = fileIo.readSync(srcFile.fd, buffer)) > 0) {
fileIo.writeSync(destFile.fd, buffer.slice(0, readLen));
}
fileIo.closeSync(srcFile);
fileIo.closeSync(destFile);
// 3. 将 localPath 传给 ffmpeg-tools 提取音频
// extractAudio(localPath);
} catch (e) {
console.error('复制文件失败', e);
}
}
之后将 localPath 作为输入传给 FFmpeg 即可正常处理。


