RKMEDIA 调试笔记

1 RKMEDIA 框架

       RKMedia提供了一种媒体处理方案,可支持应用软件快速开发。RKMedia在各模块基础API上做进一步封装,简化了应用开发难度。该平台支持以下功能:

VI(输入视频捕获 "Video inpuput capture")、

VENC(H.265/H.264/JPEG/MJPEG 编码 "Video Encode") ;

VDEC(H.265/H.264/JPEG、MJPEG 解码 "Video Decode") ;

VO(视频输出显示 "Video Output display) ;

RGA视频处理(包括旋转、缩放、裁剪);

AI(音频采集 “Audio input”);

AO(音频输出 “VIDEO OUTPUT”);

AENC(音频编码 "audio encode");

ADEC(音频解码 "audio decode");

MD(移动侦测 "move detection");

OD(遮挡侦测 "occlude detection")。

框架源码:external/rkmedia/src

例程:external/rkmedia/examples

SDK中的参考文档:

external/rkmedia/doc

docs/RV1126_RV1109/Multimedia/Rockchip_Developer_Guide_Linux_RKMedia_CN.pdf

docs/RV1126_RV1109/Multimedia/Rockchip_Instructions_Linux_Rkmedia_CN.pdf

rkmedia 总体框架图如下:

2. RKMEDIA 编译配置

 可参考如下配置在buildroot中对rkmedia的编译进行配置:

BR2_PACKAGE_RKMEDIA=y
BR2_PACKAGE_RKMEDIA_MPP=y
BR2_PACKAGE_RKMEDIA_MPP_ENCODER_OSD=y
BR2_PACKAGE_RKMEDIA_FFMPEG=y
BR2_PACKAGE_RKMEDIA_ALSA_PLAYBACK=y
BR2_PACKAGE_RKMEDIA_ALSA_CAPTURE=y
BR2_PACKAGE_RKMEDIA_V4L2_CAPTURE=y
BR2_PACKAGE_RKMEDIA_RKRGA=y
BR2_PACKAGE_DRM_DISPLAY_OUTPUT=y
BR2_PACKAGE_RKMEDIA_MOVE_DETECTION=y
BR2_PACKAGE_RKMEDIA_OCCLUSION_DETECTION=y
BR2_PACKAGE_RKMEDIA_ANR=y
BR2_PACKAGE_RKMEDIA_AEC=y
BR2_PACKAGE_RKMEDIA_EXAMPLES=y

BR2_PACKAGE_CAMERA_ENGINE_RKAIQ=y
BR2_PACKAGE_CAMERA_ENGINE_RKAIQ_IQFILE="os04a10_CMK-OT1607-FV1_M12-40IRC-4MP-F16.xml"

BR2_PACKAGE_FFMPEG=y
BR2_PACKAGE_FFMPEG_ENCODERS="aac adpcm_g726 pcm_alaw pcm_mulaw"
BR2_PACKAGE_FFMPEG_DECODERS="aac adpcm_g726 pcm_alaw pcm_mulaw"
BR2_PACKAGE_FFMPEG_MUXERS=""
BR2_PACKAGE_FFMPEG_DEMUXERS=""
BR2_PACKAGE_FFMPEG_PARSERS="aac"
BR2_PACKAGE_FFMPEG_BSFS=""
BR2_PACKAGE_FFMPEG_PROTOCOLS=""
BR2_PACKAGE_FFMPEG_FILTERS=""
# BR2_PACKAGE_FFMPEG_INDEVS is not set
# BR2_PACKAGE_FFMPEG_OUTDEVS is not set
# BR2_PACKAGE_ALSA_LIB_ALOAD is not set
# BR2_PACKAGE_ALSA_LIB_SEQ is not set
# BR2_PACKAGE_ALSA_LIB_ALISP is not set
# BR2_PACKAGE_ALSA_LIB_OLD_SYMBOLS is not set
BR2_PACKAGE_LIBV4L=y

示例程序

rkmedia 的 API 使用比较容易理解,可以参考 rkmedia examples (rv1126_rv1109_sdk/external/rkmedia/examples)中的代码来实现自己的音视频编解码程序。

例如以下的几个程序:

音频编解码、AEC/ANR 算法:rkmedia_audio_test.c

视频预览:rkmedia_vi_vo_test.c

JPEG 编码:rkmedia_venc_jpeg_test.c

H264 编码:rkmedia_vi_venc_test.c

H265 编码:rkmedia_venc_avbr_test.c

另外可以参考以下源码,它演示了如何在 rkmedia 目录之外,配置和编译自己编写的使用 rkmedia 接口的程序:

demo_h264_rkmedia: A demo use rkmedia to encode H.264 on Rockchip RV1109/RV1126.

几点总结

RKMEDIA 程序运行的条件

1> 确保 ispserver 已经启动。通常情况要先启动 ispserver,如果没有启动,可以使用以下命令:

ispserver -no-sync-db &

同时要确保没有其他进程占用摄像头。

2> 使能 DRM 驱动

这是一个非常容易忽略的点。rkmedia 会通过 DRM 去申请 buffer,若没有使能 DRM,则视频流创建失败。

之前开发一款IPCamera产品,由于是无屏的设备,所以在设备树中把 display_subsystem 节点禁用了,结果查了将近一周的时间才查出原因在这里。

&display_subsystem {
    status = "okay";
};

启动视频流

创建完各个 Channel 之后,视频流通道实际处于休眠状态。在调用 RK_MPI_SYS_Bind 将输入和输出 bind 起来之后,才将视频流启动。对于只有VI,而没有 VENC 等后端模块的使用场景,不能使用 RK_MPI_SYS_Bind ,而是使用 RK_MPI_VI_StartStream。

RK_MPI_SYS_Bind

/**
 * @pstSrcChn: 源通道指针
 * @pstDestChn: 目的通道指针
 */
RK_S32 RK_MPI_SYS_Bind(const MPP_CHN_S *pstSrcChn,const MPP_CHN_S *pstDestChn);

RK_MPI_VI_StartStream

/**
 * @ViPipe: VI 管道号
 * @ViChn: VI 通道号
 */
RK_S32 RK_MPI_VI_StartStream(VI_PIPE ViPipe, VI_CHN ViChn);

获取视频流

获取视频流有两个接口:RK_MPI_SYS_RegisterOutCb 和 RK_MPI_SYS_GetMediaBuffer

RK_MPI_SYS_RegisterOutCb

/**
 * @pstChn: 指定通道指针
 * @cb: 数据输出回调函数
 */
RK_S32 RK_MPI_SYS_RegisterOutCb(const MPP_CHN_S *pstChn, OutCbFunc cb);

注册输出回调函数,当对应的 MPP_CHN_S 有输出时,回调函数函数被调用。

注意:不能在回调函数中处理耗时操作,否则对应通道数据流将被阻塞。

RK_MPI_SYS_GetMediaBuffer

/**
 * @enModID: 模块号
 * @s32ChnID: 通道号
 * @s32MilliSec: 阻塞等待时间
 */
MEDIA_BUFFER RK_MPI_SYS_GetMediaBuffer(MOD_ID_E enModID, RK_S32 s32ChnID, RK_S32 s32MilliSec);

主动获得 MediaBuffer,一般在一个线程中被循环调用。

注意:如果使用了 RK_MPI_SYS_Bind,此函数将获取不到数据;所以它通常结合 RK_MPI_VI_StartStream 来使用。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值