ストリーミング メディア プッシュ サービス、RTMP/RTSP/HLS/HTTP-FLV を構築します。

1. ストリーミング メディアとは何ですか?

ストリーミング メディアとは、一連のメディア データを圧縮し、インターネット上でセグメントに分けて送信し、音声やビデオを瞬時にインターネット上に送信して視聴する技術とプロセスを指します。この技術により、データ パケットを流水のように送信できます。このテクノロジーを使用しない場合、使用前にメディア ファイル全体をダウンロードする必要があります。ストリーミング配信では、ライブ映像やサーバーにあらかじめ保存されている映像を配信し、視聴者がこれらの映像ファイルを視聴する場合、映像データは視聴者のコンピュータに送信されるとすぐに専用の再生ソフトで再生されます。ユーザーは、ファイル全体がダウンロードされるのを待つことなく、ダウンロード中に視聴できます。ストリーミング メディア ファイルがネットワーク経由で再生される場合、ファイル自体はローカル ディスクに保存されないため、ディスク領域のオーバーヘッドが大幅に節約されます。ストリーミング メディアとは、実際には、サウンド ストリーム、ビデオ ストリーム、テキスト ストリーム、画像ストリーム、アニメーション ストリームなどを含む新しいメディア伝送方法を指します。ストリーミング メディア サーバーは、ビデオ オン デマンド、ビデオ会議、遠隔教育 (ライブ ゲームやオンライン授業中にコンピューターのウィンドウ画面を他の人に中継する)、遠隔医療、オンライン ライブ ブロードキャスト システム、キャンパス セキュリティ アクセス カメラのビデオ ストリームで広く使用されています。
ストリーミングメディア転送プロトコル

    RTSP (Real-Time Stream Protocol) は、Real Networks と Netscape が共同で提案したテキストベースのマルチメディア再生制御プロトコルです。RTSP はストリーミング形式を定義し、ストリーミング データは RTP 経由で送信されます。RTSP は非常に優れたリアルタイム効果を持ち、ビデオ チャット、ビデオ モニタリングなどに適しています。通常、カメラは RTSP 形式です。h5 はこの形式をネイティブにサポートしていません。利点は、ビデオ フレームを制御できるため、高いリアルタイム パフォーマンスでアプリケーションをホストできることです。この利点は、HTTP に対する最大の利点です。複雑さは主に倍速再生機能を実行できるサーバー側に集中しており、他のビデオ プロトコルはこれをサポートできません。ネットワーク遅延は低く、通常は 0.5 秒以内ですが、サーバー側の複雑さが比較的高く、実装も複雑であるという欠点があります。ios側はこのプロトコルをサポートしておらず、モバイル端末へのサポートも弱く、RTSPストリームを直接再生できるFirefoxブラウザを除けば、RTSPストリームを直接再生できるブラウザはほとんどありません。RTSP プロトコルは、RTMP と同様の効果を持ち、技術的にはデータ送信に占有されるチャネル数と送信形式ストリームが異なるだけで、実際にライブ ブロードキャストに使用できます。しかし、依然として市場環境の影響で、RTSP は現在セキュリティ監視に主に使用されており、RTMP と同様にすでに独自のプロフィットチェーンを形成しています。

    RTMP (Real Time Message Protocol) は、マルチメディア データ伝送ストリームの多重化とパケット化の問題を解決するために Adob​​e によって提案されました。低遅延、高い安定性という利点があり、すべてのカメラ フォーマットをサポートしています。RTMP プロトコルは、リアルタイム ストリーミングを使用します。送信されるため、ファイルはクライアントにキャッシュされません。この機能は、ユーザーが RTMP プロトコルでビデオをダウンロードすることが難しいことを示しています。ビデオ ストリームは、いつでもドラッグして移動できます。サーバーは再生リクエストを送信します。ビデオにキーフレームが必要ありません。比較すると、HTTP プロトコルのビデオでは、自由にドラッグする前にキー フレームが必要です。rtmp プロトコルは Flashplayer のみをサポートします。つまり、Flashplayer は PC (または Flashplayer コンポーネントがインストールされている Android 環境) にのみインストールできます。特定の状況下で使用すると、ブラウザは Flash プラグインをロードして直接再生できますが、Flash はすでに消え去っています。したがって、現在ではストリームの抽出には主に RTMP が使用されています。つまり、ビデオをホスティング プラットフォームに送信するようにデコーダーを設定すると、ビデオは RTMP プロトコルを使用して CDN に送信され、その後別のプロトコル (通常は HLS) を使用してプレーヤーに配信されます。

    HTTP: http プロトコルを使用する場合、ビデオ形式は m3u8 または HTTP-FLV プロトコル ビデオ ストリームである必要があります。HLS プロトコルは、HTTP、M3U8、TS の 3 つの部分で構成されます。これら 3 つの部分のうち、HTTP は伝送プロトコル、M3U8 はインデックス ファイル、TS はオーディオおよびビデオのメディア情報であり、m3u8 が遅延します。これはリアルタイムではなく、リアルタイム送信は rtmp プロトコルほど優れていません。m3u8 のライブ ブロードキャストの原理は、ライブ ブロードキャスト ソースを指定された長さの ts ファイル (ts ファイルあたり 9 秒、10 秒など) に継続的に圧縮し、ライブ ブロードキャスト効果を達成するために m3u8 ファイル内のリストをリアルタイムで更新することであるためです。 。これには少なくとも 9.10 秒の遅延が発生します。圧縮が小さすぎると、クライアント ネットワークの問題によりビデオが停止する可能性があります。HTTP-FLV は、ストリーミング メディア データを FLV 形式にカプセル化し、HTTP プロトコルを通じてクライアントに送信します。HTTP プロトコルには、コンテンツ長フィールド、http の本文部分の長さという規則があります。サーバーが http リクエストに応答すると、クライアントはこの長さのデータを受信し、データ送信が完了したとみなします。サーバーが http リクエストでこのフィールドを使用して応答しない場合、クライアントは引き続き受信します。サーバーとクライアント間のソケット接続が切断されるまで、データは保持されます。http-flv ライブ ブロードキャストでは、2 番目の原則が使用されます。サーバーは、クライアントのリクエストに応答するときにコンテンツ長フィールドを追加しません。http コンテンツに応答した後、flv データを送信し、クライアントは引き続きデータを受信します。

HTTP と WebSocket の送信プロトコルを除いて、他の送信プロトコルはブラウザに汎用的に送信することはできません。したがって、ユニバーサルな H5 ビデオ プレーヤーを作成したい場合、基本的には HTTP/WebSocket プロトコルを備えたビデオ プレーヤーになります。 RTMP、RTSP系のプロトコルは必須のため、サーバー側で変換する必要があります

オプション 1: Nginx がモジュール nginx-rtmp-module を追加する

解決策 2: Nginx がモジュール http-flv-module を追加する

nginx-http-flv-module は、nginx-rtmp-module に基づくストリーミング メディア サーバーです。nginx-rtmp-module の機能を全て備えており、さらに様々な新機能が追加されており、機能比較は以下の通りです。詳細については、 https://github.com/winshining/nginx-http-flv-module を参照してください
。実際の状況に応じてインストールできます。http-flv-module の方が強力です。

プロジェクトは HTTP-FLV を再生する必要があるため、オプション 2 が選択されました。

nginx はモジュールのコンパイルを追加します

// 下载nginx
# mkdir -p /root/nginx
# cd /root/nginx
# yum -y install pcre-devel openssl openssl-devel        //安装依赖
# wget http://nginx.org/download/nginx-1.21.6.tar.gz        //下载nginx包
# tar xf nginx-1.21.6.tar.gz
//下载nginx-http-flv-module
# mkdir -p /opt/nginx-1.21.6/module
# cd /opt/nginx-1.21.6/module
# wget https://github.com/winshining/nginx-http-flv-module/archive/refs/heads/master.zip
# unzip master.zip
# cd /root/nginx/nginx-1.21.6
//安装目录是/opt/nginx-1.21.6,安装模块nginx-http-flv-module-master【重点就是这个】和ssl用于日后配置https证书
# ./configure --prefix=/opt/nginx-1.21.6 --add-module=/opt/nginx-1.21.6/module/nginx-http-flv-module-master --with-http_ssl_module 
# make
# make install // 如果你是热部署升级,一定不要执行这个命令
// 修改nginx配置文件 避免粘贴过来格式混乱,在 Vim 视图,输入如下命令:set paste,可以使 vim 进入 paste 模式,这时候再整段复制黏贴,就OK了
# vim /opt/nginx-1.21.6/conf/nginx.conf
//修改完成,检查nginx配置文件是否正确,启动nginx 即可,记得开放防火墙、安全组端口1935 和88
# cd /opt/nginx-1.21.6/sbin
# ./nginx -t
# ./nginx 

nginx.configは次のように構成されています

#增加如下配置即可
# 推流时会发布到多个子进程
rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp {  
    server {  
        listen 1935;  #监听的端口号
        chunk_size 8192; # 单一推流数据包的最大容量
        
        application hls {  # 创建rtmp应用hls
            live on;  # 当路径匹配时,开始播放
            #HLS协议进行m3u8实时直播.如果是http-flv不需要配置下面的
            wait_key on;#保护TS切片
            hls on;  #实时回访
            hls_nested on;#每个流都自动创建一个文件夹
            hls_path /tmp/hls; #媒体块ts的位置
            hls_fragment 5s; #每个ts文件为5s的样子
            hls_playlist_length 30s;  #保存m3u8列表长度时间,默认是30秒,可考虑三小时10800秒
            hls_cleanup on;#是否删除列表中已经没有的媒体块TS文件,默认是开启
            hls_continuous on;#连续模式
       }  
    } 
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen       88;
        server_name  localhost;
        error_log logs/rtmp/error.log;# http协议下的访问日志
        access_log  logs/rtmp/access.log;
        location /stat { # 开启这两个页面可以观察rtmp流的统计,不需要可去掉
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
    location /stat.xsl { # 查看状态的部分,不需要可去掉
        root /opt/nginx-1.19.1-rtmp/nginx-http-flv-module/;
    }
    location /flv_live { # 拉http-flv的配置
            flv_live on;
            chunked_transfer_encoding on;
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Credentials' 'true';
    }
    # 通过http访问的这个路径会被转发到/tmp/hls 寻找对应的m3u8文件和视频片段例如 111.m3u8,111-622.ts,前缀名字为视频上传流的stream_key
    location /hls { # 拉m3u8的配置
        types {
              application/vnd.apple.mpegurl m3u8;
              video/mp2t ts;
            }
        alias /tmp/hls;   
        expires -1;
        add_header 'Cache-Control' 'no-cache'; 
    }
    location / { # 首页
        root html;
        index index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
            root   html;
    }
  }
}

4. プッシュフロー

オプション 1: このプロジェクトのニーズに応じて、Windows ホスト コンピューターの画面データ ストリームをクラウドにプッシュします。これにより、ストリームのプッシュに OBS が使用されます。

1. OBS-Studio-26.0.2-Full-Installer-x64.exe をダウンロードし、Windows ホスト コンピューターにインストールします。

2. ソフトウェアを実行し、[ファイル] -> [設定] -> [プッシュ] をクリックし、ストリーミング パスワードを 111 など、好きなように設定します。

3. ウィンドウコレクション、プッシュするページを選択

4. クリックしてストリーミングを開始し、下部の赤いボックスが表示されれば成功です。

解決策 2: ffmpeg を使用してビデオ ストリームを nginx にプッシュする

# mkdir -p /usr/local/ffmpeg
# cd /usr/local/ffmpeg
# wget https://github.com/FFmpeg/FFmpeg/archive/refs/heads/master.zip
# unzip  master.zip
# ./configure
# 如果提示nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
# yum install yasm
# ./configure # 再次编译
# make
# make install

ローカルビデオファイルzhangsan.mp4をストリーミングにプッシュします

# ffmpeg -stream_loop -1 -re -i zhangsan.mp4 -c copy -f flv  rtmp://192.168.1.232:1935/http_flv/stream_key
-i 要处理视频文件的路径,此处地址是一个监控摄像头
-s 像素
-f 强迫采用flv格式

おすすめ

転載: blog.csdn.net/xiehuanbin/article/details/133125082