由于工作需要最近在研究rtsp拉流与直播推流的问题,目前先在我本机上进行了实验,本博客记录学习的内容,包含windows下ffmpeg、nginx-rtmp环境搭建及opencv+ffmpeg+python进行拉流、直播推流的实施代码,还有一些遇见的问题的处理。
一.nginx-rtmp服务器搭建及ffmpeg、VLC下载安装
1.ffmpeg下载安装
2.nginx-rtmp环境搭建
3.本博客还涉及到使用VLC Media Player
4.总结一下实际操作中常用的几个命令:
二.opencv+ffmpeg+python实现拉流和rtmp直播推流
下载地址:
http://ffmpeg.org/download.html
安装教程:
https://zhuanlan.zhihu.com/p/118362010
我按照这个下载安装是没有问题的,直接下载的是22M的那个。
参考教程:
https://www.cnblogs.com/linuxAndMcu/p/12517787.html
我最开始找的那个教程启动nginx时报错:
D:\ProgramFile\nginx\nginx-1.20.1>nginx.exe -c conf\nginx-win.conf
nginx: [emerg] unknown directive "rtmp" in D:\ProgramFile\nginx\nginx-1.20.1/conf\nginx_win.conf:19
问题分析:经过查阅资料,问题可能是1.文件编码格式问题
2.nginx无rtmp模块或未对rtmp模块进行编译
。
解决办法:看网上的帖子,说是要将编码模式从utf8改为无bom。经过尝试后无效,如果是编码格式的问题,提示的应该是下面这句:
nginx: [emerg] unknown directive "锘?user" in D:\ProgramFile\nginx\nginx-1.20.1/conf\nginx_win.conf:1
所以问题应该是未编译,在git上作者提供了linux下编译步骤:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210621160753360.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMxNjgxNTIz,size_16,color_FFFFFF,t_70#)
对于我windows
,教程中提到可以自行编译,但最好的方法就是安装编译好的版本,如教程中的nginx 1.7.11.3 Gryphon
,下载地址详见教程,但是我打开已经404了。在查找了很多资料之后,这个下载路径是可用的:http://nginx-win.ecsds.eu/download/nginx 1.7.11.3 Gryphon.zip。
成功下载后按照原教程中的方式将下载好的东西添加到对应位置,注意如果下载的是nginx 1.7.11.3 Gryphon,修改好nginx-win.conf
后,直接使用nginx.exe -c conf\nginx-win.conf
启动即可,使用netstat -ano | findstr 0.0.0.0:80
检查是否成功启动。
D:\ProgramFile\nginx\nginx>nginx.exe -c conf\nginx-win.conf
C:\Users\YYL>netstat -ano | findstr 0.0.0.0:80
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 15884
提一下,windows下cmd可以使用nginx.exe -s stop -c conf\nginx-win.conf
停止nginx服务,此时使用命令查看已无对应服务
D:\ProgramFile\nginx\nginx>netstat -ano | findstr 0.0.0
由于工作需要最近在研究rtsp拉流与直播推流的问题,目前先在我本机上进行了实验,本博客记录学习的内容,包含windows下ffmpeg、nginx-rtmp环境搭建及opencv+ffmpeg+python进行拉流、直播推流的实施代码,还有一些遇见的问题的处理。目录一.nginx-rtmp服务器搭建及ffmpeg、VLC下载安装1.ffmpeg下载安装2.nginx-rtmp环境搭建3.本博客还涉及到使用VLC Media Player4.总结一下实际操作中常用的几个命令:二.opencv+ffmpeg+
Windows10下:
VS配置
OpenCV3.4.4:https://blog.csdn.net/m0_47917394/article/details/122349918
VS配置
ffmpeg:https://blog.csdn.net/a_eastern/article/details/118226613
opencv、
ffmpeg安装文件:https://download.csdn.net/download/weixin_45774698/85270965
window10+vs2015+opencv4.1.1+protobuf+ncnn
protobuf
$ git clone git@github.com:protocolbuffers/protobuf.git
$ cd .\protobuf\cmake
$ mkdir build
$ cd build
$ cmake .. -Dprotobuf_BUILD_TESTS=OFF -Dprotob...
Python推流本质是调用
FFmpeg的
推流进程,所以" pipe.stdin.write(img.tobytes()) "这句话报错时,可以考虑是
FFmpeg没有配置的原因。
推流术语…省略。
import cv2
# subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
import subprocess
# 视频读取对象
cap = cv2.VideoCapture(".../xx.mp4")
# 读取一帧
目录1.创建2.配置Mysql(1)连接数据库驱动(2)安装数据库驱动(3)创建表格(4)创建迁移文件并同步到数据库3.admin后台(1)创建超级用户(2)注册模型login_msg4.路由与视图4.1先搭框架4.2编写视图处理函数5.运行结果
练习完成一个有登录注册功能的Django项目,本文记录练习过程、相关知识点。
新建项目:Django_login,新建app:mine_login,并注册app
创建详见Djongo学习笔记——pycharm创建Django服务、app及相关知识点
要实现这个功能,你可以使用以下步骤:
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;
注意,这只是一个简单的示例代码,还需要进行更多的错误检查和异常处理。
ciky2011:
windows下ffmpeg+nginx-rtmp环境搭建及opencv+ffmpeg+python实现拉流和rtmp直播推流
m0_73539261:
Kaggle入门——Titanic+随机森林(调参)+逻辑回归
AnesthesiaYuu:
Django练习——基于Mysql的登录注册功能界面(django模型、模板、表单简单应用)
数据小菜鸟12138:
Django练习——基于Mysql的登录注册功能界面(django模型、模板、表单简单应用)
qq_47216728: