ubantu搭建RTMP直播推流服务 及OpenSSL 自签名证书

ubantu搭建RTMP直播推流服务

介绍

流媒体(streaming media)是指将一连串的媒体数据压缩后,经过网上分段发送数据,在网上即时传输影音以供观赏的一种技术与过程,此技术使得数据包得以像流水一样发送;如果不使用此技术,就必须在使用前下载整个媒体文件。流式传输可传送现场影音或预存于服务器上的影片,当观看者在收看这些影音文件时,影音数据在送达观看者的计算机后立即由特定播放软件播放。用户边下载边观看,而不必等待整个文件下载完毕;通过网络播放流媒体文件时,文件本身不会在本地磁盘中存储,这样就节省了大量的磁盘空间开销。流媒体实际指的是一种新的媒体传送方式,有声音流、视频流、文本流、图像流、动画流等。流媒体服务器广泛应用于视频点播、视频会议、远程教育(直播游戏或者在线课堂时候电脑窗口画面转播给其他人)、远程医疗、在线直播系统中、校园安防接入的摄像头视频流

流媒体传输协议

  • RTSP (Real-Time Stream Protocol)由Real Networks 和 Netscape共同提出的,基于文本的多媒体播放控制协议。RTSP定义流格式,流数据经由RTP传输;RTSP实时效果非常好,适合视频聊天,视频监控等方向。一般摄像头都是RTSP格式的。h5原生不支持这种格式。优点,可以控制到视频帧,因此可以承载实时性很高的应用。这个优点是相对于HTTP方式的最大优点。复杂度主要集中在服务器端,可以进行倍速播放功能,其他视频协议都无法支持。 网络延时低,一般在0.5S以内;缺点,就是服务器端的复杂度也比较高,实现起来也比较复杂。ios端不支持该协议,对移动端支持较弱;除了 Firefox 浏览器可以直接播放 RTSP 流之外,几乎没有其他浏览器可以直接播放 RTSP 流。RTSP协议,此协议和RTMP效果差不多,在技术上只是区别于传输数据上占用多少通道、传输格式流不太一样而已,RTSP其实也可以用于直播。但依然是因为市场环境,RTSP目前主要应用在安防监控上,和RTMP一样,早已形成了自己的盈利链

  • RTMP(Real Time Message Protocol) 有 Adobe 公司提出,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题,优势在于低延迟,稳定性高,支持所有摄像头格式,RTMP协议是采用实时的流式传输,所以不会缓存文件到客户端,这种特性说明用户想下载RTMP协议下的视频是比较难的,视频流可以随便拖动,既可以从任意时间点向服务器发送请求进行播放,并不需要视频有关键帧。相比而言,HTTP协议下视频需要有关键帧才可以随意拖动,rtmp协议只支持flashplayer 就是只能在PC端(或安卓环境中安装了flashplayer组件,这种环境比较少)安装了flashplayer的情况下使用,浏览器加载 flash插件就可以直接播放,但是flash已经日落西山了。因此,目前 RTMP 主要用于提取 stream。也就是,当设置解编码器将视频发送到托管平台时,视频将使用 RTMP 协议发送到 CDN,随后使用另一种协议(通常是HLS)传递给播放器。

  • HTTP: 当使用http协议的时候视频格式需要是m3u8或HTTP-FLV协议视频流。HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS 是音视频的媒体信息m3u8是有延迟的。并不能实时,实时传输方面不如rtmp协议。因为m3u8的直播原理是将直播源不停的压缩成指定时长的ts文件(比如9秒,10秒一个ts文件)并同时实时更新m3u8文件里的列表以达到直播的效果。这样就会有一个至少9,10秒的时间延迟。如果压缩的过小,可能导致客户端网络原因致视频变卡。HTTP-FLV 即将流媒体数据封装成 FLV 格式,然后通过 HTTP 协议传输给客户端 HTTP协议中有个约定:content-length字段,http的body部分的长度服务器回复http请求的时候如果有这个字段,客户端就接收这个长度的数据然后就认为数据传输完成了,如果服务器回复http请求中没有这个字段,客户端就一直接收数据,直到服务器跟客户端的socket连接断开。http-flv直播就是利用第二个原理,服务器回复客户端请求的时候不加content-length字段,在回复了http内容之后,紧接着发送flv数据,客户端就一直接收数据了

Nginx+nginx-rtmp-module

rtmp简介
rtmp是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。

hls简介
hls (HTTP Live Streaming),Apple的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。包括一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件。

需要Nginx环境、nginx-rtmp-module模块包

下载Nginx

nginx: download

下载nginx-rtmp-module

arut/nginx-rtmp-module: NGINX-based Media Streaming Server (github.com)

  1. 部署Nginx,安装nginx-rtmp-module模块

    1. wget http://nginx.org/download/nginx-1.21.6.tar.gz
      tar -xvzf nginx-1.21.6.tar.gz
      

      下载并解压nginx

    2. git clone https://github.com/arut/nginx-rtmp-module.git 
      

      git下载rtmp模块

    3. apt-get install build-essential libpcre3 libpcre3-dev libssl-dev 
      

      安装运行库

    4. cd nginx-1.21.6.tar.gz 进入nginx目录路径

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

      安装部署nginx并加入ssl模块,添加模块对应路径

    6. make && make install
      
    7. /usr/local/nginx/sbin/nginx   
      

      运行nginx

RTMP直播推流配置

  1. 编辑/usr/local/nginx/conf/nginx.conf 文件(注意备份)

    #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{
    server{
    listen 1935;# 推流使用的端口,默认1935端口在推流拉流时都可以省略,改为其他端口需要指定
    chunk_size 4096;
    
    application live{
    live on;#开启直播
    hls on;# 支持m3u8
    hls_path /home/video; # m3u8 文件的保存位置,检验配置是否成功,可以推流后cd到该目录下,看一下有没有文件生成,有文件的话就可以判定不是推流配置的问题。
    hls_fragment 10s;# 每个视频保存10s
    hls_playlist_length 60s; #单个视频长度
    hls_continuous on; #是否连续
    }
    
    }
    }
    
    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     80;
    	listen 443 default ssl; #ssl
            server_name  127.0.0.1;
    	keepalive_timeout 100;
    	ssl_certificate certificate.crt;
    	ssl_certificate_key private.key;
    	ssl_session_cache shared:SSL:10m;
    	ssl_session_timeout 10m;
    	ssl_ciphers HIGH:!aNULL:!MD5;
    	ssl_prefer_server_ciphers  on;
    	
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html;
                index  index.html index.htm;
    	  # return 301 https://$host$request_uri;
    	     add_header Access-Control-Allow-Origin *; #跨域问题
    	     add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    		 add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
    
            }
    	location /stat{ # 开启这两个页面可以观察rtmp流的统计,不需要可去掉
    		rtmp_stat all;
    		rtmp_stat_stylesheet stat.xsl;	
    	}
    	location /stat.xsl{
    	root /usr/local/nginx-rtmp-module/;
    	}
    	location /live{
    	types{ #播放配置
    		application/vnd.apple.mpegurl m3u8;
    		video/mp2t ts;
    	}
    	alias /home/video;
            #需要注意推流码是什么那么文件名就是推流码,例如推流码123,文件名就是123.m3u8,具体可以看文件保存路径 
    	add_header Cache-Control no-cache;
    	add_header Access-Control-Allow-Origin *;
    	add_header 'Access-Control-Allow-Credentials' 'true';
    	}
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    }
    

    配置完config文件,重启nginx服务

    /usr/local/nginx/sbin/nginx -s reload

    推流地址为:rtmp:ip:1935/live

    拉流地址为:rtmp:ip:1935/live

    播放地址:http://ip/live/推流码.m3u8 (如果设置了端口号需更改)

openssl 自签名ssl证书

apt-get install openssl -y

openssl req -nodes -newkey rsa:2048 -keyout /etc/ssl/private/private.key -out /etc/ssl/private/request.csr

域名生成私钥和证书签名请求 (CSR)

提供通用名称组织城市州和国家/地区

生成 request.csr 后

openssl x509 -in /etc/ssl/private/request.csr -out /etc/ssl/private/certificate.crt -req -signkey  /etc/ssl/private/private.key -days 365

生成SSL证书

此时已经完成证书 (certificate.crt) 和密钥 (private.key) 文件

将文件放入到nginx.config 同级目录

配置nginx 使用ssl证书

server {
        listen     80;
	listen 443 default ssl; #ssl
        server_name  127.0.0.1;
	keepalive_timeout 100;
	ssl_certificate certificate.crt;	# pem文件的路径
	ssl_certificate_key private.key;	# key文件的路径
	ssl_session_cache shared:SSL:10m;
	ssl_session_timeout 10m;  #缓存有效期
	ssl_ciphers HIGH:!aNULL:!MD5;  #加密算法
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    #安全链接可选的加密协议
	ssl_prefer_server_ciphers  on; #使用服务器端的首选算法
	location /{
	return 301 https://$server_name$request_uri; #重定向
	}
	}
	
posted @ 2023-03-11 15:26  RuiZiY  阅读(209)  评论(0编辑  收藏  举报