目录
- 一、FFmpeg安装与配置
- 二、搭建并配置Nginx RTMP服务器
- 三、从RTSP视频流提取帧并保存为图片
- 四、将图片序列转换为视频
- 五、将视频推送为直播流
- 六、将图片序列推送为直播流
- 七、播放实时流
场景:如何通过FFmpeg工具链,从RTSP视频流中按秒抽取帧生成图片,并进一步将这些图片转化为连续的视频流,最终推送至自建的Nginx RTMP服务器进行实时直播。
一、FFmpeg安装与配置
FFmpeg介绍
FFmpeg是一款功能丰富的跨平台音视频处理软件,如格式转换、抓取流媒体、视频编码解码、截图制作等等。访问官方下载页面(https://ffmpeg.org/download.html)。
下载ZIP文件
找到适用于Windows系统的版本链接,并直接下载压缩包,也可以下载预编译的FFmpeg完整二进制包。Releases:https://github.com/BtbN/FFmpeg-Builds/releases
解压缩文件
解压后会得到一个“ffmpeg-master-latest-win64-gpl-shared”这样的文件夹,包含了所有必要的执行文件和动态链接库。
配置环境变量
复制bin文件夹的位置D:\Software\ffmpeg-master-latest-win64-gpl-shared\bin
右键点击“此电脑”或“计算机”,选择“属性” -> “高级系统设置” -> “环境变量”。
在“系统变量”区域中找到“Path”变量,点击“编辑”。
点击“新建”,然后添加FFmpeg所在文件夹的完整路径。
保存更改并关闭所有窗口。
验证安装
打开命令提示符或PowerShell,输入ffmpeg -version
并回车。显示FFmpeg的版本信息则表示安装成功并已正确配置
二、搭建并配置Nginx RTMP服务器
下载:
下载Nginx源码和RTMP模块:
git clone https://github.com/nginx/nginx.git
git clone https://github.com/arut/nginx-rtmp-module.git
将RTMP模块复制到Nginx的文件夹下面
配置RTMP模块:
在Nginx配置文件( nginx.conf
)中添加如下RTMP相关设置,配置了RTMP服务器监听1935端口,开启直播应用,并禁用录制功能:
rtmp {server {listen 1935; # RTMP监听端口,默认为1935chunk_size 4096;application live {live on;record off;# 示例推流地址:rtmp://localhost:1935/live/mystream}}
}
启动Nginx RTMP服务器:
对于Windows系统,在命令行切换到Nginx bin目录下运行 nginx.exe
;对于Linux系统,使用 ./nginx
命令启动。
三、从RTSP视频流提取帧并保存为图片
提取帧
从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服务器地址和流密钥。
七、播放实时流
完成以上步骤后可以通过VLC播放URL观看这些实时流。