Skip to content

Firefly-rk-linux-utils/ffmedia_release

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ffmedia介绍

ffmedia是一套基于Rockchip Mpp/RGA开发的视频编解码框架。支持音频aac编解码。 ffmedia一共包含以下单元

  • 输入源单元 VI:
    • Camera: 支持UVC, Mipi CSI
    • RTSP Client: 支持tcp、udp和多播协议
    • RTMP Client: 支持拉流和推流
    • File Reader:支持mkv、mp4、flv、ts、ps文件及裸流等文件读入
    • Memory Reader:支持内存数据读入
    • Alsa Capture: 音频采集
    • FFmpeg Demux: 支持文件、网络流及UVC等读取
  • 处理单元 VP:
    • MppDec: 视频解码,支持H264,H265,MJpeg,VP8,VP9,MPEG1,MPEG2,MPEG4
    • MppEnc: 视频编码,支持H264,H265,MJpeg
    • RGA:图像合成,缩放,裁剪,格式转换
    • AacDec: aac音频解码
    • AacEnc: aac音频编码
    • Inference: rknn模型推理
  • 输出单元 VO:
    • DRM Display: 基于libdrm的显示模块
    • Renderer Video: 使用gles渲染视频,基于libx11窗口显示
    • RTSP Server: 支持tcp和udp推流
    • RTMP Server: 支持推流
    • File Writer: 支持mkv、mp4、flv、ts、ps文件封装及裸流等文件保存
    • Alsa PlayBack: 音频播放
    • GB28181 Client: 支持点播
    • FFmpeg Mux: 支持文件、网络流等封装输出
  • pybind11:
    • pymodule: 创建vi、vo、vp等的c++代码的Python绑定,以提供python调用vi、vo、vp等c++模块的python接口

各个模块成员函数及参数说明请参看documentation/ffmedia.docx 。

软件框架:

整个框架采用Productor/Consumer模型,将各个单元都抽象为ModuleMedia类。 一个Productor可以有多个Consumer,一个Consumer只有一个Productor. 输入源单元没有Productor.

Cpp示例的编译和运行

安装相关环境

apt update
apt install -y gcc g++ make cmake libdrm-dev libasound2-dev libgles-dev libx11-dev libjpeg62

# 如需要支持opencv相关demo,安装下列软件包

apt install libopencv-dev

编译与运行

  1. 首先在源码根路径创建编译文件夹并进入
$ ls
CMakeLists.txt  demo  dist  documentation  include  lib  Readme.md  inference_examples

$ mkdir build
$ cd build
  1. 使用cmake 选择要编译的demo, 默认不编译opencv、inference的demo
# 如果需要编译opencv、inference的demo,则cmake ../ -DDEMO_OPENCV=ON -DDEMO_INFERENCE=ON
$ cmake ../

# 编译
$ make -j8

# 把rknn的库路径添加到当前环境;如果是rk356x板子,则把RK3588更改为RK356X。
# 也可以忽略这步使用系统默认的rknn库或自行指定rknn库。
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${PWD}/../inference_examples/lib/RK3588/

  1. 运行在build编译出demo
cd build
./demo

执行可能会报错 “error while loading shared libraries: librknnrt.so: cannot open shared object file: No such file or directory”

由于ffmedia使用了rknn,需要将rknn库路径添加到当前环境

#根据对应的芯片选择对应的rknn库目录,如果找不到芯片对应的库路径则默认选择RK3588
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${PWD}/../inference_examples/lib/RK3588/

#或者直接将库安装到进系统中
cp ../inference_examples/lib/RK3588/librknnrt.so /usr/lib/

  1. 更多示例使用介绍说明:demo/Readme.md

ffmedia api 文档

ffmedia的api详细文档:ffmedia_api.pdf

常见问题

依赖库路径问题

程序运行环境区别可能导致寻找不到依赖的动态库,可通过LD_LIBRARY_PATH将库路径添加进当前环境。

export LD_LIBRARY_PATH=/path/to/your/libs:$LD_LIBRARY_PATH

或者通过patchelf直接修改程序或者动态库的库路径。

patchelf --set-rpath /path/to/your/libs <your-binary>

多路编解码失败问题

在多路编解码时,如果出现无法申请buf或者无法初始化等,可能是进程使用文件描述符数量限制,一般为1024。 更改进程使用的fd数量,临时更改:

ulimit -n #查看当前进程可用fd最大数量
ulimit -n 102400 #更改进程可用fd最大数量到102400

永久更改:

sudo vim /etc/security/limits.conf
#在尾部添加
*	soft	nofile	102400
*	hard	nofile	102400
*	soft	nproc	102400
*	hard	nproc	102400

其他

如果遇到问题或者有其他功能需求的,可以提issue,我们将在下个版本修复或添加支持。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published