从零到1搭建流媒体服务器

从零到1搭建流媒体服务器

从零到1搭建一台流媒体服务器1.引言我在实际开发过程中遇到这样的需求,将摄像头采集的画面信息传输到Linux服务器上,然后传输到windows11端进行播放。基于此需求,所以我们需要在Linux环境下搭建一台类似"中转站"的流媒体服务器,摄像头将采集的数据信息推流到"流媒体服务器",然后windows环境下的播放器从流媒体服务器进行"拉流"。这就是我们常见的推拉流动作。

2.搭建环境windows端:win11家庭版Linux端:Ubuntu 24.04.2 LTSnginx: nginx/1.25.33.安装过程1.更新系统我们在每次安装服务时,最好都要更新一下系统,养成良好习惯

代码语言:javascript复制sudo apt update && sudo apt upgrade -y这个地方,在裸操作系统上,我们最好更改一下Apt源,改成国内的阿里云或清华源,我这里改成了阿里云

一般软件源的配置文件都在/etc/apt/source.list中,将文件打开,把文件内容替换成如下内容

代码语言:javascript复制deb http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse2.手动编译Nginx+RTMP1.安装相关依赖代码语言:javascript复制sudo apt install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev2.下载源码cd到你想要将源码安装到的目录,执行以下命令获取源码,并解压缩

代码语言:javascript复制wget http://nginx.org/download/nginx-1.25.3.tar.gz

wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.2.tar.gz -O nginx-rtmp-module-1.2.2.tar.gz

tar -xzvf nginx-1.25.3.tar.gz

tar -xzvf nginx-rtmp-module-1.2.2.tar.gz3.联合编译将以下命令按顺序执行

代码语言:javascript复制 cd nginx-1.25.3

cd nginx-1.25.3

./configure --add-module=../nginx-rtmp-module-1.2.2 --with-http_ssl_module

make

sudo make install命令执行完成后,输入如下查询命令

代码语言:javascript复制root@lqw:/home/lqw/VStream/nginx-1.25.3# /usr/local/nginx/sbin/nginx -v

nginx version: nginx/1.25.3如果正常显示nginx的版本信息等,就证明安装成功了。

3.配置Nginx为systemd系统管理接下来我们试图启动nginx服务

代码语言:javascript复制root@lqw:/home/lqw/VStream/nginx-1.25.3# systemctl start nginx

Failed to start nginx.service: Unit nginx.service not found.这个错误表明我们手动编译的nginx并不会自动注册到systemd服务,并不会自动注册为systemd服务,需要我们手动添加

添加方式如下:

1.创建服务文件代码语言:javascript复制vim /etc/systemd/system/nginx.service写入以下内容

代码语言:javascript复制[Unit]

Description=The NGINX HTTP and reverse proxy server

After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

ExecStartPre=/usr/local/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;'

ExecStart=/usr/local/nginx/sbin/nginx -g 'daemon on; master_process on;'

ExecReload=/usr/local/nginx/sbin/nginx -g 'daemon on; master_process on;' -s reload

ExecStop=/bin/kill -s QUIT $MAINPID

ExecStartPost=/bin/sleep 1

PrivateTmp=true

[Install]

WantedBy=multi-user.target2.重新加载systemd配置代码语言:javascript复制sudo systemctl daemon-reload再次尝试开启nginx服务并对nginx运行状态进行查询

代码语言:javascript复制systemctl start nginx

systemctl status nginx结果如下:

代码语言:javascript复制root@lqw:/home/lqw/VStream/nginx-1.25.3# systemctl status nginx

● nginx.service - The NGINX HTTP and reverse proxy server

Loaded: loaded (/etc/systemd/system/nginx.service; disabled; preset: enabled)

Active: active (running) since Thu 2025-04-03 14:14:41 CST; 4s ago

Process: 15580 ExecStartPre=/usr/local/nginx/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)

Process: 15582 ExecStart=/usr/local/nginx/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)

Process: 15585 ExecStartPost=/bin/sleep 1 (code=exited, status=0/SUCCESS)

Main PID: 15583 (nginx)

Tasks: 2 (limit: 9098)

Memory: 1.9M (peak: 3.6M)

CPU: 22ms

CGroup: /system.slice/nginx.service

├─15583 "nginx: master process /usr/local/nginx/sbin/nginx -g daemon on; master_process on;"

└─15584 "nginx: worker process"

4月 03 14:14:40 lqw systemd[1]: Starting nginx.service - The NGINX HTTP and reverse proxy server...

4月 03 14:14:41 lqw systemd[1]: Started nginx.service - The NGINX HTTP and reverse proxy server.表明此时nginx正在运行

4.配置nginxnginx的配置文件所在路径为:/etc/nginx/nginx.conf

我们打开这个文件,将文件中的内容替换成如下内容

代码语言:javascript复制user nobody nogroup;

worker_processes auto;

error_log logs/error.log warn;

pid logs/nginx.pid;

events {

worker_connections 1024;

}

rtmp {

server {

listen 1935;

chunk_size 4096;

application live {

live on;

record off;

# HLS 基础配置

hls on;

hls_path /tmp/hls;

hls_fragment 3s;

hls_playlist_length 60s;

# 安全设置

allow publish 127.0.0.1; # 限制推流IP

allow play all;

}

}

}

http {

include mime.types;

default_type application/octet-stream;

server {

listen 80;

server_name localhost;

# HLS 拉流端点

location /hls {

types {

application/vnd.apple.mpegurl m3u8;

video/mp2t ts;

}

root /tmp;

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 html;

}

}

}然后使配置生效

代码语言:javascript复制sudo nginx -s reload # 重新加载配置(不重启服务)我们也可以在 /usr/local/nginx/sbin下运行如下命令验证nginx配置文件是否有误

代码语言:javascript复制root@lqw:/usr/local/nginx/sbin# ./nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful5.推流与拉流测试假定我们在ubuntu服务器端进行推流动作,在windows端进行拉流动作

现在我们配置我们需要的环境

1.ubuntu端安装FFmpeg

1.什么是FFmpegFFmpeg 是一个开源、跨平台的多媒体处理工具和开发库,用于录制、转换、流式传输音频和视频。它支持几乎所有常见的音视频格式,并且功能强大,是许多音视频软件和平台(如 YouTube、VLC、Blender 等)的核心依赖。接下来我们开始安装

2.源码下载与编译执行以下命令完成操作

1.安装依赖工具代码语言:javascript复制sudo apt update

sudo apt install -y build-essential git cmake nasm yasm \

libx264-dev libx265-dev libvpx-dev libfdk-aac-dev \

libmp3lame-dev libopus-dev libass-dev2.编译并安装代码语言:javascript复制./configure --enable-gpl --enable-libx264 --enable-libx265 \

--enable-libvpx --enable-libfdk-aac --enable-libmp3lame \

--enable-libopus --enable-libass

make -j$(nproc) # 使用多核加速编译

sudo make install5.监测安装代码语言:javascript复制ffmpeg -version2.window端安装FFmpeg

本文以window64位系统为例

这里我贴一份文章,打开可以参考这份文章来进行下载

我们在ubuntu下准备一段MP4的视频

代码语言:javascript复制PS C:\Users\20510\Videos> ffmpeg -rw_timeout 5000000 -i rtmp://192.168.28.74/live/real_video -c copy -f segment -segment_time 5 output_%03d.mp4代码语言:javascript复制ffmpeg -re -i test.mp4 -vf scale=1280:720 -r 24 -flags +global_header -c:v libx264 -preset fast -c:a aac -b:a 128k -f flv rtmp://192.168.28.74/live/real_video代码语言:javascript复制ffplay rtmp://服务器IP/live/mystream代码语言:javascript复制ffmpeg -re -stream_loop -1 -i test.mp4 \

-vf "scale=1280:720" -r 24 \

-c:v libx265 -preset slower -b:v 5000k -x265-params "psy-rd=2.0:aq-mode=3" \

-c:a aac -b:a 128k \

-f flv rtmp://192.168.28.74/live/real_video3.测试Linux端:进入准备好的视频所在目录

输入以下命令

代码语言:javascript复制ffmpeg -re -stream_loop -1 -i test.mp4 \

-vf "scale=1280:720:flags=lanczos,format=yuv420p" -r 24 \

-flags +global_header \

-c:v libx264 -preset slower -crf 18 -b:v 6000k -maxrate 8000k -bufsize 12000k \

-x264-params "profile=high:keyint=48:ref=4:aq-mode=2:psy-rd=1.0" \

-c:a aac -b:a 192k -ar 48000 -ac 2 \

-f flv rtmp://192.168.28.74/live/real_video这段代码的作用是对test.mp4视频文件进行循环推流😘😂,记住:循环推

windows端:

按win+R快捷键,输入cmd

在cmd中输入以下内容:

代码语言:javascript复制ffplay rtmp://服务器IP/live/mystream如此,我们就可以观看现场直播了👀

相关尊享内容

为什么UI移动端设计稿是750
365bet游戏下载

为什么UI移动端设计稿是750

📅 10-02 👑 856
猎魂觉醒猎魂怎么获得?猎魂获得途径全攻略
365bet游戏下载

猎魂觉醒猎魂怎么获得?猎魂获得途径全攻略

📅 07-06 👑 565
亡肖是哪几个生肖动物
mobile365体育

亡肖是哪几个生肖动物

📅 10-02 👑 139
最精准星座软件推荐,最靠谱星座应用盘点
365bet游戏下载

最精准星座软件推荐,最靠谱星座应用盘点

📅 09-26 👑 841