ffmpeg+nginx+rtmp实现推拉流,搭建实时视频流场景

一、准备

1.环境:
windows
2.开发工具:
ffmpeg、nginx(代理服务器)nginx-rmtp-module(nginx服务器的流媒体插件)、vlc(兼容性播放器)
3.原理:
nginx通过rtmp模块提供rtmp服务, ffmpeg推送一个rtmp流到nginx, 然后客户端通过访问nginx来收看实时视频流。

二、下载并解压文件

1.百度网盘链接: https://pan.baidu.com/s/1U1l9LwPEHCot7gIw3U-sHA
提取码: yq6g
2.下载完至某盘下解压

三、启动nginx服务器
1.Ctrl+R调命令框输入cmd; //进入控制台
2.cd  /d E:\showwork\FFmpeg_nginx\nginx-1.7.11.3-Gryphon //进入nginx的目录
3.nginx.exe -c conf\nginx-win-rtmp.conf   //运行rtmp配置文件 
注意:此时命令行会一直处于执行中,不用管也不要关闭

image.png
4.浏览器输入localhost:80 ,如果出现如下页面 说明配置nginx启动成功
image.png

四、配置ffmpeg

1.环境配置

1.找到我的电脑,右击电脑
2.点击下拉列表属性
3.点击高级系统设置
4.点击高级
5.点击环境变量
6.点击用户变量下path进入
7.添加ffmpeg文件路径E:\showwork\ffmpeg\ffmpeg\bin;(你的ffmepg解压目录下的bin目录的绝对路径)添加到Path 路径下
注意:path路径之间要用英文;号隔开

image.png
8.打开windows 的cmd (不要关闭前面的nginx) 输入ffmpeg -version如果出现如下情况 说明配置成功image.png

五、执行命令,实现推拉流
1.下载待推流文件editor.mp4 
2.新打开一个Dos命令窗口
输入指令:
ffmpeg -re -i "E:\showwork\ffmpeg\ffmpeg\editor.mp4" -vcodec libx264 -acodec aac -f flv rtmp://本机ip地址:1935/live/home
1)E:\showwork\ffmpeg\ffmpeg\editor.mp4  下载的待推流文件绝对路径
2)本机ip地址,通过Dos控制窗输入ipconfig获取
4.打开vlc播放器      
输入串流地址:
rtmp://本机ip地址:1935/live/home

5.输入指令出现以下数据,说明推流成功image.png

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实现这个功能,你可以使用以下步骤: 1. 使用OpenCV库来解码和编码视频流。你可以使用cv::VideoCapture来解码视频文件,并使用cv::VideoWriter来编码视频文件。 2. 使用FFmpeg库来推送RTMP。你需要使用FFmpeg的API来打开一个RTMP,并使用avcodec_encode_video2()函数将OpenCV编码后的视频帧推送到中。 3. 将RTMP推送到Nginx服务器。你可以使用RTMP协议将视频流推送到Nginx服务器。在Nginx服务器上,你需要配置一个RTMP模块,并使用推URL将视频流推送到服务器上。 以下是一个简单的示例代码,可以实现将OpenCV视频流编码并推送到Nginx服务器。 ```cpp #include <opencv2/opencv.hpp> #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavutil/opt.h> #include <libavutil/imgutils.h> #include <libavutil/time.h> #include <librtmp/rtmp.h> int main(int argc, char *argv[]) { // OpenCV video capture and video writer cv::VideoCapture cap(argv[1]); cv::Mat frame; cv::VideoWriter writer("output.mp4", cv::VideoWriter::fourcc('M','J','P','G'), 25, cv::Size(640, 480)); // FFmpeg RTMP stream av_register_all(); avcodec_register_all(); AVFormatContext *fmt_ctx = nullptr; AVOutputFormat *out_fmt = nullptr; AVStream *out_stream = nullptr; AVCodec *codec = nullptr; AVCodecContext *codec_ctx = nullptr; AVPacket pkt; int ret = 0; // Open RTMP stream RTMP *rtmp = RTMP_Alloc(); RTMP_Init(rtmp); RTMP_SetupURL(rtmp, "rtmp://localhost/live/mystream"); RTMP_EnableWrite(rtmp); // Connect to RTMP stream if (!RTMP_Connect(rtmp, nullptr)) { if (!RTMP_ConnectStream(rtmp, 0)) { // Create AVFormatContext avformat_alloc_output_context2(&fmt_ctx, nullptr, "flv", "rtmp://localhost/live/mystream"); if (!fmt_ctx) { fprintf(stderr, "Could not create output context\n"); return -1; } // Create video stream out_fmt = fmt_ctx->oformat; codec = avcodec_find_encoder(out_fmt->video_codec); out_stream = avformat_new_stream(fmt_ctx, codec); if (!out_stream) { fprintf(stderr, "Could not create video stream\n"); return -1; } codec_ctx = avcodec_alloc_context3(codec); avcodec_parameters_to_context(codec_ctx, out_stream->codecpar); codec_ctx->width = 640; codec_ctx->height = 480; codec_ctx->time_base = {1, 25}; codec_ctx->framerate = {25, 1}; codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P; avcodec_open2(codec_ctx, codec, nullptr); // Write header avformat_write_header(fmt_ctx, nullptr); // Encode and push frames while (cap.read(frame)) { // Encode frame ret = avcodec_send_frame(codec_ctx, av_frame); if (ret < 0) { fprintf(stderr, "Error sending frame to encoder\n"); break; } while (ret >= 0) { ret = avcodec_receive_packet(codec_ctx, &pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) break; else if (ret < 0) { fprintf(stderr, "Error receiving packet from encoder\n"); break; } // Write packet pkt.stream_index = out_stream->index; av_interleaved_write_frame(fmt_ctx, &pkt); av_packet_unref(&pkt); // Push packet to RTMP stream RTMP_Write(rtmp, (char *)pkt.data, pkt.size); } // Write frame to OpenCV video writer writer.write(frame); } // Write trailer av_write_trailer(fmt_ctx); // Close RTMP stream RTMP_Close(rtmp); RTMP_Free(rtmp); // Cleanup avcodec_free_context(&codec_ctx); avformat_free_context(fmt_ctx); } } return 0; } ``` 注意,这只是一个简单的示例代码,还需要进行更多的错误检查和异常处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值