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

前言:

该部分比较麻烦,闹腾了好久(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中测试的,下图是在局域网下其他电脑上拉取流的情况,有延迟!!!后面再琢磨吧,欢迎佬指导
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

合泰HT66F2390----定时器中断学习笔记

前言 无需多言 直接开始定时器中断 的学习 通过上次的PWM学习&#xff0c;上次用的是周期型TM定时器模块 这次使用标准型TM定时器模块&#xff08;STM&#xff09; 代码 #include <HT66F2390.h>void Timer0_Init(void){_stm0c0 0b00001000;_stm0c1 0b11000001;_stm…

Vmware虚拟机安装openEuler 20.03 LTS(openEuler20.03)

文章目录 vmware虚拟机安装openEuler 20.03 LTS安装硬件设备&#xff08;略&#xff09;安装OS镜像下载镜像版本发布说明开始安装&#xff08;vmware虚拟机&#xff09;安装操作系统必要操作关闭防火墙设置selinux为宽容模式系统内核问题禁用系统内核更新 ~~禁用yum update和dn…

Ubuntu18.04运行ORB-SLAM3

ORB-SLAM3复现(ubuntu18) 文章目录 ORB-SLAM3复现(ubuntu18)1 坐标系与外参Intrinsic parameters2 内参Intrinsic parameters2.1 相机内参① 针孔模型Pinhole② KannalaBrandt8模型③ Rectified相机 2.2 IMU内参 3 VI标定—外参3.1 Visual calibration3.2 Inertial calibration…

构造pop链

反序列化视频笔记 第一步&#xff1a;找到目标触发echo调用$flag 第二步&#xff1a;触发_invoke函数调用appeng函数$varflag.php&#xff08;把对象当成函数&#xff09; 第三步&#xff1a;给$p赋值为对象&#xff0c;即function成为对象Modifier却被当成函数调用&#xff…

基于springboot+vue的校园网上店铺

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Android开发者必看,我的移动开发春季历程

热修复介绍 1.开发流程 当项目出现紧急bug时&#xff0c;传统的开发流程是发布新版本&#xff0c;引导用户覆盖安装。抛开平台审核上线的时间不说&#xff0c;一天重复下载安装至少两次的用户体验是很差的。而热修复的出现完美解决了这个问题&#xff0c;用户在收到服务器推送…

概要了解postman、jmeter 、loadRunner

postman还蛮好理解的&#xff0c;后续复习的话着重学习关联接口测试即可&#xff0c;感觉只要用几次就会记住&#xff1a; 1 从接口的响应结果当中提取需要的数据 2 设置成环境变量/全局变量&#xff08;json value check 、set environment para 3写入到下一个接口的请求数据中…

python三剑客之一——Numpy

温故而知新&#xff0c;借着工作需要用到Numpy的机会重新学习一遍Numpy。 Numpy是一个运行速度非常快的数学库&#xff0c;主要用于数组计算&#xff0c;包含如下&#xff1a; 一个强大的N维数组对象ndarray【Nd&#xff08;Dimension维度&#xff09;array】 广播功能函数 整…

找不到msvcr100.dll怎么办,多种解决方法快速修复msvcr100.dll问题

当计算机系统中关键文件msvcr100.dll丢失时&#xff0c;可能会引发一系列运行问题和故障现象。msvcr100.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序正常运行至关重要。由于msvcr100.dll是许多应用程序运行所必需的动态…

22.基于springboot + vue实现的前后端分离-汽车票网上预定系统(项目 + 论文PPT)

项目介绍 系统是一个B/S模式系统&#xff0c;采用Spring Boot框架&#xff0c;MySQL 数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得汽车票网上预订系统管理工作系统化、规范化。本系统的使用使管理人…

外包干了3个月,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

第1题:两数之和

题目内容&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。…

Vue 3的Composition API和vue2的不同之处

Vue 3的Composition API是Vue.js框架的一个重要更新&#xff0c;它提供了一种新的组件逻辑组织和复用方式。在Vue 2中&#xff0c;我们通常使用Options API&#xff08;data、methods、computed等&#xff09;来组织组件的逻辑&#xff0c;但这种组织方式在处理复杂组件时可能会…

如何搭建Nacos集群

1.搭建Nacos集群 众所周知&#xff0c;在实际的工作中&#xff0c;Nacos的生成环境下一定要部署为集群状态 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。 我们计划的集群结构&#xff1a; 我就直接在本机上开三个Nacos来搭…

python基础——基础语法

文章目录 一、基础知识1、字面量2、常用值类型3、注释4、输入输出5、数据类型转换6、其他 二、字符串拓展1、字符串定义2、字符串拼接3、字符串格式化4、格式化精度控制 三、条件/循环语句1、if2、while3、for循环 四、函数1、函数定义2、函数说明文档3、global关键字 五、数据…

02:HAL库---GPIO

一:GPIO 1:简历 2:模式 输入 : IO向32发送信号, 即外设发送信号 GPIO_Mode_AIN -----模拟输入 GPIO_Mode_IN_FLOATING -----浮空输入 GPIO_Mode_IPD -----下拉输入 GPIO_Mode_IPU ------上拉输入 GPIO_MODE_INPUT----输入模式 输出 : 32向IO发送信号, 即外设接收信号 …

JavaScript实现鼠标移动特效

关键代码&#xff1a; <script>document.onmousemove function (e) {// 加div节点var div document.createElement(div);div.style.width 5px;div.style.height 5px;// 加img节点var img document.createElement(img);// 将Img追加到div里面。div.appendChild(img);…

MongoDB Helloworld For Window

1. 下载MongoDB Download MongoDB Community Server | MongoDB 2. 安装MongoDB 3. 创建DB. 4. 用java code 连接mongo. 做增删改查操作。 pom.xml <dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId>&…

Android开发者应该会哪些东西才不会被公司淘汰,阿里P7大佬手把手教你

去年疫情的影响可以说是地狱级的。各大厂都在裁员&#xff0c;我也顺理成章的被公司下架了。 35岁&#xff0c;还有一种尴尬是 别人眼中的你应该是他们未来以为能活成的样子&#xff0c; 和如今真正的自己… 我做了什么 刚被裁掉的那一阵子&#xff0c;我整个人都是懵掉的&am…

网络编程作业day5

将课堂上实现的模型&#xff08;IO多路复用&#xff09;重新自己实现一遍 服务器代码&#xff1a; #include<myhead.h> #define SER_IP "192.168.125.151" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv…