直播中的协议与格式
在直播系统中,协议和格式的选择对于传输效率、画面质量和用户体验都至关重要。以下是直播中常见的协议与格式:
RTSP (Real Time Streaming Protocol)
RTMP (Real Time Messaging Protocol)
HLS (HTTP Live Streaming)
在直播中,常见的音视频格式包括FLV(Flash Video)和HLS切片(TS文件)。
FLV (Flash Video)
HLS切片 (TS文件)
在直播系统中,主播端和观众端的需求是不同的。主播端需要进行音视频数据的采集、编码和推流,而观众端则需要进行拉流、解码和播放。信令服务器则负责处理与业务相关的逻辑,如创建房间、加入房间等。CDN网络则负责媒体数据的分发,确保观众能够快速获取到媒体流。
主播在进行直播时,首先会向信令服务器发送创建房间的信令。信令服务器收到信令后,会返回一个推流地址给主播。主播端在获取到推流地址后,就可以将音视频数据推送给CDN网络。观众在观看直播时,会向信令服务器发送加入房间的信令。信令服务器会根据观众所在地区分配一个最接近的CDN边缘节点地址给观众。观众在获取到拉流地址后,就可以从该地址拉取媒体流进行观看。
在直播系统中,推流通常使用RTMP协议,而拉流可以选择使用RTMP协议或HLS协议。选择哪种协议取决于具体的应用场景和需求。例如,对于需要实时互动和较低时延的场景,RTMP可能更适合;而对于需要跨平台兼容性和较好网络适应性的场景,HLS可能更合适。
HTTP-FLV 介绍
HTTP-FLV 是一种基于 HTTP 协议的流媒体传输方式,其中流媒体数据被封装成 FLV 格式。FLV(Flash Video)是 Adobe 公司推出的一种轻量级视频格式,特别适合网络传输和流媒体应用。由于其简单的结构和较小的媒体头部信息,FLV 文件的加载速度非常快。
FLV 文件由 FLV Header(FLV 头部)、FLV Body(FLV 主体)以及其他 Tag 组成。这种流式文件格式允许随时向文件末尾添加音视频数据,而不会破坏文件的整体结构。这是 FLV 与其他媒体文件格式(如 MP4、MOV)的主要区别之一,后者通常是结构化的,音频和视频数据分开存放。
flv.js 是一个由 bilibili 公司开源的项目,它允许在浏览器中解析 FLV 文件并转换成 BMFF(一种 MP4 格式)片段,然后通过 HTML5 的 标签进行播放。这使得在不借助 Flash 的情况下,浏览器也能播放 FLV 文件。
综上所述,HTTP-FLV 是一种基于 HTTP 协议的流媒体传输方式,具有良好的防火墙穿透性、设备兼容性和灵活性,但也存在一些如保密性和网络流量方面的缺点。
搭建一个基于 Nginx 的直播服务器确实需要一些步骤,包括安装依赖、下载源码、编译安装等。以下是针对您提供的步骤的详细解释和补充:
在大多数 Linux 发行版中,可以使用包管理器来安装依赖。例如,在基于 Debian 的系统(如 Ubuntu)中,可以使用 apt-get
,而在基于 Red Hat 的系统(如 CentOS)中,可以使用 yum
。
对于基于 Debian 的系统,您可以使用以下命令安装依赖:
sudo apt-get update |
|
sudo apt-get install -y libpcre3 libpcre3-dev libssl-dev zlib1g-dev gcc wget unzip vim make curl |
对于基于 Red Hat 的系统,您可以使用以下命令安装依赖:
sudo yum install -y pcre pcre-devel openssl openssl-devel zlib zlib-devel gcc wget unzip vim make curl |
您需要下载 Nginx 的源码以及 nginx-http-flv-module
模块。这个模块是为了支持 FLV 流媒体而开发的。
下载并解压 nginx-http-flv-module
:
wget https://github.com/winshining/nginx-http-flv-module/archive/master.zip |
|
unzip master.zip |
下载并解压 Nginx 源码:
wget http://nginx.org/download/nginx-1.17.6.tar.gz |
|
tar -zxvf nginx-1.17.6.tar.gz |
进入 Nginx 源码目录,并使用 ./configure
脚本来配置编译选项。在这个例子中,我们将 nginx-http-flv-module
作为一个模块添加进来。
cd nginx-1.17.6 |
|
./configure --add-module=../nginx-http-flv-module-master |
然后编译并安装 Nginx:
make |
|
sudo make install |
安装完成后,Nginx 通常会被安装在 /usr/local/nginx
目录下。
安装完成后,您需要配置 Nginx 以支持直播流。这通常涉及到编辑 Nginx 的配置文件(通常位于 /usr/local/nginx/conf/nginx.conf
),并添加相应的服务器块和位置块来处理 RTMP 和 HTTP-FLV 流。
最后,您可以启动 Nginx 服务:
sudo /usr/local/nginx/sbin/nginx |
要配置 Nginx 以支持 RTMP 流媒体服务,您需要在 nginx.conf
文件中添加相应的 RTMP 配置块。以下是一个基本的示例配置,用于设置 RTMP 服务、点播(VOD)和直播流。
首先,打开 nginx.conf
文件,通常位于 /usr/local/nginx/conf/
目录下。然后,在 http
块之后添加一个新的 rtmp
块。以下是一个简单的配置示例:
# nginx.conf |
|
worker_processes 1; |
|
events { |
|
worker_connections 1024; |
|
} |
|
http { |
|
include mime.types; |
|
default_type application/octet-stream; |
|
# ... 其他 http 配置 ... |
|
server { |
|
listen 8000; |
|
server_name localhost; |
|
# ... 其他 http server 配置 ... |
|
location / { |
|
# ... 其他 location 配置 ... |
|
} |
|
} |
|
} |
|
rtmp { |
|
server { |
|
listen 1935; |
|
chunk_size 4096; |
|
# 设置 VOD(点播)路径 |
|
application vod { |
|
play /path/to/vod/files; |
|
} |
|
# 设置直播流 |
|
application live1 { |
|
live on; |
|
record off; |
|
} |
|
# 设置 HLS(HTTP Live Streaming)直播流 |
|
application hls1 { |
|
live on; |
|
hls on; |
|
hls_path /path/to/hls/files; |
|
hls_fragment 5s; |
|
} |
|
} |
|
} |
在这个配置中:
rtmp
块定义了 RTMP 服务器的配置。server
块中的 listen 1935;
指定了 RTMP 服务的监听端口。chunk_size
指定了从客户端读取数据块的大小。application vod
块配置了 VOD(点播)服务,其中 play
指令指定了存放点播文件的目录。application live1
块配置了直播流服务,其中 live on;
启用了直播功能,record off;
表示不记录直播流。application hls1
块配置了 HLS(HTTP Live Streaming)直播流服务,其中 hls on;
启用了 HLS 功能,hls_path
指定了 HLS 分片文件的存储路径,hls_fragment
指定了每个 HLS 分片的时间长度。保存并关闭 nginx.conf
文件后,您可以使用以下命令检查配置文件的正确性:
/usr/local/nginx/sbin/nginx -t |
如果配置正确,您将看到类似于 "nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful" 的消息。
然后,您可以启动或重新加载 Nginx 以应用新的配置:
/usr/local/nginx/sbin/nginx |
或者,如果您只是想重新加载配置而不停止服务,可以使用:
/usr/local/nginx/sbin/nginx -s reload |
最后,您可以通过访问 http://xxxx:8000
来验证 Nginx 的 HTTP 服务是否成功启动。请确保将 xxxx
替换为您的服务器地址或域名。
请注意,上述配置只是一个基本示例,您可能需要根据您的具体需求进行调整。此外,确保您的服务器具有足够的资源来处理流媒体传输,并且已正确设置防火墙和安全措施。
要使用 VLC 播放器访问 RTMP 流媒体服务器上的点播视频,您需要确保已经按照之前的步骤正确配置了 Nginx 和 RTMP 模块,并且已经在指定的 VOD(点播)目录下放置了视频文件。
以下是如何使用 VLC 播放器来访问和播放 RTMP 点播视频的步骤:
下载并安装 VLC 播放器:
访问 VLC 官方网站(https://www.videolan.org/),下载适合您操作系统的 VLC 播放器安装包,并按照提示进行安装。
启动 VLC 播放器:
打开 VLC 播放器应用程序。
打开网络流:
在 VLC 播放器中,选择“媒体”(Media)菜单,然后选择“打开网络流”(Open Network Stream)。
输入 RTMP 流地址:
在弹出的窗口中,输入您的 RTMP 流地址。该地址应该是类似于这样的格式:rtmp://[服务器地址]:1935/vod/[视频文件名]
。例如,如果您在之前的配置中将服务器地址设置为 124.221.103.27
,并且有一个名为 01.mp4
的视频文件在 VOD 目录下,那么您应该输入:
rtmp://124.221.103.27:1935/vod/01.mp4 |
播放视频:
点击“播放”(Play)按钮,VLC 播放器应该会开始从 RTMP 服务器上接收并播放视频流。
请注意,由于网络延迟、服务器性能或带宽限制等因素,视频可能需要一些时间才能开始播放。同时,确保您的防火墙和安全设置允许 VLC 播放器访问 RTMP 服务器。
此外,如果视频没有按预期播放,请检查以下几点:
如果您遇到任何问题,可以查看 VLC 播放器的日志文件或 Nginx 的错误日志以获取更多信息。
确实,FFmpeg 是一个非常强大的工具,它不仅可以用来处理已经存在的音视频文件,还可以通过命令行实时地推送音视频流到流媒体服务器上,实现直播功能。对于直播场景,您可以使用 FFmpeg 从摄像头、屏幕捕获或其他视频源捕获视频流,并将其推送到 Nginx 或其他 RTMP 服务器。
以下是一个基本的示例,展示如何使用 FFmpeg 将本地视频文件推送到 RTMP 服务器:
ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f flv rtmp://[服务器地址]:1935/live1/[流名称] |
在这个命令中:
-re
参数表示以实时速度推送流,这对于直播很重要,因为它防止了视频数据的缓冲和突然的快进。-i input.mp4
指定了输入文件,但在直播场景中,您可能会使用其他参数(如 -f v4l2
用于捕获摄像头视频)来替代。-c:v libx264
和 -c:a aac
分别指定了视频和音频的编解码器。-f flv
指定了输出格式为 FLV,这是 RTMP 流通常使用的格式。rtmp://[服务器地址]:1935/live1/[流名称]
是 RTMP 服务器的地址和流名称,您需要根据您的服务器配置来替换这些值。对于实时捕获视频流(例如从摄像头),您可以使用类似以下的命令:
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -preset veryfast -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv rtmp://[服务器地址]:1935/live1/[流名称] |
在这个命令中:
-f v4l2 -i /dev/video0
用于在 Linux 系统上从 /dev/video0
捕获摄像头视频。在 Windows 上,您需要使用不同的参数。-preset veryfast
和 -maxrate 3000k -bufsize 6000k
设置了视频编码的速度和比特率控制。-pix_fmt yuv420p
设置了像素格式为 yuv420p,这是大多数 RTMP 服务器所期望的格式。-g 50
设置了关键帧间隔。-c:a aac -b:a 160k -ac 2 -ar 44100
设置了音频编解码器和相关参数。请注意,这些命令需要根据您的具体环境和需求进行调整。特别是,您需要根据您的摄像头、音频输入以及 RTMP 服务器的配置来选择合适的参数。
此外,对于 Windows 用户,您需要确保下载并安装了适用于 Windows 的 FFmpeg 版本,并且将其添加到系统的 PATH 环境变量中,以便在命令行中直接调用 ffmpeg
命令。
确保您已经安装了FFmpeg和Nginx,并且Nginx已经安装了rtmp模块和http_flv_module模块,以便支持RTMP和HLS。
使用FFmpeg将视频文件推送到RTMP服务器。您提供的命令如下:
.\ffmpeg -re -i D:\Temp\03.mp4 -c copy -f flv rtmp://124.221.103.27:1935/hls1/test |
-re
:以实时速度推送流,防止数据缓冲。-i D:\Temp\03.mp4
:指定输入文件路径。-c copy
:复制原始编解码器而不进行转码。-f flv
:设置输出格式为FLV,这是RTMP流常用的格式。rtmp://124.221.103.27:1935/hls1/test
:指定RTMP服务器的地址和流名称。当视频流通过RTMP推送到服务器后,Nginx会根据配置将FLV流切割成一系列小的TS(Transport Stream)文件,这些文件构成了HLS流。这些文件通常存储在服务器的某个目录下,比如您提到的/usr/local/nginx/html/hls1
。
HLS流可以通过任何支持HLS的播放器播放,比如VLC。您提供的播放URL如下:
http://124.221.103.27:8000/hls1/ |
请注意,这里应该是一个m3u8的索引文件,例如http://124.221.103.27:8000/hls1/test.m3u8
,该文件列出了所有的TS切片文件。播放器会解析这个m3u8文件,并按照列表中的顺序下载和播放TS文件。
通过合理配置和优化,您应该能够实现稳定的HLS直播流。
要在浏览器中播放直播流,您确实需要遵循一些步骤来设置HTML页面,并使用适当的播放器库,如video.js
。video.js
是一个流行的、功能丰富的开源播放器,支持多种媒体格式和传输协议,包括HLS(HTTP Live Streaming)。
以下是您需要在浏览器中播放直播流的大致步骤:
创建HTML页面:
创建一个新的HTML文件(例如play.html
),并在其中加入必要的结构。
引入video.js库:
在HTML页面的部分,您需要引入
video.js
的CSS样式文件和JavaScript库。通常,这些文件可以从CDN(内容分发网络)上获取,或者如果您有本地副本,也可以从本地引入。
|
|
|
添加video标签:
在HTML页面的部分,添加一个
标签,并为其指定一个ID,以便稍后通过JavaScript来控制它。您还需要在
标签中指定要播放的直播流的URL。
|
|
|
|
|
注意:controls
属性添加了播放、暂停和音量控制等UI元素;preload="auto"
意味着视频会在页面加载时开始加载;data-setup='{}'
是video.js初始化所需的。
初始化video.js播放器:
您需要在页面加载完成后初始化video.js播放器。这通常通过在标签中添加JavaScript代码来完成。
|
上述代码会找到ID为my-video
的元素,并初始化video.js播放器。
上传网页到Web服务器:
由于浏览器安全限制,通常不允许从本地文件系统加载流媒体内容。因此,您需要将HTML页面和任何相关的资源上传到Web服务器上。您已经提到将网页上传到了Nginx服务器上,这是正确的做法。
通过浏览器访问网页:
一旦网页上传到服务器,您就可以通过浏览器访问它,比如通过URL http://124.221.103.27:8000/play.html
。确保您的Nginx服务器已经正确配置,以提供对HTML页面和直播流内容的访问。
确保您的Nginx服务器已经配置了对HLS的支持,并且已经设置了适当的CORS策略,以允许浏览器从不同的源加载视频流。
请注意,以上步骤是一个概述,并且根据您的具体环境和需求可能有所不同。您可能还需要对Nginx和video.js进行进一步的配置和优化,以确保最佳的播放性能和用户体验。