由于工作需要最近在研究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直播推流
  • 一.nginx-rtmp服务器搭建及ffmpeg、VLC下载安装

    1.ffmpeg下载安装

    下载地址: http://ffmpeg.org/download.html
    安装教程: https://zhuanlan.zhihu.com/p/118362010
    我按照这个下载安装是没有问题的,直接下载的是22M的那个。

    2.nginx-rtmp环境搭建

    参考教程: 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下编译步骤:
    在这里插入图片描述
    对于我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 opencvffmpeg安装文件: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: 表单数据(Content-Type(请求头)为application/x-www-form-urlencoded(form表单默认格式)):用request.POST获取 a = request.POST.get('a') alist = request.POST.getlist('a') 非表单数据(Content-Type(请求头)为application/json(json格式),multipart/form-data(文件)等): 用request.body获取 str = request.body.decode() windows下ffmpeg+nginx-rtmp环境搭建及opencv+ffmpeg+python实现拉流和rtmp直播推流 m0_73539261: 我能问一下这个延迟是多大吗 Kaggle入门——Titanic+随机森林(调参)+逻辑回归 AnesthesiaYuu: feature_train, target_train 是什么呀~ Django练习——基于Mysql的登录注册功能界面(django模型、模板、表单简单应用) 数据小菜鸟12138: 是的,就是mine_login里的views.py,也就是django框架里的说的views.py Django练习——基于Mysql的登录注册功能界面(django模型、模板、表单简单应用) qq_47216728: 请问是mine_login/views.py 和views.py是同一个文件吗