简介

LindSDK是珠海六点智能科技有限公司开发的一套基于嵌入式平台(ARM/RISC-V Linux/RTOS)的视频编码、解码及传输的产品开发工具集。

主要特性

硬件平台

目前支持硬件平台:

LindSDK架构图

LindSDK架构图如下所示,从下往上分为OS层、Depends(3rd Library)层、Framework层、APP层。 lindsdk_structure

目录结构

总体目录

framework/av

avwrapper

这里是音频、视频及显示图层相关硬件操作的APIs。

头文件说明
adev_wrapper.h音频输入输出的APIs.
disp_wrapper.h硬件显示图层的APIs.
g2d_wrapper.h2D图像的硬件操作APIs,支持YUV图像的拷贝和旋转.
palloc_wrapper.h物理内存管理的APIs.
vdec_wrapper.h视频硬件解码的APIs.

component

这是媒体相关操作的软件接口定义.

头文件说明
lindcomponent.hLindSDK媒体常用的数据结构定义.
ffcodec.h基于ffmpeg的媒体编解码的APIs,目前仅支持音频的编解码.
ffdemux.h基于ffmpeg的媒体解析的APIs.
ffsink.h基于ffmpeg的媒体封装的APIs.
livesink.h基于live555的RTSP服务器的APIs.
lindsink.hLindeni统一媒体封装(文件或者流化)接口
是对ffsink、livesink和lindrtpsink的封装.
lindsource.hLindeni统一媒体源接口, 当前仅支持lindrtpsource.
lindapm.h回声消除Acoustic Echo Cancelling(AEC)/降噪Noise Suppression(NS)的APIs.
mididec.hMIDI音频解码的APIs.

lindplayer

lindplayer提供了一套媒体播放的接口,支持本地视频、音频、JPG图片、流媒体或视频裸码流的播放.

播放器的参考实现见: lindplayer, lindesplayer, lindjpg

头文件说明
lindplayer.h媒体播放器的APIs
支持场景的媒体文件(mp4,ts...) 和流媒体(rtsp,hls,http...)等.
lindesplayer.hH264/H265裸码流的播放APIs.
lindjpeg.hJPG图片解码或播放的APIs.

lindnet

lindnet是对一些常用的socket编程操作的封装.

支持TCP/UDP/RDT传输协议,其中RDT是一种基于UDP的可靠数据传输协议,是lindtunnel的基础传输协议之一.

lindtunnel

lindtunnel实现了一套简单的局域网内多设备通信的接口,它由三种角色组成:服务器、设备端和APP客户端。

其特性如下:

lindsdk_player

头文件说明
lindtunnel.hlindtunnel的APIs.
ldt_ioctrl_def.h一组IPCamera的指令定义.
ldt_error.h错误码定义.

sample_ldt_devsample_ldt_cli是基于‘ldt_ioctrl_def’这组指令实现的一个简单的IPCamera示例。

mpp_source

mpp_source是对音/视频采集、编码和录像等功能的框架层接口。

Camera的参考实现见: lindcamera

头文件说明
mpp_camera.h摄像头的采集、预览、编码、录像、拍照、OSD等功能的APIs.
mpp_audio.h音频采集和编码的APIs.
mpp_thumb.h生成视频缩略图的APIs.

framework/base

这里是lindsdk一下基础组件的接口定义.

Header FilesInstruction
lindgpioGPIO操作的接口。
lindinputevent按键事件的接口,支持短按、长按事件。
lindirtx基于PWM实现的NEC红外遥控器发送接口。
lindmix音频通路配置的接口。
lindmodbusRS485-modbus的接口。
lindmotor马达运动控制的接口。
lindpcmdsp声音检测和一些音频特征提取的APIs。
lindrpc一套临时的远程过程调用库。
lindutils一些常用的基础库。
lindzcfg自定义的一套简单的零配置通信协议,支持在同一个网段内的设备注册、查询,支持热插拔。
misc其他一些常用的功能封装,例如磁盘管理、夜视检测(IR-CUT)、图像运动检测、马达控制、内核事件、WiFi操作等。

sample

sample/lindcamera

lindcamera是一个相机应用的参考实现。

功能详细说明
采集和预览支持打开、关闭,支持采集分辨率和帧率设置
录像支持单文件录像和分片连续录像,支持最大录像文件时长或大小设置
拍照支持抓拍,录像中抓拍,支持照片分辨率设置
缩略图录像完成后自动生成jpg缩略图
OSD支持文字、BMP水印
推流支持RTSP服务器推流

命令行参数说明如下:

sample/lindplayer

lindplayer是一个媒体播放器的参考实现,支持本地音频、视频、流媒体等的播放。

命令行参数说明如下:

使用“-zcfg”参数进行播放时,无需手动输入url。 但请先运行支持lindzcfg的RTSP流媒体服务器,例如:lindcamera或sample_mppsrc_2_livesink

sample/lindesplayer

lindesplayer是一个H264/H265的裸码流播放器。

命令行参数说明如下:

sample/lindjpg

lindjpg是一个jpg图片浏览器,支持单张显示和幻灯片模式显示。

命令行参数说明如下:

sample_midi

sample_midi是一个midi音乐播放器。

命令行参数说明如下:

sample_adev

sample_adev是一个音频采集+播放loopback的示例。

默认参数运行后,会将从MIC录音,然后再将其从Line-out输出。

命令行参数说明如下:

sample_ffdemux

sample_ffdemux是一个媒体文件解析的示例。

示例可以解析常见的mp4、ts、MP3等媒体文件或流媒体,得到音视频的裸码流,示例可以通过参数配置直接播放一个MP3音乐文件。

命令行参数说明如下:

sample_lindzcfg

lindzcfg是我司自定义的一套简单的零配置通信协议,支持在同一个网段内的设备注册、查询,支持热插拔。

编译后会生成sample_lindzcfg_cli和sample_lindzcfg_srv两个应用。

sample_lindzcfg_srv是服务提供者,启动时会向网段内注册服务(告知其能提供何种服务器),其他设备(client)可以收到一个相应的消息,得知有一个新的服务提供者已经准备好了,如有需要可以与其连接进行通信。

sample_lindzcfg_cli是服务的使用者或客户端,除了被动接收服务注册消息外,还可以主动查询网段内是否有相应的服务提供者。

这一对sample演示了server提供者如果注册服务,client端如果接收和查询服务。

sample_lindzcfg_srv命令行参数说明如下:

sample_lindzcfg_cli命令行参数说明如下:

sample_ldt_cli/sample_ldt_dev

这是一组基于lindtunnel实现的LAN IPCamera示例,sample_ldt_dev是IPCamera端的参考实现,sample_ldt_cli是远程监控端APP的参考实现。

sample_ldt_dev命令行参数说明如下:

sample_ldt_cli命令行参数说明如下:

Client实现对Device的控制,需要将ldt_server运行起来!

sample_ldt_ioctrl

编译后生成sample_ldt_ioctrl_dev和sample_ldt_ioctrl_cli,这是一组基于lindtunnel实现的自定义指令使用的示例,可用于跨进程通信。

sample_lindnet

sample_lindnet是基于lindnet的一个示例代码,实现一对一的server端和client消息发送,client端给server端发送消息,server端将收到的消息loopback发回给client。

命令行参数说明如下:

  1. 支持UDP、TCP和RDT传输协议,server端和client端必须采用相同的协议;
  2. 如采用TCP或RDT,需要先启动server端;

sample_lindsink_rtp/sample_lindsource_rtp

这两个sample基于lindsink和lindsource实现了rtp推流和接收的示例:

sample_lindsink_rtp:“camera采集 -> 视频编码 -> rtp发送”

sample_lindsource_rtp:“rtp接收 -> 视频解码 -> 显示输出”

sample_lindsink_rtp命令行参数说明如下:

sample_lindsource_rtp命令行参数说明如下:

如采用RDT,需要先启动lindsource端;

sample_mppsrc_2_lindsink

编译后会生成sample_mppsrc_2_ffsink和sample_mppsrc_2_livesink两个应用。从camera采集音视频编码后,前者通过ffmpeg的muxer进行流媒体推送或者保存文件;后者通过live555生成rtsp服务器。

sample_mppsrc_2_ffsink

采集音视频进行编码后,通过ffmpeg的muxer进行流媒体推送或者保存文件,其命令行参数说明如下:

使用ffsink的rtp推流(非rtp_mpegts)需要注意以下几点:

  1. 接收端需要使用sdp进行播放;
  2. 只能推送音频或者视频,一个端口不可以同时payload音视频;
  3. 端口号需设置为偶数;

sample_mppsrc_2_ffsink运行后在日志中可以看到SDP的内容如下,将其保存为后缀为sdp的文件,即可用VLC等播放器进行播放。

使用rtp_mpegts推流,在播放器中可以直接用url(rtp://ip:port/name)进行播放

sample_mppsrc_2_livesink

采集音视频进行编码后,通过live555创建rtsp服务器,其命令行参数说明如下:

sample_mppsrc_2_livesink运行后,在播放器中可以直接用url(rtsp://ip:port/name)进行播放

使用方式

编译LindSDK

打包固件

脚本位于build/configs/config_XXX.sh

通过make_release_rootfs指令,将lindsdk生成的二进制文件拷贝到linux SDK的rootfs中,再通过linux SDK的打包工具打包到固件中。

配置文件

lindsdk.ini

lindsdk采用ini格式配置文件,路径位于:

lindsdk.ini定义了device、lindsdk、debug、lindmpp等sections。

sections说明
device定义设备商、产品名称、型号、版本等信息
lindsdk定义用户数据分区(可写)、日志等级、日志保存路径等信息
debug定义常用的调试开关
lindmpp定义mpp的通道
app_xxx用户自定义section,用于用户扩展配置信息

section:debug

例如,在debug section中定义了如下调试开关:

可在源码中(参考lindcamera)通过如下方式获取配置:

源码中使用时依赖头文件:osal_prop.h,库:libldutils.so

section:lindmpp

键(key)值(value)说明
version0x01000000版本号
camera00: disable, 1: enable使能标记;当有多个video设备时,可以增加camera1、camera2、...配置
camera0_dev_main0: /dev/video0, 1: /dev/video1, ...主通道的video设备节点ID
camera0_dev_sub0: /dev/video0, 1: /dev/video1, ...子通道的video设备节点ID;使用ISP的video设备会有子通道
camera0_dev_isp0: ISP0, 1: ISP1指定使用哪一路ISP,V5有2个ISP,V536/V833有1路ISP;如果不通过ISP的video设备(比如HDMI in)配置-1
camera0_tunnel_record格式: [vi_dev,vi_chn,venc_chn,ai_dev,ai_chn,aenc_chn]录像通道定义
camera0_tunnel_picture格式: [vi_dev,vi_chn,venc_chn]拍照通道定义
camera0_tunnel_vencN格式: [vi_dev,vi_chn,venc_chn]编码数据通路定义,最多3路
camera0_tunnel_yuvN格式: [vi_dev,vi_chn]YUV数据通路定义,最多2路
camera0_tunnel_preview格式: [vi_dev,vi_chn,vo_dev,vo_chn]预览通路定义
camera0_tunnel_osdN格式: [mod_id,dev_id,chn_id]OSD通路定义,最多8路
  1. 一个摄像头可以对应一组上述配置,打开摄像头时根据指定的camera id采用对应的参数;
  2. 对使用主控ISP的摄像头,可以产生2个video节点,分别对应主设备(camera0_dev_main)和子设备(camera0_dev_sub),这两个设备可以独立使用;
  3. 对不通过ISP的video设备(例如:hdmi in),只会有一个主video设备;
  4. 不需要的通路可以赋值-1;
  5. camera0的使用请参考lindcamera的源码。

lindprop

lindsdk附带的工具可以查看或修改lindsdk.ini配置文件,使用方法如下:

lindmix.ini

这是音频通路配置文件,可以通过lindmix.h的接口来配置音频输入输出通路。

典型应用场景

播放器

lindsdk_player

录像机

lindsdk_streamer_recorder

流媒体服务器

IPCamera

婴儿监护仪

Windows桌面同屏器