目录
[一. 环境准备](#一. 环境准备)
[二. 安装FFmpeg](#二. 安装FFmpeg)
[三. 给docker主机安装docker服务](#三. 给docker主机安装docker服务)
[四. 使用 FFmpeg 进行推流测试](#四. 使用 FFmpeg 进行推流测试)
FFmpeg是一个非常强大的多媒体处理工具,它可以用于视频和音频的录制、转换以及流处理。在流处理方面,FFmpeg可以用来推流,即将本地媒体文件或者实时数据推送到流媒体服务器上。
一. 环境准备
关闭防火墙和selinux,进行时间同步。
|---------|----------------|----------------|----------------------------------|----------|
| 主机名 | IP | 系统 | 软件版本 | 配置信息 |
| ffmpeg | 192.168.226.31 | Rocky_linux9.4 | FFmpeg-n5.0.1 nasm-2.16.03 | 2核4G |
| galera2 | 192.168.226.32 | Rocky_linux9.4 | mysql-wsrep-8.0 galera-26.4.14-1 | 2核4G |
FFmpeg下载地址:https://github.com/FFmpeg/FFmpeg/tags
nasm下载地址nasm-2.16.03.tar.gz:Index of /pub/nasm/releasebuilds/2.16.03
二. 安装FFmpeg
下载并上传压缩包,这里我已经传好了。
bash
[root@ffmpeg ~]# ll
total 15748
-rw-r--r-- 1 root root 14428012 Aug 5 17:48 FFmpeg-n5.1.6.tar.gz
-rw-------. 1 root root 815 Jun 6 14:00 anaconda-ks.cfg
-rw-r--r-- 1 root root 1688160 Aug 5 19:40 nasm-2.16.03.tar.gz
首先安装编译 FFmpeg 所需的依赖项:
bash
[root@ffmpeg ~]# yum install -y epel-release
[root@ffmpeg ~]# yum install -y autoconf automake bzip2 bzip2-devel cmake freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel
安装 NASM
NASM 是一个汇编器,FFmpeg 需要它来编译
bash
[root@ffmpeg ~]# tar -xf nasm-2.16.03.tar.gz
[root@ffmpeg ~]# cd nasm-2.16.03
[root@ffmpeg nasm-2.16.03]# ./configure
[root@ffmpeg nasm-2.16.03]# make && make install
[root@ffmpeg nasm-2.16.03]# nasm -v
NASM version 2.16.03 compiled on Aug 5 2024
安装x264
bash
[root@ffmpeg ~]# git clone https://code.videolan.org/videolan/x264.git
[root@ffmpeg ~]# cd x264/
#--enable-static 使得构建过程中生成静态库。
#--enable-shared 使得构建过程中生成共享库。
[root@ffmpeg x264]# ./configure --enable-static --enable-shared
[root@ffmpeg x264]# make && make install && cd ~
[root@ffmpeg ~]# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
[root@ffmpeg ~]# pkg-config --cflags --libs x264
获取 FFmpeg 源代码
bash
[root@ffmpeg ~]# tar -xf FFmpeg-n5.1.6.tar.gz
[root@ffmpeg ~]# cd FFmpeg-n5.1.6
[root@ffmpeg FFmpeg-n5.1.6]# ./configure --enable-shared --enable-libx264 --enable-gpl --prefix=/usr/local/ffmpeg --extra-cflags="-fPIC"
[root@ffmpeg FFmpeg-n5.1.6]# make && make install
[root@ffmpeg FFmpeg-n5.1.6]# echo $LD_LIBRARY_PATH
[root@ffmpeg FFmpeg-n5.1.6]# ls -l /usr/local/ffmpeg/lib/libavdevice.so.59
[root@ffmpeg FFmpeg-n5.1.6]# ls -l /usr/local/ffmpeg/lib/libavdevice.so.59.7.100
[root@ffmpeg FFmpeg-n5.1.6]# export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
[root@ffmpeg ~]# export PATH=/usr/local/ffmpeg/bin:$PATH
[root@ffmpeg ~]# source ~/.bashrc
[root@ffmpeg ~]# ffmpeg -version
ffmpeg version 5.1.6 Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 11 (GCC)
configuration: --enable-shared --enable-libx264 --enable-gpl --prefix=/usr/local/ffmpeg --extra-cflags=-fPIC
libavutil 57. 28.100 / 57. 28.100
libavcodec 59. 37.100 / 59. 37.100
libavformat 59. 27.100 / 59. 27.100
libavdevice 59. 7.100 / 59. 7.100
libavfilter 8. 44.100 / 8. 44.100
libswscale 6. 7.100 / 6. 7.100
libswresample 4. 7.100 / 4. 7.100
libpostproc 56. 6.100 / 56. 6.100
三. 给docker主机安装docker服务
安装
bash
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
配置加速器
bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.rainbond.cc"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
拉取nginx镜像
tiangolo/nginx-rtmp
是一个 Docker 镜像,用于提供 Nginx 和 RTMP(Real-Time Messaging Protocol)服务器的功能。这个镜像由 Tiangolo 维护,主要用于视频流媒体的处理和转发。
bash
[root@docker ~]# docker pull tiangolo/nginx-rtmp:latest
创建nginx配置文件
bash
[root@docker ~]# vim nginx.conf
worker_processes auto; # 自动根据可用的 CPU 核心数量设置 worker 进程数
rtmp_auto_push on;
events {
worker_connections 1024; # 增加 worker 可以处理的连接数
}
http {
sendfile on; # 启用高效文件传输
tcp_nopush on; # 发送响应时优化 TCP 包
tcp_nodelay on; # 减少网络延迟
keepalive_timeout 5 5; # 长连接超时设置
client_body_buffer_size 128k; # 客户端请求体缓冲区大小
client_max_body_size 10m; # 允许客户端请求的最大单文件字节数
client_body_timeout 10; # 客户端请求体超时
client_header_timeout 10; # 客户端请求头超时
send_timeout 10; # 响应发送超时
server {
listen 8080; # 监听 8080 端口
# HLS 配置
location /hls {
types {
application/vnd.apple.mpegurl m3u8; # 设置 MIME 类型
}
root /mnt/; # HLS 文件根目录
add_header Cache-Control no-cache; # 禁用缓存
add_header Access-Control-Allow-Origin *; # 跨域支持
}
}
}
rtmp {
server {
listen 1935; # 监听 1935 端口,用于 RTMP 流
listen [::]:1935 ipv6only=on; # 同时支持 IPv6
application live {
live on; # 启用直播
record off; # 关闭录制
# HLS 配置
hls on; # 启用 HLS
hls_path /mnt/hls/; # HLS 文件存储路径
hls_fragment 3s; # HLS 片段长度
hls_playlist_length 30s; # HLS 播放列表长度
}
}
}
运行并查看端口
bash
[root@docker ~]# docker run -d -p 1935:1935 -p 8080:8080 -v ./nginx.conf:/etc/nginx/nginx.conf --name nginx-rtmp tiangolo/nginx-rtmp
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c8eb664354a tiangolo/nginx-rtmp "nginx -g 'daemon of..." 18 seconds ago Up 17 seconds 0.0.0.0:1935->1935/tcp, :::1935->1935/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp nginx-rtmp
[root@docker ~]# ss -tnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=832,fd=3))
LISTEN 0 4096 0.0.0.0:1935 0.0.0.0:* users:(("docker-proxy",pid=16089,fd=4))
LISTEN 0 4096 0.0.0.0:8080 0.0.0.0:* users:(("docker-proxy",pid=16104,fd=4))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=832,fd=4))
LISTEN 0 4096 [::]:1935 [::]:* users:(("docker-proxy",pid=16094,fd=4))
LISTEN 0 4096 [::]:8080 [::]:* users:(("docker-proxy",pid=16127,fd=4))
四. 使用 FFmpeg 进行推流测试
准备一个视频文件、摄像头输入或其他任何 FFmpeg 支持的媒体源。
例如我在这个网站下载一个MP4的格式视频,大约五分钟的大小。
上传到ffmpeg主机,视频名为shipin.mp4
bash
[root@ffmpeg ~]# ll
total 76580
drwxrwxr-x 17 root root 4096 Aug 5 20:43 FFmpeg-n5.1.6
-rw-r--r-- 1 root root 14428012 Aug 5 17:48 FFmpeg-n5.1.6.tar.gz
-rw-------. 1 root root 815 Jun 6 14:00 anaconda-ks.cfg
drwxrwsr-x 24 802 900 4096 Aug 5 19:43 nasm-2.16.03
-rw-r--r-- 1 root root 1688160 Aug 5 19:40 nasm-2.16.03.tar.gz
-rw-r--r-- 1 root root 62278099 Aug 5 21:00 shipin.mp4
drwxr-xr-x 11 root root 4096 Aug 5 20:31 x264
推流测试
bash
[root@ffmpeg ~]# ffmpeg -re -i shipin.mp4 -c:v libx264 -preset ultrafast -maxrate 1500k -bufsize 3000k -pix_fmt yuv420p -g 50 -s 1280x720 -c:a aac -b:a 128k -ar 44100 -f flv rtmp://192.168.226.32:1935/live/stream
这个时候,切换到docker容器里查看
bash
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c8eb664354a tiangolo/nginx-rtmp "nginx -g 'daemon of..." 12 minutes ago Up 12 minutes 0.0.0.0:1935->1935/tcp, :::1935->1935/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp nginx-rtmp
[root@docker ~]# docker exec -it nginx-rtmp /bin/bash
root@2c8eb664354a:/# cd /mnt/hls/
root@2c8eb664354a:/mnt/hls# ls
stream-0.ts stream-1.ts stream-2.ts stream-26.ts stream-27.ts stream-28.ts stream-29.ts stream.m3u8
然后桌面新建一个.html结尾的文件,注意代码里你需要修改的是对应的IP地址
bash
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HLS Stream with Video.js</title>
<link href="https://vjs.zencdn.net/7.14.3/video-js.css" rel="stylesheet" />
<style>
/* 自定义 Video.js 播放器样式 */
.vjs-default-skin {
font-family: "Arial", sans-serif;
font-size: 16px;
color: #FFF;
background-color: #333;
border: 2px solid #555;
border-radius: 10px;
overflow: hidden;
}
.vjs-control-bar {
background: rgba(0, 0, 0, 0.7);
}
.vjs-big-play-button {
background: rgba(255, 255, 255, 0.3);
border: none;
border-radius: 50%;
}
.vjs-progress-holder {
background: rgba(255, 255, 255, 0.2);
}
.vjs-play-progress {
background: #FFCC00; /* 进度条前景色 */
}
.vjs-load-progress {
background: #666; /* 加载进度条色 */
}
.vjs-seek-to-live-control {
display: none;
}
.video-js {
width: 720px; /* 固定宽度 */
height: 405px; /* 固定高度,宽高比为16:9 */
margin: 0 auto; /* 水平居中 */
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);
display: block; /* 确保播放器为块级元素 */
}
body {
background-color: #333;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
</style>
</head>
<body>
<video id="my-video" class="video-js vjs-default-skin" controls preload="auto"
data-setup='{"fluid": false}'>
// 修改此处的IP为你的IP即可
<source src="http://192.168.226.32:8080/hls/stream.m3u8" type="application/x-mpegURL">
</video>
<script src="https://vjs.zencdn.net/7.14.3/video.min.js"></script>
<script>
var player = videojs('my-video', {
controls: true,
autoplay: false,
preload: 'auto'
});
// 示例: 监听播放进度事件
player.on('timeupdate', function() {
var currentTime = player.currentTime();
var duration = player.duration();
console.log('当前播放时间:', currentTime, '总时长:', duration);
});
</script>
</body>
</html>
在推流的同时,打开网页播放即可