使用FFmpeg处理RTSP视频流并搭建RTMP服务器实现图片转直播全流程

news2024/10/6 10:31:52

目录

  • 一、FFmpeg安装与配置教程
  • 二、搭建并配置Nginx RTMP服务器
  • 三、从RTSP视频流提取帧并保存为图片
  • 四、将图片序列转换为视频
  • 五、将视频推送为直播流
  • 六、将图片序列推送为直播流

在实时音视频领域,我们经常需要处理从各种源(如摄像头)获取的视频流。本文将详细介绍如何通过FFmpeg工具链,从RTSP视频流中按秒抽取帧生成图片,并进一步将这些图片转化为连续的视频流,最终推送至自建的Nginx RTMP服务器进行实时直播。这将涵盖从视频流切片、转码到直播发布的一整套技术流程。

一、FFmpeg安装与配置教程

FFmpeg作为一款功能丰富的跨平台音视频处理软件,在Windows平台上有着广泛的应用场景,如格式转换、抓取流媒体、视频编码解码、截图制作等等。为了充分利用其强大功能,正确安装和配置FFmpeg至关重要。

FFmpeg的选择与下载

选择合适的版本
首先,访问FFmpeg官方下载页面(https://ffmpeg.org/download.html),在这里可以找到最新的稳定版或 nightly 构建版本。对于大多数常规用途,推荐下载预编译的Windows静态版本,它不需要额外的库支持即可运行。

在这里插入图片描述

下载ZIP文件

在官方下载页面中找到适用于Windows系统的版本链接,并直接下载压缩包,如果追求更高的效率和最新特性,也可以下载预编译的FFmpeg完整二进制包。

Releases:https://github.com/BtbN/FFmpeg-Builds/releases

在这里插入图片描述
在这里插入图片描述

FFmpeg的安装与解压

解压缩文件
下载完成后,使用7-Zip、WinRAR或其他解压工具打开压缩包。解压后,你会得到一个“ffmpeg-master-latest-win64-gpl-shared”这样的文件夹,其中包含了所有必要的FFmpeg执行文件和动态链接库。

在这里插入图片描述

配置环境变量

复制bin文件夹的位置D:\Software\ffmpeg-master-latest-win64-gpl-shared\bin

在这里插入图片描述

右键点击“此电脑”或“计算机”,选择“属性” -> “高级系统设置” -> “环境变量”。
在这里插入图片描述

在“系统变量”区域中找到“Path”变量,点击“编辑”。

在这里插入图片描述
在这里插入图片描述

点击“新建”,然后添加FFmpeg所在文件夹的完整路径。

在这里插入图片描述

保存更改并关闭所有窗口。

验证FFmpeg安装与基本使用

验证安装
打开命令提示符或PowerShell,输入ffmpeg -version并回车。若显示FFmpeg的版本信息,则表示安装成功并已正确配置·环境变量。

在这里插入图片描述

二、搭建并配置Nginx RTMP服务器

为了将上述视频内容推送到新的直播地址供用户观看,我们需要搭建一个Nginx RTMP服务器。以下是简化的配置过程:

  1. 下载

下载Nginx源码和RTMP模块:

git clone https://github.com/nginx/nginx.git
git clone https://github.com/arut/nginx-rtmp-module.git

将RTMP模块复制到Nginx的文件夹下面

  1. 配置RTMP模块

在Nginx配置文件( nginx.conf)中添加如下RTMP相关设置:

rtmp {
    server {
        listen 1935; # RTMP监听端口,默认为1935
        chunk_size 4096;

        application live {
            live on;
            record off;
            # 示例推流地址:rtmp://localhost:1935/live/mystream
        }
    }
}

这配置了RTMP服务器监听1935端口,开启直播应用,并禁用录制功能。

  1. 启动Nginx RTMP服务器
    运行Nginx可执行文件来启动服务器。对于Windows系统,在命令行切换到Nginx bin目录下运行 nginx.exe;对于Linux系统,可能需要使用 ./nginx 命令启动。

三、从RTSP视频流提取帧并保存为图片

首先,确保你的系统已安装FFmpeg,并且有足够的权限访问文件系统。下面是一个示例bash命令,用于从RTSP视频流地址每秒抓取一帧并保存为JPEG格式图片:

ffmpeg -i rtsp://admin:123@192.168.0.144 -vf fps=1 -q:v 2 /path/to/output/frame_%03d.jpg
  • -i 参数后跟随的是RTSP视频流地址。
  • -vf fps=1 指定每秒抽样一帧。
  • q:v 2 表示使用高质量进行编码。质量参数的取值范围通常是从0到51,其中0表示最高质量(文件最大),51表示最低质量(文件最小)。这个数值越小,生成的图片质量越高,但文件体积也会越大;反之,数值越大,图片质量会降低,文件体积相应减小。
  • 输出路径 /path/to/output/frame_%03d.jpg 表示将图片按照顺序命名存储。

封装

#!/bin/bash

# RTSP视频流地址
rtsp_url="rtsp://admin:123@192.168.0.144"

# 输出目录
output_dir="/path/to/your/output/directory"

# FFmpeg命令,每秒抓取一帧并保存为JPEG格式图片
ffmpeg -i "$rtsp_url" -vf fps=1 -q:v 2 "$output_dir/frame_%03d.jpg"

四、将图片序列转换为视频

当图片成功抽取并存储后,可以再次利用FFmpeg将其转换为一个连续的视频文件,以下是一个基本的命令示例,说明如何将一组按顺序命名(例如frame001.jpg, frame002.jpg, …, frameNNN.jpg)的图片序列转换为视频:

ffmpeg -framerate 30 -i frame%03d.jpg -c:v libx264 -pix_fmt yuv420p -crf 23 -vf "scale=1280:720" output.mp4
  • -framerate 30:设置帧率,即每秒钟播放多少帧图像。
  • -i frame%03d.jpg:指定输入文件格式,这里的 %03d 表示三位数的零填充序列号(如001、002等)。
  • -c:v libx264:指定视频编码器为H.264。
  • -pix_fmt yuv420p:指定像素格式,这是大多数设备和播放器广泛支持的一种格式。
  • -crf 23:恒定质量因子(Constant Rate Factor),数值越低,视频质量越高,但文件也越大;一般在18到28之间选择一个平衡点。
  • -vf "scale=1280:720":可选的视频滤镜,用于缩放每个图片到指定分辨率(这里是1280x720)。
  • output.mp4:最终输出的视频文件名。

五、将视频推送为直播流

将图片生成的视频文件作为流推送至Nginx RTMP服务器。由于前面我们已经将图片序列转换成了视频文件,可以直接推送该视频文件:

ffmpeg -re -i output.mp4 -c copy -f flv rtmp://localhost:1935/live/mystream
  • -re 参数表示以实际时间速率读取输入文件。
  • -i output.mp4 指定要推送的视频文件。
  • -c copy 表示复制流而无需重新编码,提高效率。
  • -f flv 指定输出格式为FLV,适应RTMP协议。
  • 推送地址 rtmp://localhost:1935/live/mystream 应与Nginx配置中的应用及流名称匹配。

六、将图片序列推送为直播流

或者将图片文件作为流推送至Nginx RTMP服务器。

ffmpeg -framerate 30 -i frame%03d.jpg -c:v libx264 -pix_fmt yuv420p -preset veryfast -g 60 -f flv rtmp://your.server.url/live/stream_key
  • -framerate 30:设置帧率。
  • -i frame%03d.jpg:输入图片文件格式。
  • -c:v libx264:指定视频编码器为H.264。
  • -pix_fmt yuv420p:指定像素格式。
  • -preset veryfast:设置H.264编码速度预设,veryfast适用于实时推流场景。
  • -g 60:关键帧间隔,这里设置为60帧,即每60帧产生一个关键帧(I帧)。
  • -f flv:指定输出格式为FLV,这是RTMP协议常用的封装格式。
  • rtmp://your.server.url/live/stream_key:你的RTMP服务器地址和流密钥。

完成以上步骤后,FFmpeg会读取图片序列并将其转码成视频流,然后推送到指定的RTMP服务器地址。可以通过VLC播放URL观看这个由图片生成的实时流。

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

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

相关文章

Java练手项目 个人学习等选题参考

难度系数说明: 难度系数用来说明项目本身进行分析设计的难度 难度系数大于1的项目是非常值得反复学习的,从项目中成长 前言 大家好,我是二哈喇子,此博文整理了各种项目需求 要从本篇文章下的项目中学习的思路: 用的…

【架构】MVC架构模式 三层架构

1 不使用MVC架构模式完成银行账户转账 <% page contentType"text/html;charsetUTF-8" language"java" %> <html><head><base href"${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.…

[MRCTF2020]Ez_bypass1 and [网鼎杯 2020 青龙组]AreUSerialz1()php语言基础学习,以及序列化概念的基本了解

1.[MRCTF2020]Ez_bypass1 &#xff08;1&#xff09;打开环境后它是一串很长并且看起来非常混乱的代码&#xff0c;看不懂那咱就先不管&#xff0c;直接查看源码 &#xff08;2&#xff09;看了之后可以发现它涉及到很多东西 首先就是要进行一个仔细的代码审计&#xff0c;分…

网络基础-ICMP协议

ICMP&#xff08;Internet Control Message Protocol&#xff0c; Internet控制消息协议&#xff09; ICMP协议是IP协议的辅助协议&#xff0c;用于在IP网络上发送控制消息&#xff0c;它通常被用于诊断网络故障、执行网络管理任务以及提供一些错误报告&#xff1b;对于收集各…

XWiki 服务没有正确部署在tomcat中,如何尝试手动重新部署?

1. 停止 Tomcat 服务 首先&#xff0c;您需要停止正在运行的 Tomcat 服务器&#xff0c;以确保在操作文件时不会发生冲突或数据损坏&#xff1a; sudo systemctl stop tomcat2. 清空 webapps 下的 xwiki 目录和 work 目录中相关的缓存 删除 webapps 下的 xwiki 目录和 work …

回炉重造java----单列集合(List,Set)

体系结构: 集合主要分为两种&#xff0c;单列集合collection和双列集合Map&#xff0c;区别在于单列集合一次插入一条数据&#xff0c;而双列的一次插入类似于key-value的形式 单列集合collection 注:红色的表示是接口&#xff0c;蓝色的是实现类 ①操作功能: 增加: add()&am…

六级仔细阅读

画两到三个词&#xff0c;精准定位 要原文和同义都满足才选 先看题目&#xff0c;在看原文&#xff0c;不要先看选项 做不出答案就继续往下读&#xff0c;读出来了就不用继续读了 分清楚是问为什么还是是什么&#xff0c;是什么看前面&#xff0c;为什么看后面 不知道就优先…

三、配置带HybridCLR的ARCore开发环境

预告 本专栏将介绍如何使用这个支持热更的AR开发插件&#xff0c;快速地开发AR应用。 专栏&#xff1a; Unity开发AR系列 插件简介 通过热更技术实现动态地加载AR场景&#xff0c;简化了AR开发流程&#xff0c;让用户可更多地关注Unity场景内容的制作。 “EnvInstaller…”支…

Java JVM 浅析

为什么要有JVMJVM是什么&#xff1f;JVM的工作流程和组成部分JVM规范和JVM实现JVM原理详解 带着以上问题&#xff0c;我将尝试对JVM作出一些简单的介绍。 一、JVM 简介 在90年代初&#xff0c;软件开发面临一个大问题&#xff0c;即不同的操作系统和硬件架构要求开发不同的版本…

【Java代码审计】代码审计的方法及常用工具

【Java代码审计】代码审计的方法及常用工具 代码审计的常用思路代码审计辅助工具代码编辑器测试工具反编译工具Java 代码静态扫描工具 代码审计的常用思路 1、接口排查&#xff08;“正向追踪”&#xff09;&#xff1a;先找出从外部接口接收的参数&#xff0c;并跟踪其传递过…

3DGS+3D Tiles融合已成 ,更大的场景,更细腻的效果~

最近国外同行Kieran Farr发布了一个他制作的3D GussianSplatting(高斯泼溅)Google Map 3D Tiles的融合叠加的demo案例&#xff08;如下所示&#xff09;。 准确来说这是一个数据融合的实景场景&#xff0c;该实景场景使用了倾斜三维和3D GussianSplatting两种实景表达技术&…

深入理解Java TreeSet:实现与使用案例分析

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

【WPF学习笔记(一)】WPF应用程序的组成及Window类介绍

WPF应用程序的组成及Window类介绍 WPF应用程序的组成及Window类介绍前言正文1、WPF介绍1.1 什么是WPF1.2 WPF的特点1.3 WPF的控件分类 2、XAML介绍2.1 XAML的定义2.2 XAML的特点2.3 XAML的命名空间 3、WPF应用程序组成3.1 App.config3.2 App.xaml3.3 App.xaml.cs3.4 MainWindow…

react18【实战】tab切换,纯前端列表排序(含 lodash 和 classnames 的安装和使用)

技术要点 动态样式 className{tabItem ${currentType item.value && "active"}}安装 lodash npm i --save lodash使用 lodash 对对象数组排序&#xff08;不会改变源数组&#xff09; _.orderBy(dataList, "readNum", "desc")src\De…

十二种网络威胁防护方案

一、SQL注入 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服务器执行非授权的任…

Python之数据分析基础

导言&#xff1a; “21世纪的竞争是数据的竞争&#xff0c;谁掌握数据&#xff0c;谁就掌握未来”。如何将大量看似杂乱无章的数据进行聚合&#xff0c;并发现潜在的规律也变得越来越重要。本文将先说明数据分析的步骤&#xff0c;再通过python完成实例数据的处理、分析最终展…

19.接口自动化-Jekins学习

1.CI-持续集成 频繁的&#xff08;一天多次&#xff09;将代码集成到主干 目的&#xff1a;让产品快速迭代&#xff0c;保持高质量 好处&#xff1a; 快速发现错误&#xff0c;每次更新都集成到主干&#xff0c;可以快速发现错误&#xff0c;定位错误也容易防止分支大幅偏离主…

示波器基础1-带宽

数字示波器最重要的基本特征之一是其带宽&#xff0c;了解带宽及其对技术指标的影响对于选择合适的示波器非常有帮助。 这里我们对示波器带宽的一些基本方面做一简要介绍。 当我们谈到示波器的带宽时&#xff0c;重要的是要区分模拟带宽和数字带宽。模拟带宽主要受仪器模拟输入…

TriCore: Architecture

说明 本文是 英飞凌 架构文档 TriCore TC162P core archiecture Volume 1 of 2 (infineon.com) 的笔记&#xff0c;稍作整理方便查阅&#xff0c;错误之处&#xff0c;还请指正&#xff0c;谢谢 :) 1. Architecture 2. General Purpose & System Register 名词列表&#…

Spring Cloud Alibaba 网关 Gateway 集成(7)

项目的源码地址 Spring Cloud Alibaba 工程搭建&#xff08;1&#xff09; Spring Cloud Alibaba 工程搭建连接数据库&#xff08;2&#xff09; Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用&#xff08;3&#xff09; Spring Cloud Alibaba Ribbo…