HarmonyOS 使用XComponent 播放视频通过等比例缩放调整播放区域,通过截图功能截取出的图片显示异常
操作步骤:
1、视频等比例显示,调整播放区域。
this.xComponentController!.setXComponentSurfaceRect({offsetX:offX,offsetY:offY,surfaceWidth:videoWidth ,surfaceHeight:videoHeight});2、读取pixmap:
public async getVideoFrame():Promise<PixelMap>{ 
 let rect:SurfaceRect = this.xComponentController?.getXComponentSurfaceRect() as SurfaceRect; 
 let region: image.Region = { x:rect.offsetX as number, y:rect.offsetY as number, size: { width: Math.trunc(rect.surfaceWidth) , height: Math.trunc(rect.surfaceHeight) } }; 
 let pix = await image.createPixelMapFromSurface(this.surfaceId, region); 
 return pix; 
}x为0
y为160
width:1208
height: 680
3. 保存为图片
SaveButton({text:SaveDescription.SAVE_IMAGE}) 
 .onClick(async () => { 
  try { 
   let pixmap = await this.livePlayerModel.getVideoFrame(); 
   try{ 
    const imagePackerApi = image.createImagePacker(); 
    let packOpts : image.PackingOption = { format:"image/jpeg", quality:98 }; 
    let data = await imagePackerApi.packing(pixmap, packOpts); 
    let context = getContext(); 
    let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 
    let uri = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg'); 
    const file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 
    let len = await fs.write(file.fd, data); 
    await fs.close(file.fd); 
   } 
   catch (error){ 
    this.onPlayerError(error); 
   } 
  } 
  catch (error){ 
   this.onPlayerError(error); 
  } 
 })4. 保存后的图片如附件,上面为黑色,下面缺失一部分画面。
        HarmonyOS
      
        赞
        
 收藏 0
 回答 1
 
        待解决
        
相关问题
 HarmonyOS 如何获取将大image转换成等比例的小图? 
923浏览  • 1回复 待解决
动态缩放XComponent大小和视频播放时的性能对比 
3743浏览  • 1回复 待解决
HarmonyOS XComponent播放视频问题 
1391浏览  • 1回复 待解决
HarmonyOS 图片截取,怎么把图片中的红框截取出来显示。并且(ImageFit.Fill) 这样显示 
1163浏览  • 1回复 待解决
简易视频播放,如何使用video组件实现视频播放功能 
3799浏览  • 1回复 待解决
ijkplayer结合XComponent组件播放视频时根据视频尺寸和组件尺寸设置视频缩放模式 
3685浏览  • 1回复 待解决
HarmonyOS XComponent组件播放渲染yuv视频文件,仅显示了1帧,怎么渲染播放整个视频文件 
1039浏览  • 1回复 待解决
HarmonyOS XComponent和AVplayer实现视频播放,视频被拉伸 
1761浏览  • 1回复 待解决
HarmonyOS 视频播放AVPlayer解码异常 
1666浏览  • 1回复 待解决
HarmonyOS 需要视频小窗播放功能 
1390浏览  • 1回复 待解决
HarmonyOS 通过AudioPlayer播放音频如何设置播放速度? 
1909浏览  • 1回复 待解决
HarmonyOS 播放视频,多个XComponent公用一个AVPlayer 
1319浏览  • 1回复 待解决
HarmonyOS 视频列表播放怎么实现只有一个视频播放的功能? 
1126浏览  • 1回复 待解决
ArkTS使用AVPLayer实现视频播放时,如何实现全屏播放功能 
3658浏览  • 0回复 待解决
#鸿蒙通关秘籍# 如何在鸿蒙HarmonyOS中通过AVPlayer实现视频全屏播放切换功能? 
1403浏览  • 0回复 待解决
HarmonyOS 通过xcomponent + avplayer实现直播流的播放以及实现类似短视频app的上下翻页切换视频的效果的逻辑以及源码,xcomponent + avplayer实现的视频播放器能否做成组件并插入到信息流中 
1052浏览  • 1回复 待解决
HarmonyOS 视频播放 
1150浏览  • 1回复 待解决
怎样实现视频的播放、暂停和快进功能? 
800浏览  • 0回复 待解决
HarmonyOS 使用XComponent和AvPlayer播放视频出现有声音无画面问题 
1397浏览  • 1回复 待解决
#鸿蒙通关秘籍# 在HarmonyOS开发图片预览功能中,如何通过调整Image组件的宽高和位置来实现图片的缩放与移动? 
846浏览  • 0回复 待解决
小窗视频转全屏播放,播放的视频占满全屏 
3295浏览  • 1回复 待解决
Image组件加载网络图片时,如何确保图片按比例缩放并完整显示? 
605浏览  • 0回复 待解决
HarmonyOS 关于GIF图片播放功能的咨询 
892浏览  • 1回复 待解决
HarmonyOS 使用avPlayer和XComponent实现视频播放器的一些问题 
1474浏览  • 1回复 待解决





















设置宽高,还是显示的完整视频流,只是设置的显示的画面(surface)宽高。
createPixelMapFromSurface接口是根据region把完整视频流的画面做裁剪,因为代码里传入的是显示surface的宽高,相较于完整视频流画面的宽高有缩小,所以导致保存的图片画面不全
如果希望截图完整视频播放画面,可以将该createPixelMapFromSurface接口入参region的宽高设置的和视频大小保持一致:
demo中Region修改为: