HarmonyOS 鸿蒙Next中AVScreenCapture录屏取码流怎么获取YUVI420或者NV21的视频数据?

HarmonyOS 鸿蒙Next中AVScreenCapture录屏取码流怎么获取YUVI420或者NV21的视频数据? 需求背景:实现屏幕录制的同时,获取yuv视频数据用于音视频通话推流

1.OH_VideoCaptureInfo指定videoSource只能是RGBA格式吗?获取的OH_AVBuffer写入本地yuv,用ffmpeg播放显示绿色条纹,怎么解决?

图片

图片

2.利用OH_VideoEncoder视频编码后,得到H.264视频帧后,怎么获取yuv格式数据?

图片


更多关于HarmonyOS 鸿蒙Next中AVScreenCapture录屏取码流怎么获取YUVI420或者NV21的视频数据?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

先回答问题一:可以选择RGBA和YUV,但是这个yuv是420,422,444的这个没实验过。

typedef enum OH_VideoSourceType {
    /* Unsupported App Usage. */
    /* YUV video data provided through graphic */
    OH_VIDEO_SOURCE_SURFACE_YUV = 0,
    /* Raw encoded data provided through graphic */
    OH_VIDEO_SOURCE_SURFACE_ES,
    /* RGBA video data provided through graphic */
    OH_VIDEO_SOURCE_SURFACE_RGBA,
    /* Invalid value */
    OH_VIDEO_SOURCE_BUTT
} OH_VideoSourceType;

问题二:利用OH_VideoEncoder视频编码后,只能拿到h264/h265的数据。要想那rgb或者yuv格式的数据智能通过buffer模式获取到。

更多关于HarmonyOS 鸿蒙Next中AVScreenCapture录屏取码流怎么获取YUVI420或者NV21的视频数据?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,AVScreenCapture的on('frame')回调默认提供编码后的视频帧。要获取YUVI420或NV21原始数据,需在创建AVScreenCapture实例时,通过captureSettings.videoFormat参数设置原始数据格式。例如,设置videoFormat: image.PixelMapFormat.RGBA_8888可获取RGBA数据,再通过图像处理库转换为目标格式。目前SDK未直接提供YUVI420/NV21的捕获选项,需自行转换。

在HarmonyOS Next中,AVScreenCapture 默认输出的确实是RGBA格式。要获取YUV420或NV21数据,需要通过视频编码器进行转换。

针对你的问题:

  1. 直接获取YUV数据OH_VideoCaptureInfovideoSource 目前主要支持RGBA格式。直接写入文件出现绿色条纹,是因为你将RGBA数据当成了YUV数据来解析,格式不匹配。

  2. 解决方案:标准的做法是配置并使用 OH_VideoEncoder

    • 创建编码器时,在 OH_AVCodecCreateOH_AVCodecCreateParam 参数中,将 OH_AVCodecBufferAttrpixelFormat 设置为 NV21I420
    • AVScreenCapture 输出的RGBA帧作为输入,送入视频编码器。
    • 在编码器的 OH_AVCodecOnNeedInputData 回调中,你可以直接访问到 已经转换为指定YUV格式(如NV21/I420)的 OH_AVMemory 数据。这个数据就是你要的YUV帧,可以用于后续的推流处理。
    • 同时,你可以在 OH_AVCodecOnNewOutputData 回调中获取编码后的H.264码流。

核心流程AVScreenCapture (RGBA) -> OH_VideoEncoder (在输入回调中获取转换后的YUV数据) -> 获取YUV用于推流,并同步获取H.264码流用于其他用途。

这样,你无需自行处理RGBA到YUV的转换,由系统编码器高效完成,并可在指定回调中直接获取目标格式数据。

回到顶部