先看下效果

 
 
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库
可以点击这里下载全部文件 路径更改成自己的路径即可




![CSS字体样式(font)[详细]](https://img-blog.csdnimg.cn/13aef95f583a487bb1e7596a85db308b.png)














