Docker中使用nginx-rtmp推拉网络摄像头视频流

news2024/11/15 19:39:52

前言:

该部分比较麻烦,闹腾了好久(ffmpeg推拉流没学过,事实证明依葫芦画瓢是不行滴,后面有时间再学吧),后来借助chatGPT勉强解决,但不是很懂。因个人能力有限,只复述操作过程,欢迎佬指导。

准备工作:

  • 搭建好了docker
  • 下载好nginx-rtmp镜像
  • 网络摄像头

Step1:

测试网络摄像头可用,python代码获取到的视频流如下:

Untitled

Step2:

在流媒体服务器中创建一个文件夹,然后里面添加nginx.conf文件,写此文时内容变成如下(这个是最后比较好的推流的时候自动生成的):

daemon off;

error_log /dev/stdout info;

events {
    worker_connections 1024;
}

rtmp {
    server {
        listen 1935;
        chunk_size 4000;

        application stream {
            live on;

            exec ffmpeg -i rtmp://localhost:1935/stream/$name
              -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 2500k -f flv -g 30 -r 30 -s 1280x720 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name_720p2628kbs
              -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 1000k -f flv -g 30 -r 30 -s 854x480 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name_480p1128kbs
              -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 750k -f flv -g 30 -r 30 -s 640x360 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name_360p878kbs
              -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 400k -f flv -g 30 -r 30 -s 426x240 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name_240p528kbs
              -c:a libfdk_aac -b:a 64k -c:v libx264 -b:v 200k -f flv -g 15 -r 15 -s 426x240 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name_240p264kbs;
        }

        application hls {
            live on;
            hls on;
            hls_fragment_naming system;
            hls_fragment 5;
            hls_playlist_length 10;
            hls_path /opt/data/hls;
            hls_nested on;

            hls_variant _720p2628kbs BANDWIDTH=2628000,RESOLUTION=1280x720;
            hls_variant _480p1128kbs BANDWIDTH=1128000,RESOLUTION=854x480;
            hls_variant _360p878kbs BANDWIDTH=878000,RESOLUTION=640x360;
            hls_variant _240p528kbs BANDWIDTH=528000,RESOLUTION=426x240;
            hls_variant _240p264kbs BANDWIDTH=264000,RESOLUTION=426x240;
        }
    }
}

http {
    root /www/static;
    sendfile off;
    tcp_nopush on;
    server_tokens off;
    access_log /dev/stdout combined;

    # Uncomment these lines to enable SSL.
    # ssl_protocols TLSv1.2 TLSv1.3;
    # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    # ssl_prefer_server_ciphers off;
    # ssl_session_cache shared:SSL:10m;
    # ssl_session_timeout 1d;

    server {
        listen 80;

        # Uncomment these lines to enable SSL.
        # Update the ssl paths with your own certificate and private key.
            
        # listen 443 ssl;
        # ssl_certificate     /opt/certs/example.com.crt;
        # ssl_certificate_key /opt/certs/example.com.key;

        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /opt/data;
            add_header Cache-Control no-cache;
            add_header Access-Control-Allow-Origin *;
        }

        location /live {
          alias /opt/data/hls;
          types {
              application/vnd.apple.mpegurl m3u8;
              video/mp2t ts;
          }
          add_header Cache-Control no-cache;
          add_header Access-Control-Allow-Origin *;
        }

        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root /www/static;
        }

        location /crossdomain.xml {
            default_type text/xml;
            expires 24h;
        }

我的原先版本借鉴了正点原子的文档(我太菜没搞好):

在这里插入图片描述

Step3:

创建一个容器,此处运行命令与上一篇不同:

docker run -it -p 1935:1935 -p 8080:80 --name my-nginx-rtmp-test -v /nginx/nginx.conf:/etc/nginx/nginx.conf -d alfg/nginx-rtmp
  • docker run:这是运行 Docker 容器的命令。

  • it:这两个选项结合了两个标志:

    • i:保持 STDIN 开启,即使未连接。
    • t:分配一个伪终端(tty)。

    它们一起允许你与容器进行交互,使容器在前台运行。

  • p 1935:1935:此标志将主机的端口 1935 映射到容器中的端口 1935。通常用于 RTMP(实时消息传递协议)流媒体。

  • p 8080:80:此标志将主机的端口 8080 映射到容器中的端口 80。通常用于提供 HTTP 流量服务。

  • -name my-nginx-rtmp-test:此标志为容器指定一个名称,这里是 “my-nginx-rtmp-test”。

  • v /nginx/nginx.conf:/etc/nginx/nginx.conf:此标志将本地文件 /nginx/nginx.conf 挂载到容器的路径 /etc/nginx/nginx.conf。这用于提供自定义的 Nginx 配置。

  • d:此标志以后台模式(detached mode)运行容器。

  • alfg/nginx-rtmp:这是用于创建容器的 Docker 镜像的名称。在这种情况下,它是一个配置了 RTMP 支持的 Nginx 服务器镜像。

至此,流媒体服务器创建成功:
在这里插入图片描述

Step4:

推流(这才是难点啊),在推流尝试中出现过如下问题:

  • 视频流是HEVC编码,而FLV格式不支持HEVC编码
  • HEVC找不到参考帧:
  • RTSP流延迟和数据包丢失
  • FLV头更新失败

解决:

在控制台先推流一段时间,看看报了那些错误,然后根据这些错误提示去搜索解决的办法(确实不懂ffmpeg),然后一个个尝试,然后比较好点的推流解决方法建议是:使用 -use_wallclock_as_timestamps 1 选项,该选项可以将系统时钟作为时间戳,而不是依赖于从 RTSP 流中提取的时间戳。这有时可以解决时间戳问题。
推流命令如下:

ffmpeg -use_wallclock_as_timestamps 1 -rtsp_transport tcp -i rtsp://admin:admin@ip -c:v libx264 -b:v 1000k -c:a aac -ar 44100 -f flv rtmp://ip:1935/stream/example
  • use_wallclock_as_timestamps 1:使用 wallclock 作为时间戳。
  • rtsp_transport tcp:使用 TCP 作为 RTSP 传输协议。
  • i rtsp://admin:admin@ip:输入源是一个 RTSP 地址,包括用户名和密码,以及相应的 IP 地址。
  • c:v libx264:设置视频编码器为 libx264。
  • b:v 1000k:设置视频比特率为 1000k(1000 kbps)。
  • c:a aac:设置音频编码器为 AAC。
  • ar 44100:设置音频采样率为 44100 Hz。
  • f flv:指定输出格式为 FLV。
  • rtmp://ip:1935/stream/example:指定输出的 RTMP 地址,包括服务器的 IP 地址和端口,以及流的名称为 “example”。

效果:

上面的图是python中测试的,下图是在局域网下其他电脑上拉取流的情况,有延迟!!!后面再琢磨吧,欢迎佬指导
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1491066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端部署真的不简单

公众号:程序员白特,欢迎一起交流学习~> 原文:前端部署真的不简单 - 掘金 (juejin.cn) 现在大部分的中小型公司部署前端代码都是比较简单的,主要步骤如下: 首先,通过脚手架提供的命令npm run build打包前端代码&…

外汇天眼:蓝莓市场终止所有MT4/MT5专业公司业务

总部位于澳大利亚的零售外汇和差价合约经纪商蓝莓市场宣布,已终止其数据和平台服务产品,该产品旨在通过利用其基础设施为专业公司行业提供服务。 蓝莓市场表示,已经对其数据和平台服务产品“落下帷幕”,与所有专业交易公司包括MyF…

3分钟开通GPT-4

AI从前年12月份到现在已经伴随我们一年多了,还有很多小伙伴不会开通,其实开通很简单,环境需要自己搞定,升级的话就需要一张visa卡,办理visa卡就可以直接升级chatgptPLSU 一、虚拟卡支付 这种方式的优点是操作简单&…

html邮件基本使用方法?如何发送HTML邮件?

html邮件是什么意思?如何在HTML中创建电子邮件链接? HTML邮件以其丰富的格式和视觉效果,让我们的邮件内容更加生动和吸引人。那么,HTML邮件的基本使用方法是什么呢?我们又该如何发送HTML邮件呢?下面&#…

Linux之HTTP协议

目录 一、HTTP协议 1.1 HTTP概念 1.2 HTTP协议的格式 1.3 URL 1.4 HTTP的请求方法 1.5 HTTP的状态码 1.6 HTTP报头 1.7 长链接与短链接 1.8 Cookie与Session 1.8.1 Cookie的概念 1.8.2 Cookie的应用场景 1.8.3 Session的概念 一、HTTP协议 1.1 HTTP概念 HTTP&…

使用Javassist 在android运行时生成类

序言 最近在写框架,有一个需求就是动态的生成一个类,然后查阅了相关文献,发现在android中动态生成一个类还挺麻烦。因次把一些内容分享出来,帮助大家少走弯路。 方案一 DexMaker DexMaker 是一个针对 Android 平台的库&#xf…

Java动态转发代理IP的实现方法

目录 前言 一、代理IP池的管理 二、代理IP的请求转发 总结 前言 在某些情况下,我们可能需要在Java应用程序中使用代理IP来进行网络请求。而有时候,我们希望能够动态地切换代理IP,以增加请求的成功率和效果。本文将介绍如何在Java中实现动…

【深度学习笔记】5_8 网络中的网络NiN

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 5.8 网络中的网络(NiN) 前几节介绍的LeNet、AlexNet和VGG在设计上的共同之处是:先以由卷积层构成的…

深度学习_16_权重衰退调整过拟合

所谓过拟合即模型复杂度较高,但用于训练数据集过于简单,最后导致模型将过多无用渣质作为学习对象 这个在上篇 深度学习_15_过拟合&欠拟合 已经详细介绍,以下便不再赘述。 上篇提到要想解决过拟合现象可以试着降低模型复杂度&#xff0c…

边缘计算网关在机床生产中的应用-天拓四方

随着工业4.0的推进,物联网(IoT)技术在各个工业领域中的应用日益广泛。特别是在机床行业,物联网技术的引入不仅提高了生产效率,还实现了对机床设备的实时监控和远程维护。在这一背景下,边缘计算网关的角色愈…

牛客网 计算某个字符出现的次数

在本题中,我们是要统计一个字符串中重复字母出现的次数,我们把输入的字母转换成小写,然后把字符串也都转换成小写,然后把字符串中包含字母的地方替换成空。然后直接用字符串减去替换完成的字符串,就是我们要统计的个数…

c++ opecv项目实战

1、银行卡识别项目 参考文章 操作流程: 1、提取模板的每个数字 读取图片->转换为灰度图像->二值化图像(大于10取0,小于取255)->轮廓检测->绘制轮廓->对所有轮廓进行排序->提取模板所有轮廓每个数字 2、读取信用卡->转换为灰度图像…

unity Game视图看不到贴花,但是在Scene视图能看到

解决方法:找到URP的配置文件 ,修改Quality–RederScale为1,就可以了,这是unity 的bug,2022版本以后就没有这个问题了

09 Qt扩展LineEdit组件:Input输入框

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起:自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起:自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件:令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

ROS读书记录1:机器人SLAM导航核心技术与实战1

机器人SLAM导航核心技术与实战1 第一章第2章 ROS简介 视频参考: 《机器人SLAM导航核心技术与实战》书籍配套教学视频 第一章 第2章 ROS简介 ROS:机器人开发平台 ①ROS是一个分布式通信框架(最核心的本质 ②ROS是一个开发工具的集台 ③ROS是一系列开源软件包 计算…

OpenDDS之QosXml库编译(Windows + VS2019)

目录 1、需求背景2、基础环境3、编译xercesc3.1、下载xercesc3.2、编译xercesc 4、编译ACE_XML_Utils4.1、生成XML_Utils解决方案4.2、编译XML_Utils 5、编译QOS_XML_XSC_Handlerd5.1、生成QOS_XML_XSC_Handlerd解决方案5.2、编译QOS_XML_XSC_Handlerd 6、测试例子6.1、生成dum…

百度文库旋转验证码识别

最近研究了一下图像识别,一直找到很好的应用场景,今天我就发现可以用百度的旋转验证码来做一个实验。没想到效果还挺好,下面就是实际的识别效果。 1、效果演示 2、如何识别 2.1准备数据集 首先需要使用爬虫,对验证码图片进行采…

leetcode最大二叉树

在本题中,我们是要将给定的数组构成一个二叉树,其根节点是数组中最大的元素,左子树都是最大值左边元素组成的,右子树都是最大值右边元素组成的。所以本题的关键在于我们先需要找到最大的元素。 我们构造二叉树,一般是采…

Vue.js 实用技巧:深入理解 Vue.mixin

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

商业数据增长超88%!小红书热门内容解析,用户“打卡”新玩法

长久以来,“打卡”在社交媒体盛行,频频涌现新风潮,几乎覆盖美食、旅游、美妆等众多热门行业,今天吃了什么、玩了什么、做了什么?大众都喜欢通过打卡来分享。特别是小红书平台,打卡内容热度经久不衰&#xf…