NGINX如何實現rtmp推流服務

最愛白菜吖發表於2020-03-30

最近直播大火,直播推流軟體遍地開花,那麼用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;  
        }  
    }
}

複製程式碼

我們起了一個服務,用於播放我們的推流內容,同時也可以模擬推流,訪問

http://192.168.0.101:8080/
複製程式碼

NGINX如何實現rtmp推流服務
你也可以採用其他的推流軟體,例如OBS Studio

NGINX如何實現rtmp推流服務

具體情況下小夥伴們可以把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 這些是自己定義的,具有很強的靈活性,小夥伴們可以自己定義

通過對這些的講解我們就只可以知道怎麼進行拉流,推流,鑑權,小夥們可以自己動手試一下。 給大家附上已經安裝rtmp的nginx程式碼和go的程式碼 連結:pan.baidu.com/s/1iG2e0Adh… 提取碼:0y0i 複製這段內容後開啟百度網盤手機App,操作更方便哦

NGINX如何實現rtmp推流服務

相關文章