NGINX如何实现rtmp推流服务

最近直播大火,直播推流软件遍地开花,那么用NGINX如何进行推流呢?下面我们就简单的介绍一下用NGINX的rtmp模块如何实现视频推流,我们主要从一下几点介绍:

  • 推流
  • 拉流
  • 推流认证
  • 拉流认证
package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	router := gin.Default()
	router.Any("/auth", func(context *gin.Context) {
		name := context.PostForm("name")
		username := context.PostForm("username")
		password := context.PostForm("password")
		fmt.Println(name)
		fmt.Println(username)
		fmt.Println(password)
		if username == "hanyun" && password == "123456" {
			context.JSON(http.StatusOK, nil)
		} else {
			context.AbortWithStatus(http.StatusUnauthorized)
		}
	})
	router.Run(":8686")
}

我们在本地起了个golang的服务,监听8686端口,对密码为123456用户名为hanyun的用户返回HTTP状态码为200,其他的反水状态码为401。为什么要这么做呢?后面阐述原因。 nginx的配置文件

worker_processes  1;

error_log  logs/error.log debug;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;

        application live {
            live on;
			on_publish http://127.0.0.1:8686/auth;
			on_play http://127.0.0.1:8686/auth;
        }
		
        application hls {
            live on;
            hls on;  
            hls_path temp/hls;  
            hls_fragment 8s;  
        }
    }
}

http {
    server {
        listen      8080;
		
        location / {
            root html;
        }
		
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root html;
        }
		
        location /hls {  
            #server hls fragments  
            types{  
                application/vnd.apple.mpegurl m3u8;  
                video/mp2t ts;  
            }  
            alias temp/hls;  
            expires -1;  
        }  
    }
}

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

NGINX如何实现rtmp推流服务_第1张图片

我们起了一个服务,用于播放我们的推流内容,同时也可以模拟推流,访问

http://192.168.0.101:8080/

NGINX如何实现rtmp推流服务_第2张图片

你也可以采用其他的推流软件,例如OBS Studio

NGINX如何实现rtmp推流服务_第3张图片

具体情况下小伙伴们可以把ip地址改为自己的ip。 这里重点说一下nginx拉流和推流的限制

rtmp {
    server {
        listen 1935;

        application live {
            live on;
			on_publish http://127.0.0.1:8686/auth;
			on_play http://127.0.0.1:8686/auth;
        }
		
        application hls {
            live on;
            hls on;  
            hls_path temp/hls;  
            hls_fragment 8s;  
        }
    }
}

推流的限制

on_publish http://127.0.0.1:8686/auth;

拉流的限制

on_play http://127.0.0.1:8686/auth;

nginx在推流和拉流的时候会采用post的方式请求我们定义的地址,如果我们返回的HTTP状态码为200就可以进行拉流或者推流了,如果返回其他的状态码,例如401就会拒绝推流或者拉流。

再这里给大家讲解一下这个推流的地址的定义

rtmp://192.168.0.101/live/stream?username=hanyun&password=123456

rtmp://192.168.0.101/live 我们的推流地址
stream为流名称,后端可以以post的方式接受到一个键值对name=stream,z这个是默认的
?username=hanyun&password=123456 这些是自己定义的,具有很强的灵活性,小伙伴们可以自己定义

作者:最爱白菜吖
原文链接 NGINX如何实现rtmp推流服务 - 掘金

你可能感兴趣的:(nginx,运维)