HarmonyOS鸿蒙Next中如何获取视频文件的时长
HarmonyOS鸿蒙Next中如何获取视频文件的时长
当前需求是使用picker.PhotoSelectOptions
从相册获取视频后,将其拷贝到沙盒。 请问如何获取这个视频文件的时长。
4 回复
可以通过avMetadataExtractor.fetchMetadata获取音视频的元数据,参考文档:
更多关于HarmonyOS鸿蒙Next中如何获取视频文件的时长的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
大致意思就是fetchFame,从第一帧到最后一帧来对比,手动记录
async getVideoDuration(path: string, maxDurationEstimate: number = 300,
intervals: number = 100): Promise<number> {
try {
// Create test timestamps at regular intervals based on estimated duration
const testPoints: number[] = [];
const intervalDuration = maxDurationEstimate / intervals;
// Generate test timestamps (converting to milliseconds)
for (let i = 1; i <= intervals; i++) {
testPoints.push(Math.floor(i * intervalDuration * 1000));
}
// Variable to track max valid timestamp
let maxValidTimestamp = 0;
// Create AVImageGenerator once to improve performance
let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator();
// Set up file descriptor
const file = await FileUtil.createOrOpen(path);
const fileDescriptor: media.AVFileDescriptor = {
fd: file.fd,
offset: 0,
length: -1
};
avImageGenerator.fdSrc = fileDescriptor;
// Binary search to find approximate end of video
let low = 0;
let high = testPoints.length - 1;
let lastValidIndex = -1;
while (low <= high) {
const mid = Math.floor((low + high) / 2);
const timestamp = testPoints[mid];
try {
// Convert milliseconds to microseconds
const timeUs = timestamp * 1000;
const queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_CLOSEST;
const param: media.PixelMapParams = {
width: 50, // Very small size for quick testing
height: 50
};
// Attempt to get a frame at this timestamp
const pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param);
if (pixelMap) {
// This timestamp works, so video is at least this long
lastValidIndex = mid;
low = mid + 1;
pixelMap.release();
}
} catch (error) {
// If this timestamp fails, try earlier
high = mid - 1;
}
}
// Now we know the approximate end of the video (lastValidIndex)
if (lastValidIndex >= 0) {
maxValidTimestamp = testPoints[lastValidIndex];
}
// Release resources
await avImageGenerator.release();
// Convert to seconds with 2 decimal places for logging
const durationSec = Math.round(maxValidTimestamp / 10) / 100;
return maxValidTimestamp;
} catch (error) {
return 0;
}
}
在HarmonyOS鸿蒙Next中,获取视频文件时长可以通过AVPlayer
或AVMetadataExtractor
来实现。以下是具体步骤:
-
使用AVPlayer获取时长:
- 创建
AVPlayer
实例并设置视频源。 - 调用
getDuration()
方法获取视频时长。
import media from '[@ohos](/user/ohos).multimedia.media'; let avPlayer = new media.AVPlayer(); avPlayer.url = 'file:///path/to/video.mp4'; avPlayer.prepare().then(() => { let duration = avPlayer.getDuration(); console.log('视频时长:', duration); });
- 创建
-
使用AVMetadataExtractor获取时长:
- 创建
AVMetadataExtractor
实例并设置视频源。 - 调用
fetchMetadata()
方法获取元数据,从中提取视频时长。
import media from '[@ohos](/user/ohos).multimedia.media'; let metadataExtractor = new media.AVMetadataExtractor(); metadataExtractor.url = 'file:///path/to/video.mp4'; metadataExtractor.fetchMetadata().then((metadata) => { let duration = metadata['duration']; console.log('视频时长:', duration); });
- 创建
这两种方法均可在HarmonyOS鸿蒙Next中获取视频文件的时长。
在HarmonyOS鸿蒙Next中,可以通过AVMetadata
类获取视频文件的时长。首先,使用AVPlayer
加载视频文件,然后通过AVMetadata
的getDuration()
方法获取视频时长。具体步骤如下:
- 创建
AVPlayer
实例并加载视频。 - 使用
AVMetadata
获取视频元数据。 - 调用
getDuration()
方法获取时长,单位为毫秒。
示例代码:
AVPlayer player = new AVPlayer(context);
player.setSource(new AVFileDescriptor(fileDescriptor));
AVMetadata metadata = player.getMetadata();
long duration = metadata.getDuration();