通过ffmpeg 和 nginx 实现rtmp推流,并可以通过vlc播放网络串流
源码
一、Nginx环境配置
Nginx 和 Nginx_rtmp 编译依赖工具:
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
Nginx 服务器部署后,进入 /usr/local/nginx/sbin/ 目录启动nginx服务
./nginx
成功后可以在浏览器输入http://http://127.0.0.1:80进入服务器(Nginx服务器conf默认80端口),服务器显示Welcome to nginx!欢迎界面
打开 /usr/local/nginx/conf/nginx.conf 可以看到,conf中并没有配置rtmp服务器,直接推流会以下报错
[tcp @ 0x563cdbcc6400] Connection to tcp://127.0.0.1:1935 failed: 拒绝连接
[rtmp @ 0x563cdbd34000] Cannot open connection tcp://127.0.0.1:1935
配置 Nginx-rtmp 服务器参考文档:Ubuntu 搭建Nginx-RTMP流媒体服务器
添加rtmp配置
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
重新编译
make && make install
二、实现rtmp推流
初始化部分:
// init ffmpeg
//nginx-rtmp 直播服务器rtmp推流URL
const char *outUrl = "rtmp://127.0.0.1/live/1";
//注册所有的编解码器
avcodec_register_all();
//注册所有的封装器
av_register_all();
//注册所有网络协议
avformat_network_init();
//像素格式转换上下文
SwsContext *vsc = NULL;
//输出的数据结构
AVFrame *yuv = NULL;
//编码器上下文
AVCodecContext *vc = NULL;
//rtmp flv 封装器
AVFormatContext *ic = NULL;
// read video
VideoCapture capture;
Mat frame;
frame= capture.open("/home/ubuntu/视频/big_buck_bunny_720p_10mb.mp4");
if(!capture.isOpened())
{
printf("can not open ...\n");
return -1;
}
推流部分:
///rgb to yuv
uint8_t *indata[AV_NUM_DATA_POINTERS] = { 0 };
//indata[0] bgrbgrbgr
//plane indata[0] bbbbb indata[1]ggggg indata[2]rrrrr
indata[0] = frame.data;
int insize[AV_NUM_DATA_POINTERS] = { 0 };
//一行(宽)数据的字节数
insize[0] = frame.cols * frame.elemSize();
int h = sws_scale(vsc, indata, insize, 0, frame.rows, //源数据
yuv->data, yuv->linesize);
if (h <= 0)
{
continue;
}
//cout << h << " " << flush;
///h264编码
yuv->pts = vpts;
vpts++;
ret = avcodec_send_frame(vc, yuv);
if (ret != 0)
continue;
ret = avcodec_receive_packet(vc, &pack);
if (ret != 0 || pack.size > 0)
{
cout << "*" << pack.size << flush;
}
else
{
continue;
}
//推流
pack.pts = av_rescale_q(pack.pts, vc->time_base, vs->time_base);
pack.dts = av_rescale_q(pack.dts, vc->time_base, vs->time_base);
pack.duration = av_rescale_q(pack.duration, vc->time_base, vs->time_base);
ret = av_interleaved_write_frame(ic, &pack);
三、端口配置
如果开启了防火墙,需要添加端口。
查看当前端口:
firewall-cmd --list-all
配置端口
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
四、VLC取流
输入网络URL:
播放效果:
PS:切片网络延迟很高,待优化