如何解决HarmonyOS鸿蒙Next中photoAccessHelper.getAssets获取竖向视频宽高不正确问题

如何解决HarmonyOS鸿蒙Next中photoAccessHelper.getAssets获取竖向视频宽高不正确问题

【问题现象】

图库显示宽高1080*1920。

点击放大

通过api获取到的视频高为1080,宽为1920,api获取的值宽高与实际相反。

点击放大

【背景知识】

【定位思路】

获取横屏视频做对比,两个视频在手机上显示的尺寸宽高数值相反。

点击放大

通过API获取到的两个视频同样高为1080,宽为1920,但是竖向视频有90°旋转,因此怀疑是旋转导致的问题。

点击放大

再对比下旋转180°和270°的情况,旋转度数%180 == 90的时候,需要长宽的数值互换,才能得出手机上看到的结果。

点击放大

点击放大

【解决方案】

通过photoAsset.get(“orientation”)判断视频是否旋转,来判断视觉效果上的长宽和参数的对应关系:

let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
predicates.equalTo(photoAccessHelper.PhotoKeys.URI, '');
let fetchOptions: photoAccessHelper.FetchOptions = {
  fetchColumns: [
    "title",
    photoAccessHelper.PhotoKeys.WIDTH,
    photoAccessHelper.PhotoKeys.HEIGHT,
    photoAccessHelper.PhotoKeys.DURATION,
    photoAccessHelper.PhotoKeys.SIZE,
    photoAccessHelper.PhotoKeys.DISPLAY_NAME,
    photoAccessHelper.PhotoKeys.ORIENTATION,//旋转
    photoAccessHelper.PhotoKeys.PHOTO_SUBTYPE],
  predicates: predicates
};
try {
  let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext(this));
  let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> =
    await phAccessHelper.getAssets(fetchOptions);
  let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
  let title :photoAccessHelper.PhotoKeys = photoAccessHelper.PhotoKeys.TITLE;
  let paTitle = photoAsset.get(title.toString())
  let orientation = photoAsset.get("orientation") as number
  // 判断是否为竖屏
  if (orientation % 180 == 90){
    console.warn("ccTestShow","title: "+paTitle.toString()+"-width:"+photoAsset.get("height")+"-height:"+photoAsset.get("width")+"--"+"ORIENTATION: "+photoAsset.get("orientation"))
  } else {
    console.warn("ccTestShow","title: "+paTitle.toString()+"-width:"+photoAsset.get("width")+"-height:"+photoAsset.get("height")+"--"+"ORIENTATION: "+photoAsset.get("orientation"))
  }
  fetchResult.close();
  return photoAsset
} catch (err) {
  console.error('getAssets failed with err: ' + err);
}

【总结】

获取视频或图片长宽时,还需要判断是否有旋转,如果旋转度数%180 == 90,视频是竖屏时,需要长宽的数值互换,才能得出手机上看到的结果。


更多关于如何解决HarmonyOS鸿蒙Next中photoAccessHelper.getAssets获取竖向视频宽高不正确问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于如何解决HarmonyOS鸿蒙Next中photoAccessHelper.getAssets获取竖向视频宽高不正确问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,photoAccessHelper.getAssets获取竖向视频宽高不正确的问题

在HarmonyOS鸿蒙Next中,photoAccessHelper.getAssets获取竖向视频宽高不正确的问题,可能是由于视频的元数据未正确解析或坐标系转换问题导致的。可以通过以下方式解决:

  1. 检查视频元数据:确保视频的元数据(如旋转角度、宽高等)被正确读取。可以使用MediaMetadataRetriever类获取视频的旋转角度,并根据旋转角度调整宽高值。

  2. 坐标系转换:如果视频被旋转,宽高值可能需要根据旋转角度进行转换。例如,如果视频旋转了90度或270度,宽高值应互换。

  3. 使用MediaPlayer获取宽高:通过MediaPlayer获取视频的宽高信息,确保获取的值是经过旋转校正后的。

  4. 更新SDK:确保使用的HarmonyOS SDK是最新版本,可能存在已知问题已在后续版本中修复。

  5. 直接读取文件属性:通过文件系统直接读取视频文件的属性,获取未经过旋转处理的原始宽高值。

通过以上方法,可以解决photoAccessHelper.getAssets获取竖向视频宽高不正确的问题。

回到顶部