先看下效果
Demo版本限制了只支持两个通道 每个通道只能连接一个客户端
FULL版本 没有这个限制 需要全功能版本 请联系博主
so库和测试demo可以点击这里下载
功能说明如下:
- 视频支持H264/H265
- 音频支持AAC
- 只支持LIVE 不支持文件点播
- 支持TCP/UDP
- 不支持RTCP
- 支持多用户认证(DEMO版本无)
- IO复用模型采用流行的EPOLL模式
- 支持多通道 任意多连接(只要内存网络带宽够 DEMO版本做了限制 )
- 基于linux开发 所以支持很多以linux为平台的嵌入式系统比如 海思 瑞芯微 android等等 指定工具编译链即可
下面看下调用说明
首先是头文件
/***************************************************************************************
Created by QMCY 20230223
****************************************************************************************/
#ifndef RTSP_ADVOCATOR_H
#define RTSP_ADVOCATOR_H
typedef void * rtsp_handle;
typedef enum
{
QMCY_VIDEO_CODEC_H264 = 0,
QMCY_VIDEO_CODEC_H265,
QMCY_VIDEO_CODEC_JPEG,
QMCY_VIDEO_CODEC_MP4,
}QMCY_VIDEO_CODEC;
typedef enum
{
QMCY_AUDIO_CODEC_NONE = 0,
QMCY_AUDIO_CODEC_G711A,
QMCY_AUDIO_CODEC_G711U,
QMCY_AUDIO_CODEC_G726,
QMCY_AUDIO_CODEC_AAC,
QMCY_AUDIO_CODEC_G722,
QMCY_AUDIO_CODEC_OPUS,
}QMCY_AUDIO_CODEC;
/*
rtsp_init 参数说明:
max_channels:支持的最大通道个数
max_clients:每个通道最大连接数
server_ip:服务端IP地址
port:RTSP端口
返回rtsp 句柄 供后面的函数使用
*/
rtsp_handle rtsp_init(int max_channels,int max_clients, char * server_ip,unsigned short port);
/*
rtsp_add_channel 参数说明:
rtsp_handle:通过rtsp_init函数创建的句柄
index:通道index 从0开始
contain_video:是否包含视频
contain_audio:是否包含音频
video_type:视频编码格式H264/H265
audio_type:目前支持支最常用的AAC格式
audio_sampe_rate:aac音频的取样率
audio_channels:音频单通道1,双通道设2
suffix:rtsp后缀播放时通过suffix用来区分通道
成功返回true 失败返回false
*/
bool rtsp_add_channel(rtsp_handle pHandle,int index,bool contain_video,bool contain_audio,
QMCY_VIDEO_CODEC video_type,QMCY_AUDIO_CODEC audio_type,
int audio_sampe_rate,int audio_channels,const char *suffix);
/*
Demo 版本不支持设置密码 FULL版本可以
rtsp_set_auth_info
auth_flag 是否需要密码认证
count 支持多用户登录 这里指用户数目
username 多用户用户名数组
password 多用户密码
*/
bool rtsp_set_auth_info(rtsp_handle pHandle,bool auth_flag,int count,const char**username,const char **password);
/*
rtsp_run 参数说明:
启动rtsp服务
*/
void rtsp_run(rtsp_handle pHandle);
/*
rtsp_send_frame_video 参数说明:
rtsp_handle:通过rtsp_init函数创建的句柄
index:通道index
data:视频数据
size:视频数据大小
*/
int rtsp_send_frame_video(rtsp_handle pHandle, int index,unsigned char *data, int size);
/*
rtsp_send_frame_audio 参数说明:AAC格式是需要去掉ADTS头的 数据
rtsp_handle:通过rtsp_init函数创建的句柄
index:通道index
data:音频数据
size:音频数据大小
*/
int rtsp_send_frame_audio( rtsp_handle pHandle,int index,unsigned char *data, int size);
/*
rtsp_stop 参数说明:
rtsp_handle:通过rtsp_init函数创建的句柄
此函数会自动释放rtsp_init创建的句柄 不需要后续释放操作
*/
void rtsp_stop(rtsp_handle pHandle);
#endif // RTSP_ADVOCATOR_H
测试demo mainh函数如下:
int main(int argc, char *argv[])
{
bool ret = false;
signal(SIGPIPE, SIG_IGN);
signal(SIGINT, signal_handler);
signal(SIGKILL, signal_handler);
signal(SIGTERM, signal_handler);
rtsp_handle handle = rtsp_init(2,3,"192.168.0.209",1234);
if(handle == NULL)
{
return -1;
}
ret = rtsp_add_channel(handle,0, true,true, QMCY_VIDEO_CODEC_H264, QMCY_AUDIO_CODEC_AAC,
48000,2, "qmcy1.sdp");
ret = rtsp_add_channel(handle,1, true,true, QMCY_VIDEO_CODEC_H265, QMCY_AUDIO_CODEC_AAC,
48000,2, "qmcy2.sdp");
if(ret == false)
{
return -1 ;
}
g_flag = true;
//For qmcy1.sdp
pthread_t video_thread;
pthread_t audio_thread;
pthread_create(&video_thread, NULL, QMCY_TestReadVideo,handle);
pthread_create(&audio_thread, NULL, QMCY_TestReadAudio, handle);
//For qmcy2.sdp
pthread_t video_thread2;
pthread_t audio_thread2;
pthread_create(&video_thread2, NULL, QMCY_TestReadVideoEx,handle);
pthread_create(&audio_thread2, NULL, QMCY_TestReadAudioEx, handle);
rtsp_run(handle);
while(g_flag)
{
sleep(1);
}
pthread_join(video_thread,NULL);
pthread_join(audio_thread,NULL);
pthread_join(video_thread2,NULL);
pthread_join(audio_thread2,NULL);
rtsp_stop(handle);
printf("QMCY RTSP server exit normally !!!!!\n");
return 0;
}
makefile内容如下:
CC := g++
CC=g++
CFLAGS:= -std=c++11 -g
CFLAGS += -I/home/QMCY/FFmpeg-n4.3.2/install_ubunt/include
LIBPATH += -L/home/QMCY/FFmpeg-n4.3.2/install_ubunt/lib
LIBPATH += -L./
LIBNAME := -lavformat -lavcodec -lavutil -lswscale -lswresample -lavdevice -lpthread -ldl -lz -llzma -lrtsp
SRCS+=rtsp_example.cpp
OBJS=$(SRCS:.cpp=.o)
EXEC=advocator
start:$(OBJS)
$(CC) $(CFLAGS) -o $(EXEC) $(OBJS) $(LIBPATH) $(LIBNAME)
.cpp.o:
$(CC) $(CFLAGS) -o $@ -c $<
clean:
rm -rf $(OBJS)
测试例子中使用了FFMPEG进行拉RTSP流测试 所以需要引入ffmpeg库
可以点击这里下载全部文件 路径更改成自己的路径即可