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

目录

  • 一、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监听端口,默认为1935chunk_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.mzph.cn/pingmian/9893.shtml

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

相关文章

Yolov8目标检测——在Android上部署Yolov8 tflite模型

1. 简介 YOLOv8 是一种用于目标检测的深度学习模型,它是 YOLO(You Only Look Once)系列的最新版本之一。YOLO 系列因其高效和准确性而在计算机视觉领域非常受欢迎,特别是在需要实时目标检测的应用中,如视频监控、自动…

Jmeter中线程组介绍

1.线程数的意义 Jmeter采用了线程来模拟用户,即1个线程代表1个用户,线程可以简单理解为计算机处理任务时的一个具体执行人。 一个任务可以由多个人(线程)共同完成,也可以由一个人(线程)来完成&a…

Fastapi+docker+tortoise-orm+celery

因为项目是后期引入celery,所以导致构建docker的时候只有fastapi的项目,celery的重启比较麻烦 1.docker安装celery pip install celery安装celery的时候注意python版本与celery版本的适配,有些celery的版本不支持python的版本,具体的版本请看…

Ubuntu-22.04使用systemd.mount挂载本地磁盘

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、systemd.mount是什么?二、使用步骤1.增加mount文件2.测试mount文件 三、补充说明总结 前言 挂载磁盘方式我们都知道很多人喜欢在/etc/fstab里面…

网络基础-ICMP协议

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

微信原生小程序封装网络请求wx.request

安装 npm install mina-request构建 安装完成后需要在微信开发中工具中进行 npm 构建, 点击 工具 > 构建 npm 新建 http.js 文件 import WxRequest from mina-request // 对 WxRequest 进行实例化 const instance new WxRequest({baseUrl: 你的请求根路径,tim…

深入理解线程的两阶段终止模式:确保线程安全退出

序言 在多线程编程中,线程的安全退出是一个重要的问题。在实际应用中,我们经常需要确保线程在退出时能够完成必要的清理工作,同时避免因资源泄漏或状态不一致而导致的问题。线程的两阶段终止模式是一种解决这个问题的有效方法。本文将深入探…

React - sass配置

1. idea下载Easy Sass插件: 2. 启用后,我们写的scss文件不能直引用,所以还要下载sass依赖: (推荐使用.scss,因为与原生.css写法接近,.sass格式更严格) // 下载sass依赖 npm install sass sass-loader --s…

目标检测算法YOLOv7简介

YOLOv7由Chien-Yao Wang等人于2022年提出,论文名为:《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors》,论文见:https://arxiv.org/pdf/2207.02696 ,项目网页&#xff…

Go语言系统学习笔记(三):杂项篇

1. 写在前面 公司的新业务开发需要用到go语言,虽然之前没接触过这门语言,但在大模型的帮助下,边看项目边写代码也能进行go的项目开发,不过,写了一段时间代码之后,总感觉对go语言本身,我的知识体…

【Linux】从零开始认识动静态库 - 静态库

送给大家一句话: 永不言弃,就是我的魔法! ——阿斯塔《黑色四叶草》 ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ 从零…

C语言算法之队列快速入门教程

队列结构 queue.h #ifndef ZDPC_ALGORITHM_DEV_QUEUE_H #define ZDPC_ALGORITHM_DEV_QUEUE_H// 队列 typedef struct queue {int *arr; // 容器int cap; // 容量int size; // 元素个数int front; // 队首,用于出队int tail // 队尾,用于入队 } Queue;#…

Linux虚拟机运行“yum install gcc-c++”报错“Loading mirror speeds from cached hostfile”

目录 一、在Linux上安装Redis时,在终端执行命令“yum install gcc-c”时,报错: 二、然后发现linux的网络不通,什么网站都访问不了 三、连上网后,再变换yum源 四、重新运行yum install gcc 一、在Linux上安装Redis时…

Java中55种锁,高级面试题,最新面试题

Java中乐观锁在实际应用中如何解决并发问题? 乐观锁通过假设并发冲突发生概率较低来解决并发问题,主要通过数据版本控制实现。在更新数据前,会检查数据版本是否发生变化,只有在数据版本未变时才允许更新,这样可以避免…

SIUI便携式B超机维修Apogee 1000兽医超声波检查仪宠物医疗彩色多普勒深圳捷达工控维修

带微凸探头的 Siui Apogee 1000 Lite Siui 的最新版本提供了 Apogee 2300 的经济高效、高度便携的替代方案。 非常适合: 小动物兽医实践侧重于主要腹部、甲状腺和小部位的高分辨率成像。 流动兽医。 兽医进行心脏筛查,而不是进行全面超声心动图检查&am…

nginx_01

1.安装 yum install epel-release -y # 安装yum的扩展包 yum install nginx -y systemctl start nginx.service #启动nginx systemctl enable nginx.service # netstat -lntup # 查看端口占用情况 # 可以看到nginx默认占用了80端口 2.nginx配置 # 注意配置文件的语法格式…

haproxy配置安装,实现web服务器负载均衡

一、源码编译安装haproxy 2.x,配置服务启动脚本 1. 下载Haproxy源码包: wget -c https://repo.huaweicloud.com/haproxy/2.4/src/haproxy-2.4.8.tar.gz 2. 下载源码编译工具: yum install -y gcc gcc-c make 3. 下载Haproxy依赖包lua并编…

万物生长大会 | 创邻科技再登杭州准独角兽榜单

近日,由民建中央、中国科协指导,民建浙江省委会、中国投资发展促进会联合办的第八届万物生长大会在杭州举办。 在这场创新创业领域一年一度的盛会上,杭州市创业投资协会联合微链共同发布《2024杭州独角兽&准独角兽企业榜单》。榜单显示&…

什么是股指期货风险度?

期货风险度就像是你账户的“健康指标”,它告诉我们你用了多少资金来持有期货合约,以及你账户里还剩下多少“备用金”。风险度越高,意味着你的“备用金”越少,如果市场突然变化,你可能需要迅速补充资金。 股指期货风险…

Flink Stream API实践

目录 Flink程序的基本构成 获得执行环境(environment) 加载/初始化数据(source) 基于文件 基于socket 基于集合 自定义 转换操作(transformation) 基本转换 物理分区 任务链和资源组 名称和描述…