Nginx搭建视频流媒体服务(直播&点播)

1、Windows搭建Nginx视频流媒体服务

准备工具:NGINX、FFMPEG、VLC

网盘一键下载:链接: https://pan.baidu.com/s/14UltrNq-ucvYfkOJ49-Vsw 提取码: ffh8

1、下载Nginx,nginx 1.7.11.3 Gryphon版本

链接:http://nginx-win.ecsds.eu/download/

2、下载FFMPEG(推送视频流用)

链接:http://ffmpeg.org/

下载完成后解压并配置环境变量,配置path 里面添加一个到ffmpeg/bin目录的变量,

完成后检查是否成功:ffmpeg -version

3、下载VLC(拉取视频流用)

链接:https://www.videolan.org/

4、配置nginx

#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
rtmp_auto_push on;
 
#RTMP服务
rtmp{
	server{
		listen 8112;        #服务端口
		chunk_size 4096;    #数据传输块的大小
		#rtmp点播配置,访问方式:rtmp://127.0.0.1:8112/vod/xxx.mp4
		application vod {
			play D:/videos;    #点播视频存放目录,里面放一个xxx.mp4可以直接播放
		}
		#rtmp协议直播推流
		application live {
			live on;
			record all;
			record_path D:/videos/rtmp; # 保存路径
			#record_max_size 1K;
			#append current timestamp to each flv
			record_unique on;
			#publish only from localhost
			#allow publish 127.0.0.1;
			#deny publish all; 
		}
		 # HLS协议直播推流
		application hls {
			live on;                    #开启rtmp直播
			hls on;                     #开启hls支持
			wait_video on;              #第一个视频帧发送前禁用音频
			hls_path D:/videos/hls;     #文件保存路径,需要先创建,不然执行推流会报错
			hls_fragment 5s;            #用来设置每一个块的大小。默认是5秒。只能为整数
			hls_playlist_length 30s;    #设置播放列表的长度,单位是秒,听说设置成3秒延迟低点
			hls_nested off;              #默认是off。打开后的作用是每条流自己有一个文件夹
			hls_cleanup off;            #不清理ts	, on|off 默认是开着的,是否删除列表中已经没有的媒体块
			#hls_continuous:            #on|off 设置连续模式,是从停止播放的点开始还是直接跳过
	   }
	}
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    server {
        listen       8111;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
		#hls点播地址
		location /hls {
			types {
				application/vnd.apple.mpegurl m3u8; 
				#或 application/x-mpegURL
				video/mp2t ts;
			}
			alias D:/videos/vod/;  #点播视频文件(.ts;.m3u8)存放位置
			expires -1;
			add_header Cache-Control no-cache; #跨域支持,不然网页播放不了
			add_header Access-Control-Allow-Origin *;
			add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
			add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
		}
        
		error_page   500 502 503 504  /50x.html;
		location = /50x.html {
			root   html;
		}

	}	
	autoindex on;# 显示目录
	autoindex_exact_size on;# 显示文件大小
	autoindex_localtime on;# 显示文件时间
}

点播的概念有些模糊,目前理解就是

方式1:直接把分片好的m3u8文件作为视频:然后使用http访问

        访问方式:在VLC工具里面输入    http://127.0.0.1:8111/hls/xxx.m3u8

方式2:直接使用rtmp协议访问mp4

        访问方式:在VLC工具里面输入     rtmp://127.0.0.1:8112/vod/xxx.mp4

有懂行的大哥发现问题请给小弟指出!

5、FFMPEG命令

#使用rtmp协议推流
ffmpeg -re -i 11.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:8112/live/test
#说明:11.mp4是待推的视频,rtmp://localhost:8112/live/test是推送视频流和拉取视频流的地址,其中test是自己命名的视频名称,可以使用这个地址在VLC中观看直播(拉取直播流)。

#使用hls协议推流(会产生test视频流文件)
ffmpeg -re -i 11.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:8112/hls/test
#说明:11.mp4是待推的视频,rtmp://localhost:8112/live/test是推送视频流和拉取视频流的地址,其中test是自己命名的视频名称,可以使用这个地址在VLC中观看直播(拉取直播流)。

#将mp4切割成m3u8分片
ffmpeg -i 11.mp4 -profile:v baseline -level 3.0 -start_number 0 -force_key_frames "expr:gte(t,n_forced*1)" -hls_time 10 -hls_list_size 0 -f hls test.m3u8
#说明: 11.mp4是等待切割的视频,test.m3u8是切割完成的文件,还有很多切割好的testxx.ts文件。
#-force_key_frames "expr:gte(t,n_forced*1)"  代表每1秒1个关键帧,方便-hls_time 10切割每10秒一个ts文件
#-f hls test.m3u8  输出文件名叫test.m3u8

 6、使用VLC工具测试视频流

在推送视频流的同时可以打开VLC工具测试是否有流输出

打开VLC,媒体、打开网络串流、网络、输入网络URL

FFMPEG用rtmp协议推流:ffmpeg -re -i D:/videos/vod/11.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:8112/live/test

VLC拉取trmp协议的视频流:rtmp://127.0.0.1:8112/live/test

FFMPEG用hls协议推流(注意会产生m3u8和ts文件):ffmpeg -re -i D:/videos/vod/11.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:8112/hls/test

VLC拉取hls协议的视频流:rtmp://127.0.0.1:8112/hls/test

直播播放画面:

 

rtmp点播播放画面:

 

7、切割mp4视频脚本.bat

@echo off
set /p name=请输入视频名称:
set mp4File=%name%.mp4
IF NOT EXIST %mp4File% (
	echo %mp4File%文件不存在
	pause
) else (
	IF NOT EXIST m3u8_%name% (
		md m3u8_%name%
	)
	ffmpeg -i %name%.mp4 -profile:v baseline -level 3.0 -start_number 0 -force_key_frames "expr:gte(t,n_forced*1)" -hls_time 10 -hls_list_size 0 -f hls m3u8_%name%/%name%.m3u8
	pause
)

8、问题

nginx 1.7.11.3 Gryphon不支持http2 尴尬,想要使用还得自己编译

自己编译参考:

Windows编译Nginx源码_JohnGene的博客-CSDN博客https://blog.csdn.net/JohnGene/article/details/125304541

 2、Centos

依赖工具:

1、nginx(普通linux版本即可)

 nginx安装可以参考:

Centos7安装Nginx_JohnGene的博客-CSDN博客先安装依赖:(PCRE 作用是让 Nginx 支持 Rewrite 功能)yum -y install make zlib zlib-devel gcc gcc-c++ libtool openssl openssl-devel pcre pcre-devel下载源码包:cd /optwget http://nginx.org/download/nginx-1.9.9.tar.gz解压:tar -zxvf nginx-1.9.9.tar.gzcd nginx-1.9.9配置...https://blog.csdn.net/JohnGene/article/details/122412998

2、nginx-vod-module模块(https://github.com/kaltura/nginx-vod-module

概念参考:

1、https://blog.csdn.net/SeeDoubleU/article/details/121805174

2、https://blog.csdn.net/SeeDoubleU/article/details/123099059

下载地址:https://github.com/kaltura/nginx-vod-module/archive/refs/tags/1.29.tar.gz

解压:tar -zxvf nginx-vod-module-1.29.tar.gz

配置nginx加入新模块:./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-pcre  --with-http_ssl_module --with-http_gzip_static_module --with-http_v2_module--with-file-aio --with-threads --with-cc-opt="-O3" --add-module=../nginx-vod-module-1.29

编译:make insall

覆盖原先文件(如已安装):cp objs/nginx /usr/local/nginx/sbin/nginx

配置nginx.conf

#直接使用mp4文件作为源文件(自动切片),直接使用http://xx.xx.xx.xx/liveVideo/xxx.mp4/index.m3u8的方式访问
location ^~/liveVideo {
	vod hls; # 协议使用hls模式
	vod_mode local; # 访问模式指定为local模式
	vod_align_segments_to_key_frames on; # 每个切片以关键帧开头
	vod_manifest_segment_durations_mode accurate; # 精确显示每个切片的长度
	# 解决浏览器跨域问题
	add_header Access-Control-Allow-Headers '*';
	add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';
	add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
	add_header Access-Control-Allow-Origin *;
	alias /home/videos/;
}
#下面的和nginx-vod-module不相关,只提供参考
#原生nginx使用ffmpeg手动切片后使用链接http://xx.xx.xx.xx/liveVideo2/xxx.m3u8的方式访问
location ^~/liveVideo2 {
	# 解决浏览器跨域问题
	add_header Access-Control-Allow-Headers '*';
	add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';
	add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
	add_header Access-Control-Allow-Origin *;
	alias /home/videos/;
}

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Nginx可以作为流媒体服务器来搭建实现录播(直播回放)功能。具体的步骤如下: 1. 安装Nginx服务器:首先需要在服务器上安装Nginx软件。可以通过命令行或软件包管理工具来进行安装,并配置Nginx的基本设置。 2. 配置Nginx的rtmp模块:Nginx的rtmp模块是用于支持流媒体功能的关键模块。需要在Nginx的配置文件中启用rtmp模块,并进行相关的配置,如监听端口、应用名称等。 3. 创建应用和推流地址:通过配置Nginx的rtmp模块,可以创建一个或多个应用,并为每个应用指定一个推流地址。推流地址是用来上传视频内容的,可以通过专业的采集设备、手机等设备来进行推流。 4. 录制推流内容:Nginx的rtmp模块支持将推流内容实时录制为存储文件。只需在相应的应用配置中启用录制功能,指定存储路径和文件格式等。 5. 提供直播回放功能:通过配置Nginx的rtmp模块,可以将已经录制的内容作为直播回放资源进行提供。可以将存储文件的路径配置成回放地址,供观众通过播放器来进行回放操作。 总的来说,使用Nginx搭建流媒体服务器实现录播功能的过程比较简单。只需安装Nginx服务器并配置相关的rtmp模块,就可以创建应用、推流和录制内容,并通过回放地址提供直播回放功能。这样,用户即可以进行直播,也可以在回放时随时观看之前的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值