以下文章用于记录个人学习使用,如有出入请帮忙指正,不胜感激!
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