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
先回答问题一:可以选择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数据,需要通过视频编码器进行转换。
针对你的问题:
-
直接获取YUV数据:
OH_VideoCaptureInfo的videoSource目前主要支持RGBA格式。直接写入文件出现绿色条纹,是因为你将RGBA数据当成了YUV数据来解析,格式不匹配。 -
解决方案:标准的做法是配置并使用
OH_VideoEncoder。- 创建编码器时,在
OH_AVCodecCreate的OH_AVCodecCreateParam参数中,将OH_AVCodecBufferAttr的pixelFormat设置为NV21或I420。 - 将
AVScreenCapture输出的RGBA帧作为输入,送入视频编码器。 - 在编码器的
OH_AVCodecOnNeedInputData回调中,你可以直接访问到 已经转换为指定YUV格式(如NV21/I420)的OH_AVMemory数据。这个数据就是你要的YUV帧,可以用于后续的推流处理。 - 同时,你可以在
OH_AVCodecOnNewOutputData回调中获取编码后的H.264码流。
- 创建编码器时,在
核心流程:AVScreenCapture (RGBA) -> OH_VideoEncoder (在输入回调中获取转换后的YUV数据) -> 获取YUV用于推流,并同步获取H.264码流用于其他用途。
这样,你无需自行处理RGBA到YUV的转换,由系统编码器高效完成,并可在指定回调中直接获取目标格式数据。

