4 回复
楼主你好,你可以参考以下代码:
this.#decoder = media.createMediaDecoder();
this.#decoder.on('frameAvailable', (decoderFrame) => {
//解码后续帧事件回调类型
console.info('MediaDecoder[MediaDecoder] frameAvailable is called,'
+ 'size.width is :' + decoderFrame.size.width
+ ',size.height is :' + decoderFrame.size.height
+ ',时间戳:' + decoderFrame.pts
+ ',状态变化数据:' + decoderFrame.buffer
);
});
this.#decoder.start(uri, mediaType); //uri:视频源,mediaType:0(video)、1(audio)
this.#decoder.seek(timeMs); //跳转到指定帧
this.#decoder.requestFrame(); //开始解码
详情请参考官网: https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-media-0000001103383404
更多关于HarmonyOS鸿蒙Next ArkUI中如何获取mp4文件的第一帧图片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
欢迎开发小伙伴们进来帮帮楼主
在HarmonyOS鸿蒙Next中,使用ArkUI获取MP4文件的第一帧图片可以通过MediaExtractor
和Image
组件实现。首先,使用MediaExtractor
提取MP4文件的视频轨道,然后解码第一帧数据。具体步骤如下:
-
初始化MediaExtractor:
let mediaExtractor = new media.MediaExtractor(); mediaExtractor.setDataSource('path/to/your.mp4');
-
获取视频轨道:
let trackIndex = -1; for (let i = 0; i < mediaExtractor.getTrackCount(); i++) { let format = mediaExtractor.getTrackFormat(i); if (format.getString(media.MediaFormat.KEY_MIME).startsWith('video/')) { trackIndex = i; break; } } if (trackIndex === -1) { throw new Error('No video track found'); } mediaExtractor.selectTrack(trackIndex);
-
解码第一帧:
let mediaCodec = media.MediaCodec.createDecoderByType('video/avc'); let format = mediaExtractor.getTrackFormat(trackIndex); mediaCodec.configure(format, null, null, 0); mediaCodec.start(); let bufferInfo = new media.BufferInfo(); let inputBufferIndex = mediaCodec.dequeueInputBuffer(10000); if (inputBufferIndex >= 0) { let inputBuffer = mediaCodec.getInputBuffer(inputBufferIndex); let sampleSize = mediaExtractor.readSampleData(inputBuffer, 0); if (sampleSize > 0) { mediaCodec.queueInputBuffer(inputBufferIndex, 0, sampleSize, mediaExtractor.getSampleTime(), 0); mediaExtractor.advance(); } } let outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 10000); if (outputBufferIndex >= 0) { let outputBuffer = mediaCodec.getOutputBuffer(outputBufferIndex); let image = media.Image.create(outputBuffer, format); // 使用Image组件显示或保存第一帧图片 mediaCodec.releaseOutputBuffer(outputBufferIndex, true); }
-
释放资源:
mediaCodec.stop(); mediaCodec.release(); mediaExtractor.release();
通过以上步骤,可以在ArkUI中获取并显示MP4文件的第一帧图片。
在HarmonyOS鸿蒙Next的ArkUI中,获取MP4文件的第一帧图片可以通过MediaMetadataRetriever
类实现。首先,使用MediaMetadataRetriever
加载MP4文件,然后调用getFrameAtTime()
方法获取第一帧的Bitmap图像。最后,将Bitmap转换为Image组件可用的资源格式并显示。具体代码示例如下:
import media from '@ohos.multimedia.media';
let mediaMetadataRetriever = new media.MediaMetadataRetriever();
mediaMetadataRetriever.setSource('/path/to/your/video.mp4');
let bitmap = mediaMetadataRetriever.getFrameAtTime(0); // 获取第一帧
// 将bitmap转换为Image组件可用的资源并显示
确保在config.json
中声明多媒体权限。