unbuntu 20.04 通过ffmpeg + nginx实现网络推流

通过ffmpeg 和 nginx 实现rtmp推流,并可以通过vlc播放网络串流
源码

一、Nginx环境配置

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:切片网络延迟很高,待优化

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值