Создайте службу push-передачи потокового мультимедиа, RTMP/RTSP/HLS/HTTP-FLV.

1. Что такое потоковое мультимедиа?

Потоковое мультимедиа относится к технологии и процессу, который сжимает серию мультимедийных данных, отправляет данные сегментами через Интернет и мгновенно передает аудио и видео в Интернет для просмотра. Эта технология позволяет отправлять пакеты данных, как проточную воду; если Без этой технологии перед использованием необходимо загрузить весь медиафайл. Потоковая передача может передавать живое видео или видео, предварительно сохраненное на сервере.Когда зритель просматривает эти видеофайлы, видеоданные воспроизводятся специальным программным обеспечением воспроизведения сразу после отправки на компьютер зрителя. Пользователи смотрят во время загрузки, не дожидаясь загрузки всего файла; когда потоковые медиафайлы воспроизводятся по сети, сами файлы не сохраняются на локальном диске, что экономит много дискового пространства. Потоковое мультимедиа фактически относится к новому методу передачи мультимедиа, включая звуковой поток, видеопоток, текстовый поток, поток изображений, поток анимации и т. д. Серверы потокового мультимедиа широко используются в видео по запросу, видеоконференциях, дистанционном обучении (передача экрана окна компьютера другим людям во время прямых игр или онлайн-занятий), телемедицине, системах онлайн-трансляций и видеопотоках с камер безопасности кампуса.
Протокол передачи потокового мультимедиа

    RTSP (протокол потоковой передачи в реальном времени) — это текстовый протокол управления воспроизведением мультимедиа, совместно предложенный Real Networks и Netscape. RTSP определяет формат потоковой передачи, а потоковые данные передаются через RTP; RTSP имеет очень хороший эффект в реальном времени и подходит для видеочата, видеомониторинга и т. д. Обычно камеры имеют формат RTSP. h5 изначально не поддерживает этот формат. Преимущество состоит в том, что он может управлять видеокадром, что позволяет размещать приложения с высокой производительностью в реальном времени. Это преимущество является самым большим преимуществом по сравнению с HTTP. Сложность в основном сосредоточена на стороне сервера, который может выполнять функцию воспроизведения с двойной скоростью, а другие видеопротоколы ее поддерживать не могут. Сетевая задержка низкая, обычно в пределах 0,5 с; недостатком является то, что сложность серверной части относительно высока, а реализация также сложна. Сторона iOS не поддерживает этот протокол, а поддержка мобильных терминалов слабая; за исключением браузера Firefox, который может напрямую воспроизводить потоки RTSP, почти никакие другие браузеры не могут напрямую воспроизводить потоки RTSP. Протокол RTSP, этот протокол имеет схожие эффекты с RTMP. Технически он отличается только количеством каналов, занятых при передаче данных, и потоком формата передачи. RTSP фактически может использоваться для прямой трансляции. Но все же из-за рыночной конъюнктуры RTSP в настоящее время в основном используется для мониторинга безопасности.Как и RTMP, он уже сформировал собственную цепочку получения прибыли.

    RTMP (Протокол сообщений в реальном времени) был предложен Adobe для решения проблем мультиплексирования и пакетирования потоков передачи мультимедийных данных. Он обладает преимуществами низкой задержки, высокой стабильности и поддерживает все форматы камер. Протокол RTMP использует потоковую передачу в реальном времени. передача, поэтому файлы не будут кэшироваться на клиенте.Эта функция показывает, что пользователям сложно загружать видео по протоколу RTMP.Видеопоток можно перетаскивать и перемещать из любого момента времени.Сервер отправляет запрос на воспроизведение и не требует, чтобы видео имело ключевые кадры. Для сравнения, видео по протоколу HTTP должны иметь ключевые кадры, прежде чем их можно будет перетаскивать по желанию.Протокол rtmp поддерживает только flashplayer, а это означает, что его можно установить только на ПК (или в среде Android, где компонент flashplayer установлен, что встречается относительно редко). При использовании при определенных обстоятельствах браузер может загрузить плагин flash и воспроизвести его напрямую. Однако flash уже исчез. Поэтому в настоящее время RTMP в основном используется для извлечения потоков. То есть, когда вы настраиваете декодер на отправку видео на хостинг-платформу, видео отправляется в CDN по протоколу RTMP, а затем доставляется плееру по другому протоколу (обычно 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. Если есть это поле, когда сервер отвечает на http-запрос, клиент Клиент получает данные этой длины и затем считает передачу данных завершенной. Если сервер не отвечает этим полем в http-запросе, клиент продолжит получать данные до тех пор, пока сокетное соединение между сервером и клиентом не будет разорвано. Прямая трансляция http-flv использует второй принцип. Сервер не добавляет поле длины контента при ответе на запрос клиента. После ответа на http-контент он отправляет данные flv, а клиент продолжает получать данные.

За исключением протоколов передачи HTTP и WebSocket, другие протоколы передачи не могут быть универсально переданы в браузеры. Поэтому, если вы хотите создать универсальный видеоплеер H5, это в основном видеоплеер с протоколом HTTP/WebSocket. Если это источники видео, похожие на Протоколы типов RTMP и RTSP неизбежны и должны быть преобразованы сервером.3.
Создание push-сервера

Вариант 1: Nginx добавляет модуль nginx-rtmp-module.

Решение 2. Nginx добавляет модуль http-flv-module.

nginx-http-flv-module — это сервер потокового мультимедиа, основанный на модуле nginx-rtmp. Он имеет все функции модуля nginx-rtmp и добавляет множество новых функций.Сравнение функций выглядит следующим образом. Подробнее см. https://github.com/winshining/nginx-http-flv-module
. Вы можете установить его в соответствии с реальной ситуацией. http-flv-модуль более мощный.

Поскольку проекту необходимо воспроизводить 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. Запустите программное обеспечение и нажмите: Файл->Настройки->Push. Установите пароль потоковой передачи по своему усмотрению, например 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