瑞芯微rv1126 SDK代码基础分析---rkmedia框架分析

以下文章用于记录个人学习使用,如有出入请帮忙指正,不胜感激!

rkmedia的source tree:

.
|-- CMakeLists.txt
|-- buffer.cc
|-- c_api
|   |-- CMakeLists.txt
|   |-- osd
|   |   |-- color_table.cc
|   |   `-- color_table.h
|   |-- rkmedia_api.cc
|   |-- rkmedia_buffer.cc
|   |-- rkmedia_buffer_impl.h
|   |-- rkmedia_utils.cc
|   `-- rkmedia_utils.h
|-- codec.cc
|-- decoder.cc
|-- demuxer.cc
|-- encoder.cc
|-- ffmpeg
|   |-- CMakeLists.txt
|   |-- ffmpeg_aud_decoder.cc
|   |-- ffmpeg_aud_encoder.cc
|   |-- ffmpeg_audio_fifo.cc
|   |-- ffmpeg_muxer.cc
|   |-- ffmpeg_resample.cc
|   |-- ffmpeg_utils.cc
|   |-- ffmpeg_utils.h
|   |-- ffmpeg_vid_encoder.cc
|   `-- ffmpeg_vid_encoder.h
|-- filter
|   |-- CMakeLists.txt
|   |-- aec.cc
|   `-- anr.cc
|-- filter.cc
|-- flow
|   |-- CMakeLists.txt
|   |-- audio_decoder_flow.cc
|   |-- audio_encoder_flow.cc
|   |-- decoder_flow.cc
|   |-- file_flow.cc
|   |-- filter_flow.cc
|   |-- link_flow.cc
|   |-- move_detection_flow.cc
|   |-- move_detection_flow.h
|   |-- muxer_flow.cc
|   |-- muxer_flow.h
|   |-- occlusion_detection_flow.cc
|   |-- output_stream_flow.cc
|   |-- source_stream_flow.cc
|   `-- video_encoder_flow.cc
|-- flow.cc
|-- guard
|   |-- CMakeLists.txt
|   `-- through_guard.cc
|-- image.cc
|-- libeasymedia.pc.cmake
|-- live555
|   |-- CMakeLists.txt
|   `-- server
|       |-- CMakeLists.txt
|       |-- aac_server_media_subsession.cc
|       |-- aac_server_media_subsession.hh
|       |-- h264_server_media_subsession.cc
|       |-- h264_server_media_subsession.hh
|       |-- h265_server_media_subsession.cc
|       |-- h265_server_media_subsession.hh
|       |-- live555_media_input.cc
|       |-- live555_media_input.hh
|       |-- live555_server.cc
|       |-- live555_server.hh
|       |-- mjpeg_server_media_subsession.cc
|       |-- mjpeg_server_media_subsession.hh
|       |-- mjpeg_video_source.cc
|       |-- mjpeg_video_source.hh
|       |-- mp2_server_media_subsession.cc
|       |-- mp2_server_media_subsession.hh
|       |-- rtsp_server.cc
|       |-- simple_server_media_subsession.cc
|       `-- simple_server_media_subsession.hh
|-- lock.cc
|-- media_config.cc
|-- media_type.cc
|-- message.cc
|-- muxer.cc
|-- ogg
|   |-- CMakeLists.txt
|   |-- ogg_muxer.cc
|   |-- ogg_utils.cc
|   |-- ogg_utils.h
|   |-- ogg_vorbis_demuxer.cc
|   `-- vorbis_encoder.cc
|-- rkmedia_tree_a.txt
|-- rkmpp
|   |-- CMakeLists.txt
|   |-- mpp_decoder.cc
|   |-- mpp_decoder.h
|   |-- mpp_encoder.cc
|   |-- mpp_encoder.h
|   |-- mpp_final_encoder.cc
|   |-- mpp_inc.cc
|   `-- mpp_inc.h
|-- rknn
|   |-- CMakeLists.txt
|   |-- draw_filter.cc
|   |-- face_capture.cc
|   |-- nn_result_input.cc
|   |-- rknn.cc
|   |-- rknn_utils.cc
|   |-- rockface_bodydetect.cc
|   |-- rockface_db_manager.cc
|   |-- rockface_db_manager.h
|   |-- rockface_detect.cc
|   |-- rockface_evaluate.cc
|   |-- rockface_recognition.cc
|   `-- rockx_filter.cc
|-- rkrga
|   |-- CMakeLists.txt
|   `-- rga.cc
|-- sound.cc
|-- stream
|   |-- CMakeLists.txt
|   |-- audio
|   |   |-- CMakeLists.txt
|   |   |-- alsa
|   |   |   |-- alsa_capture_stream.cc
|   |   |   |-- alsa_playback_stream.cc
|   |   |   |-- alsa_utils.cc
|   |   |   |-- alsa_utils.h
|   |   |   |-- alsa_volume.cc
|   |   |   `-- alsa_volume.h
|   |   |-- rk_audio.cc
|   |   `-- rk_audio.h
|   |-- camera
|   |   |-- CMakeLists.txt
|   |   |-- rkaiq_media.cc
|   |   |-- rkaiq_media.h
|   |   |-- v4l2_capture_stream.cc
|   |   |-- v4l2_stream.cc
|   |   |-- v4l2_stream.h
|   |   |-- v4l2_utils.cc
|   |   `-- v4l2_utils.h
|   |-- display
|   |   |-- CMakeLists.txt
|   |   `-- drm_disp
|   |       |-- CMakeLists.txt
|   |       |-- drm_output_stream.cc
|   |       |-- drm_stream.cc
|   |       |-- drm_stream.h
|   |       |-- drm_utils.cc
|   |       `-- drm_utils.h
|   `-- file_stream.cc
|-- stream.cc
|-- utils.cc
`-- uvc
    |-- CMakeLists.txt
    |-- uvc_flow.cc
    `-- uvc_flow.h

19 directories, 136 files

至上而下的顺序分析下:Rockchip_Instructions_Linux_Rkmedia_CN文档中有做部分描述

1、c_api:封装rkmedia对外的c功能接口,如需拓展可以在此文件夹基础上拓展,rkmedia example中的samples就是基于该接口的测试。

        rkmedia_api.cc:封装的rkmedia对外接口

        rkmedia_buffer.cc:封装的rkmedia音视频等多媒体的缓存操作接口

        rkmedia_utils.cc:封装的rkmedia杂散有用的接口,比如音视频格式类型转换等

2、ffmpeg:对ffmpeg做了进一步的封装,实现了音视频编解码功能,不做进一步文件分析

3、filter:pipe中的过滤节点,实现图像ISP的自动曝光控制接口及自动降噪接口,具体功能实现

        如下文件名所示:aec.cc(自动曝光控制接口),anr.cc(自动降噪接口)

4、flow:pipe中的一个流程单元,官方定义:Flow表示一路多媒体通道中的一个Source/IO/Sink单元。

        audio_decoder_flow.cc:音频解码单元,支持vorbis/aac/mp2/g711a/g711u/g726

        audio_encoder_flow.cc:音频编码单元,支持vorbis/aac/mp2/g711a/g711u/g726

        decoder_flow.cc:视频解码单元,支持H265/H264/JPEG

        file_flow.cc:文件处理单元,配置文件,数据流文件的读写等操作

        filter_flow.cc:一种IO类型的Flow,对输入数据处理后发送给后级的Flow,支持rga/rknn

        link_flow.cc:连接flow,根据代码片段猜测是flow间数据的连接获取与传递作用

        move_detection_flow.cc:sdk实现的移动目标检测功能单元

        muxer_flow.cc:多媒体的混合封装,实际就是音视频的混合封装输出如下格式:

                支持MP4/AVI/MPEG-PS/MPEG-TS/FLV/MKV
        occlusion_detection_flow.cc:sdk实现的遮挡画面检测功能单元

        output_stream_flow.cc:所有输出源,比如drm_output_stream、alsa_playback_stream等

        source_stream_flow.cc: 所有数据发生源,比如alsa_capture_stream、v4l2_capture_stream等
        video_encoder_flow.cc :视频编码单元,支持H265/H264/JPEG 
5、guard:是一个Filter单元,字面意思理解为通过保护,图片抓图走此flow,控制抓图次数

6、live555:开源项目的接口封装,为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持

7、ogg:一种新的音频压缩项目的接口封装。如下ogg介绍:

  Ogg Vorbis 是一种新的音频压缩格式,类似于MP3等现有的音乐格式。但有一点不同的是,它是完全免费、开放和没有专利限制的。Vorbis 是这种音频压缩机制的名字,而Ogg则是一个计划的名字,该计划意图设计一个完全开放性的多媒体系统。目前该计划只实现了OggVorbis这一部分。  Ogg Vorbis文件的扩展名是.OGG。这种文件的设计格式是非常先进的。现在创建的OGG文件可以在未来的任何播放器上播放,因此,这种格式的文件可以不断地进行大小和音质的改良,而不影响 

  ​编辑

  

旧有的编码器或播放器。

编辑本段特性

  Ogg是一种先进的有损的音频压缩技术,正式名称是Ogg Vorbis,是一种免费的开源音频格式。OGG编码格式远比90年代开发成功的MP3先进,它可以在相对较低的数据速率下实现比MP3更好的音质。此外,Ogg Vorbis支持VBR(可变比特率)和ABR(平均比特率)两种编码方式, Ogg还具有比特率缩放功能,可以不用重新编码便可调节文件的比特率。 OGG格式可以对所有声道进行编码,支持多声道模式,而不像MP3只能编码双声道。多声道音乐会带来更多临场感,欣赏电影和交响乐时更有优势,这场革命性的变化是MP3无法支持的。在而且未来人们对音质要求不断提高, Ogg的优势将更加明显。

编辑本段为何要使用Ogg Vorbis格式

  众所周知,MP3是有损压缩格式,因此压缩后的数据与标准的CD音乐相比是有损失的。VORBIS也是有损压缩,但通过使用更加先进的声学模型去减少损失,因此,同样位速率(Bit Rate)编码的OGG与MP3相比听起来更好一些。另外,还有一个原因,MP3格式是受专利保护的。如果你想使用MP3格式发布自己的作品,则需要付给Fraunhofer(发明MP3的公司)专利使用费。而VORBIS就完全没有这个问题。  对于乐迷来说,使用OGG文件的显著好处是可以用更小的文件获得优越的声音质量。而且,由于OGG是完全开放和免费的,制作OGG文件将不受任何专利限制,可望可以获得大量的编码器和播放器。这也是为何现在MP3编码器如此少而且大多是商业软件的原因,因为Fraunhofer要收取专利使用费.

8、rkmpp:类同海思mpp的多媒体处理单元,编解码

9、rknn:npu深度算法处理单元

        draw_filter.cc:目标检测结果画框后处理单元

        face_capture.cc:人脸侦测算法单元,利用该接口继承于pipe的流程中

        nn_result_input.cc:rknn的检测结果输出到下降flow输入接口单元

        rknn_utils.cc:定义Rockface和Rockx的图像格式

        rknn.cc:rknn的逻辑单元

        rockface_xxx.cc:人脸检测算法模块

        rockx_filter.cc:rockx的算法逻辑单元

10、rkrga:图像rga单元,RGA模块用于2D图像的裁剪、格式转换、缩放、旋转、图片叠加等

        rga.cc

11、stream:用于FLow使用的处理方法。具体针对音视频处理方式

        audio:音频处理方法

                alsa:利用Linux alsa架构获取音频,以下为百度百科定义:

        ALSA是Advanced Linux Sound Architecture的缩写,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持。

                        alsa_capture_stream.cc:音频获取stream单元

                        alsa_playback_stream.cc:音频回放stream单元

                        alsa_utils.cc:音频格式定义

                        alsa_volume.cc:音频音量stream处理单元

                rk_audio.cc:对音频底层进一步的封装,便于上层调用,看代码主要实现了音频队列

        camera:图像处理方法

                rkaiq_media.cc:封装了linux media架构的接口,获取视频流,其中主要包含ISP media的处理单元,区别与v4l2,用于flow的调用

                v4l2_capture_stream.cc:封装了Linux V4l2的架构的接口,获取视频流,bypass的方式获取图像流,不经过ISP单元

                v4l2_utils.cc:v4l2中需要用到的图像数据格式定义及接口

        display:对drm显示架构做了进一步的封装与实现,关于DRM了解,参加如下博文:[RK3399][Android7.1] Display中的DRM模块介绍_android drm kms_KrisFei的博客-CSDN博客

uvc:通用视频接口单元:不多介绍,封装了对USB Camera图像视频流的获取接口

剩余当前目录下的文件为:$(SDK)\external\rkmedia\include\easymedia\ 下的基础类中成员函数的具体实现方法,如flow,filter,buffer,stream,image,sound等,具体分析详细我的其他博客

        交流群https://img-blog.csdnimg.cn/25f68da4017b4fac9b2a5e757b109286.jpeg

        

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值