OpenHarmony 媒体子系统开发常见问题

OpenHarmony 媒体子系统开发常见问题

媒体子系统

使用XComponent组件显示相机的预览输出流时,如何获取相机的帧数据

问题现象

目前接口不支持实时预览相机的帧数据,只能绑定一个动作来获取,比如拍照动作。

解决措施

通过创建双路预览来实现。

// 获取PreviewOutput(预览输出类)实例
const surfaceId = globalThis.mxXComponentController.getXComponentSurfaceld();
this.mPreviewOutput = await Camera.createPreviewOutput(surfaceld);

// 添加双路预览
const fullWidth = this.mFullScreenSize.width;
const fullHeight = this.mFullScreenSize.height;
const imageReceiver = await image.createImageReceiver(fullwidth, fullHeight, 
  formatImage, capacityImage) ;
const photoSurfaceId = await imageReceiver.getReceivingSurfaceld();
this.mPreviewOutputDouble = await Camera.createPreviewOutput ( photoSurfaceld)

如何获取前置摄像头的预览图像

解决措施

  1. 使用系统相机框架@ohos.multimedia.camera获取物理摄像头信息。

    let cameraManager = await camera.getCameraManager(context);
    let camerasInfo = await cameraManager.getSupportedCameras();
    let cameraDevice = this.camerasInfo[0];
    
  2. 创建并启动物理摄像头输入流通道。

    let cameraInput = await cameraManager.createCameraInput(cameraDevice);
    await this.cameraInput.open();
    
  3. 拿到物理摄像头信息查询摄像头支持预览流支持的输出格式,结合XComponent提供的surfaceId创建预览输出通道。

    let outputCapability = await this.cameraManager.getSupportedOutputCapability(cameraDevice);
    let previewProfile = this.outputCapability.previewProfiles[0];
    let previewOutput = await cameraManager.createPreviewOutput(previewProfile, previewId);
    
  4. 创建相机会话,在会话中添加摄像头输入流和预览输出流,然后启动会话,预览画面就会在XComponent组件上送显。

    let captureSession = await cameraManager.createCaptureSession();
    await captureSession.beginConfig();
    await captureSession.addInput(cameraInput);
    await captureSession.addOutput(previewOutput);
    await this.captureSession.commitConfig()
    await this.captureSession.start();
    

如何设置相机焦距

解决措施

  1. 判断当前摄像头是否为前置摄像头,前置摄像头不支持设置焦距。
  2. 通过captureSession.getZoomRatioRange()接口获取设备焦距设置支持的最大、最小范围。
  3. 判断目标焦距参数大小是否在步骤二获取的范围内,然后通过captureSession.setZoomRatio()接口设置相机焦距。

如何后台播放音乐

解决措施

AVSession对媒体播放做了管控,当三方应用从前台切入后台或者进入锁屏状态,媒体播放会被强制暂停而应用不感知,如果要开发后台播放功能,应该启动后台任务管理的长时任务中播放音乐,同时接入AVSession能力,允许控制中心的播控面板控制三方应用的播放功能。

参考链接

如何获取视频播放案例Sample

解决措施

可参考文档:

媒体库各公共路径支持的文件格式有哪些

目录路径 目录类型 媒体类型 说明 支持的文件格式
Camera/ DIR_CAMERA - 相机拍摄图片与录像的存放路径,目录与子目录下可以存放视频,图片类型文件。 .bmp/.bm/.gif/.jpg/.jpeg/.jpe/.png/.webp/.raw/.svg/.heif/.mp4/.3gp/.mpg/.mov/.webm/.mkv
Videos/ DIR_VIDEO VIDEO(视频) 视频专有目录,目录与子目录下只可以存放视频类型文件 .mp4/.3gp/.mpg/.mov/.webm/.mkv
Pictures/ DIR_IMAGE IMAGE(图片) 图片专有目录,目录与子目录下只可以存放图片类型文件。 .bmp/.bm/.gif/.jpg/.jpeg/.jpe/.png/.webp/.raw/.svg/.heif
Audios/ DIR_AUDIO AUDIO(音频) 音频专有目录,目录与子目录下只可以存放音频类型文件。 .aac/.mp3/.flac/.wav/.ogg
Documents/ DIR_DOCUMENTS FILE(文件) 文档类型目录,目录与子目录下只可以存放音频,图片,视频以外类型文件。 -
Download/ DIR_DOWNLOAD ALLTYPE 下载文件存放目录,目录与子目录下文件类型不受限制。 -

创建多个视频组件无法播放

问题现象

创建十几个视频组件无法播放甚至崩溃。

解决措施

当前限制最多创建13个媒体播放实例。

媒体库的物理路径是什么

/storage/media/100/local/files/Pictures
/storage/media/100/local/files/Audios
/storage/media/100/local/files/Videos
/storage/media/100/local/files/Camera
/storage/media/100/local/files/Documents
/storage/media/100/local/files/Download

如何直接调起图片库

let want = {
  bundleName: 'com.ohos.photos',
  abilityName: 'com.ohos.photos.MainAbility',
  parameters: {
 uri: 'detail'
  }
};
let context = getContext(this) as common.UIAbilityContext;
context.startAbility(want);

如何使用JS语言开发相机功能

解决措施

参考文档:

如何录制手机声卡的音频

解决措施

参考文档:

调用媒体库getAlbums方法,需要申请什么权限

解决措施

  1. 在module.json5中配置权限:

    "requestPermissions": [
      {
        "name": "ohos.permission.READ_MEDIA"
      }
    ]
    
  2. 在EntryAbility.ts -> onWindowStageCreate页面加载前需要增加用户授权代码:

    let permissionList: Array<string> = [
      "ohos.permission.READ_MEDIA"
    ];
    this.context.requestPermissionsFromUser(permissionList)
      .then(data => {
        console.info(`request permission data result = ${data.authResults}`)
      })
      .catch(err => {
        console.error(`fail to request permission error:${err}`)
      })
    

如何播放h.265编码格式的MP4视频

解决措施

暂不支持h.265编码格式的MP4视频播放。

如何在Stage模型下调用mediaLibrary.getMediaLibrary()接口

解决措施

参考文档:

调用mediaLibrary.getFileAssets()接口返回的内容如何排序

解决措施

通过MediaFetchOptions对象参数里面的order属性进行排序。

V900单板openharmony媒体播放失败<406 no buffer>

解决措施

V900单板未适配HDI驱动, 需要厂商进行适配。

如何实现对图片类似Glide封装后形成的图片库

解决措施

通过imageknife三方库鸿蒙化实现

参考文档:

官方文档上有视屏录制VideoRecorder相关接口信息,但在SDK上却没有

解决措施

VideoRecorder已改为系统接口,建议使用AVRecorder替代。

参考文档:

如何申请设备上的媒体读写权限

解决措施

  1. 在module.json5配置文件中配置媒体读写权限ohos.permission.READ_MEDIA和ohos.permission.WRITE_MEDIA。

    示例:

    {
      "module" : {
        "requestPermissions":[
          {
            "name" : "ohos.permission.READ_MEDIA",
            "reason": "$string:reason"
          },
          {
            "name" : "ohos.permission.WRITE_MEDIA",
            "reason": "$string:reason"
          }
        ]
      }
    }
    
  2. 这两个权限的授权方式均为user_grant,因此需要调用requestPermissionsFromUser接口,以动态弹窗的方式向用户申请授权。

    let context = getContext(this) as common.UIAbilityContext;
    let atManager = abilityAccessCtrl.createAtManager();
    let permissions: Array<string> = ['ohos.permission.READ_MEDIA','ohos.permission.WRITE_MEDIA']
    atManager.requestPermissionsFromUser(context, permissions)
    .then((data) => {
        console.log("Succeed to request permission from user with data: " + JSON.stringify(data))
    }).catch((error) => {
        console.log("Failed to request permission from user with error: " + JSON.stringify(error))
    })
    

如何查询媒体库缩略图预览

解决措施

参考文档:

如何检测当前相机服务的状态

解决措施

cameraManager通过设置状态回调返回相机状态。

cameraManager.on('cameraStatus', (cameraStatusInfo) => {
  console.log(`camera : ${cameraStatusInfo.camera.cameraId}`);
  console.log(`status: ${cameraStatusInfo.status}`);
})

相机状态:CameraStatus

枚举,相机状态。

  • CAMERA_STATUS_APPEAR 0 新的相机出现。
  • CAMERA_STATUS_DISAPPEAR 1 相机被移除。
  • CAMERA_STATUS_AVAILABLE 2 相机可用。
  • CAMERA_STATUS_UNAVAILABLE 3 相机不可用。

参考文档:


2 回复

OpenHarmony媒体子系统开发常见问题主要集中在以下几个方面:

  1. 媒体播放器初始化失败:可能是由于媒体文件路径错误、文件格式不支持或权限问题导致。检查文件路径、格式及权限设置。

  2. 音视频同步问题:通常由时间戳处理不当引起。确保音视频帧的时间戳正确,并使用系统提供的同步机制。

  3. 媒体资源释放不及时:可能导致内存泄漏。在媒体播放结束后,及时释放相关资源。

  4. 媒体编解码器不支持:某些特定格式的媒体文件可能无法播放。确认设备支持的编解码器列表,或使用第三方库进行转码。

  5. 媒体播放卡顿:可能是由于设备性能不足或网络带宽限制。优化媒体文件的分辨率和码率,或使用流媒体传输协议。

  6. 媒体录制失败:检查麦克风、摄像头等硬件设备是否正常工作,以及相关权限是否已授予。

  7. 媒体文件损坏:在传输或存储过程中,媒体文件可能损坏。使用校验和或重传机制确保文件完整性。

  8. 媒体子系统API调用错误:确保API调用顺序正确,参数合法,并处理所有可能的异常情况。

  9. 多线程并发问题:在多个线程中同时操作媒体资源可能导致竞态条件。使用锁或其他同步机制确保线程安全。

  10. 媒体子系统日志信息不足:在开发过程中,启用详细的日志记录,以便快速定位问题。

以上是OpenHarmony媒体子系统开发中常见的问题及简要分析。


在OpenHarmony媒体子系统开发中,常见问题包括:

  1. 音频/视频播放失败:检查文件路径、格式是否支持,确保媒体服务已启动。
  2. 音视频同步问题:调整时间戳处理逻辑,确保音频和视频帧同步。
  3. 性能瓶颈:优化解码器配置,减少内存占用,提升渲染效率。
  4. 权限问题:确保应用已获取必要的媒体访问权限。
  5. 兼容性问题:测试不同设备和系统版本,确保功能一致性。
  6. 日志分析:通过系统日志定位问题,使用调试工具进行深入分析。
回到顶部