OSSRS создает потоковый сервер rtmp
OSSRS создает потоковый сервер rtmp

позволять

Тестовое видео в статье:https://pan.baidu.com/s/1Cs9bULQ26zmDjbNqiIyUow Пароль: q839

SRSОфициальный сайт:http://winlinvip.github.io/srs.release/releases/

SRSИсходный код:https://github.com/ossrs/srs

прямая трансляцияСравнение планов

Подробности смотрите в таблице ниже:

распределение

платформа

протокол

компания

иллюстрировать

RTMP

Windows Flash

RTMP

Adobe

Основной поток с низкой задержкойраспределение Способ, Встроенная поддержка Adobe для RTMP — Flash. FMS(Adobe Media предшественник сервера), Это Флэш Media Аббревиатура «Сервер» показывает, как «родной» Flash воспроизводит RTMP. Это так же «родно», как браузер, открывающий веб-страницу http, После тестирования Flash может воспроизводить потоки RTMP более 10 дней без перерыва.

HLS

Apple/ Android

HTTP

Apple/ Google

Задержка более чем на один фрагмент (обычно более 10 секунд), Эффект HLS на платформе Apple даже лучше, чем RTMP на ПК. И все устройства Apple поддерживают его, Изначально Android не поддерживал HLS, но позже стал поддерживать. Но тест показал, что поддержка не так хороша, как у Apple. Однако с просмотром проблем нет, но стабильность немного хуже. Итак, какая-то компания специализируется на потоковой передаче медиаплееров на Android.

Простая установка

ТекущийсерверНе требует операций ffmpeg.Используйте это, когда Способ

Следующий метод заключается в прямой установке официальной скомпилированной версии, которая не содержит библиотеки ffmpeg.

Если вам нужен ffmpeg для обработки потока, вам необходимо скачать ffmpeg самостоятельно или использовать метод ниже для компиляции исходного кода (рекомендуется)

Язык кода:javascript
копировать
cd /root
wget http://winlinvip.github.io/srs.release/releases/files/SRS-CentOS6-x86_64-2.0.243.zip
unzip -q SRS-CentOS6-x86_64-2.0.243.zip
cd SRS-CentOS6-x86_64-*
sudo bash INSTALL
sudo /etc/init.d/srs start

копировать

Каталог после установки srs — /usr/local/srs.

abort, please install lsb_release

Язык кода:javascript
копировать
yum install -y redhat-lsb

копировать

Формат URL-адреса RTMP:

Язык кода:javascript
копировать
rtmp://ip:[port]/appName/streamName

копировать

Например:

Язык кода:javascript
копировать
rtmp://192.168.1.108:1935/live/xiaoming

копировать

Скомпилируйте и установите

ТекущийсерверИспользование операций ffmpegИспользуйте это, когда Способ

Загрузите официальный исходный код и скомпилируйте его ниже. Загрузка на Github происходит слишком медленно, поэтому я сделал зеркало на gitee.

Причина, по которой исходный код компиляции находится здесь, заключается в том, что предыдущий метод прямой установки не предоставляет сторонние библиотеки.,Например, что будет использоваться дальшеffmpeg;

Конечно, мы также можем вручную установить ffmpeg, а затем изменить путь к ffmpeg по умолчанию в файле конфигурации.

Обратите внимание здесьffmpegНеобходимо использовать4.1Версия Некоторый синтаксис srs не поддерживается в версии 4.2. Это место обманывало меня долгое время Если вы ранее устанавливали версию 4.2, обязательно сначала удалите ее.

Проверьте версию ffmpeg

Язык кода:javascript
копировать
ffmpeg -version

копировать

установить SRS

Язык кода:javascript
копировать
cd ~
git clone https://gitee.com/psvmc/srs.git
cp -rf srs/trunk /usr/local/srs2
cd /usr/local/srs2
./configure --full
make

копировать

Здесь нет такого метода установки, как следующий.

Язык кода:javascript
копировать
./configure --prefix=/usr/local/srs2 --with-ffmpeg
make && make install

копировать

Это из-за этого Установитьназадffmpegиз Папка не создается Вам все равно придется переходить вручную

Когда я устанавливаю сюда ffmpeg, при компиляции получаю ошибку.

build ffmpeg failed build ffmpeg-4.1 failed, ret=1

изначальноsrsизкомпилировать Уже включеноx264иffmpeg,Когда я получаю эту ошибку, я могу сделать это только вручную.

Если описанная выше установка прошла успешно, нет необходимости выполнять следующие команды.

Установите среду компиляции

Язык кода:javascript
копировать
yum install -y automake autoconf libtool gcc gcc-c++ 
yum install -y make

копировать

Установите плагин yasm

Язык кода:javascript
копировать
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar -xvf yasm-1.3.0.tar.gz
cd yasm-1.3.0/
./configure && make && make install

копировать

Установить насм

Язык кода:javascript
копировать
cd ~
wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.gz
tar -zxvf nasm-2.14.02.tar.gz
cd nasm-2.14.02
./configure
make && make install
cd ..

копировать

установить SRS

Язык кода:javascript
копировать
yum install -y git
# скачать
rm -rf /usr/local/srs2
cd ~
git clone https://gitee.com/psvmc/srs.git
cp -rf srs/trunk /usr/local/srs2

# Установить Трехсторонняя зависимость
cd /usr/local/srs2/3rdparty/

# Установить x264:
wget https://code.videolan.org/videolan/x264/-/archive/stable/x264-stable.tar.gz
tar -zxvf x264-stable.tar.gz
cd x264-stable
./configure --enable-static --enable-shared 
make && make install
cd ..

# Установитьfdk-aac
wget https://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-0.1.5.tar.gz
tar -zxvf fdk-aac-0.1.5.tar.gz
cd fdk-aac-0.1.5
./configure 
make && make install
cd ..

# Установить ffmpeg:
unzip ffmpeg-4.1.zip
cd ffmpeg-4.1
./configure --enable-gpl --enable-libx264 --enable-nonfree --enable-libfdk-aac
make && make install

# установить SRS:
cd /usr/local/srs2
./configure --full
make

копировать

Тест ffmpeg

Язык кода:javascript
копировать
ffmpeg -version

копировать

Сообщается об ошибке:

ffmpeg: error while loading shared libraries: libx264.so.157: cannot open sh

Решение

Язык кода:javascript
копировать
vi /etc/ld.so.conf

копировать

добавить вlibx264.soПуть

Язык кода:javascript
копировать
/usr/local/lib

копировать

Выполнить после выхода

Язык кода:javascript
копировать
ldconfig

копировать

Запуск в конфигурации с низкой задержкой

Язык кода:javascript
копировать
cd /usr/local/srs
nohup ./objs/srs -c conf/realtime.conf>log.txt &

копировать

завершить процесс

Язык кода:javascript
копировать
lsof -i:1935
kill -9 PID

копировать

Общая конфигурация

Конфигурация с низкой задержкой

Язык кода:javascript
копировать
listen              1935;
max_connections     1000;
daemon              off;
srs_log_tank        console;
vhost __defaultVhost__ {
    gop_cache       off;
    queue_length    10;
    min_latency     on;
    mr {
        enabled     off;
    }
    mw_latency      100;
    tcp_nodelay     on;
}

копировать

политика безопасности

Подробная конфигурация:https://github.com/ossrs/srs/wiki/v2_CN_Security

В настоящее время поддерживается только политика безопасности на основе IP, что не очень практично.

Язык кода:javascript
копировать
vhost your_vhost {
    # security for host to allow or deny clients.
    # @see https://github.com/ossrs/srs/issues/211   
    security {
        # whether enable the security for vhost.
        # default: off
        enabled         on;
        # the security list, each item format as:
        #       allow|deny    publish|play    all|<ip>
        # for example:
        #       allow           publish     all;
        #       deny            publish     all;
        #       allow           publish     127.0.0.1;
        #       deny            publish     127.0.0.1;
        #       allow           play        all;
        #       deny            play        all;
        #       allow           play        127.0.0.1;
        #       deny            play        127.0.0.1;
        # SRS apply the following simple strategies one by one:
        #       1. allow all if security disabled.
        #       2. default to deny all when security enabled.
        #       3. allow if matches allow strategy.
        #       4. deny if matches deny strategy.
        allow           play        all;
        allow           publish     all;
    }
}

копировать

Запись FLV локально

Подробная конфигурация:https://github.com/ossrs/srs/wiki/v2_CN_DVR

Прямые трансляции сохраняют локальные файлы.

Язык кода:javascript
копировать
vhost __defaultVhost__ {
    dvr {
        enabled         on;
        dvr_path        /data/rtmplive/[app]/[stream]/[2006]/[01]_[02]/[15]_[04]_[05]_[999].flv;
        dvr_plan        session;
        dvr_duration    30;
        dvr_wait_keyframe on;
        time_jitter    full;
    }
}

копировать

перенаправление потока

Подробная конфигурация:https://github.com/ossrs/srs/wiki/v1_CN_SampleForward

Язык кода:javascript
копировать
vhost __defaultVhost__ {
    forward         127.0.0.1:19350;
}

копировать

Forward VS Edge

ForwardАрхитектураиCDNАрхитектураиз Самая большая разница,CDN принадлежит к масштабному кластеру,Будут тысячи краевых узлов,2 исходные станции (горячий резерв),Также должен быть средний слой. У CDN много клиентов,Также будет много потоков. Итак, если начало координат перенаправляет каждый поток к краю,Это создает огромные потери (есть много потоков, которые нужны только нескольким узлам).

Видно, что перенаправление применяется только ко всем граничным узлам, которым требуются все потоки. CDN требует определенных потоков для определенных краевых узлов.

Узким местом пересылки является количество потоков. Предположим, что каждый SRS прослушивает только один порт:

Язык кода:javascript
копировать
Количество потоков в системе = Количество потоков для кодера × Количество узлов × Количество портов

копировать

Рассмотрим 5 узлов, каждый узел имеет 4 порта, то есть имеется 20 ребер SRS. Если кодер выводит 5 потоков, получается 20 * 5 = 100 потоков.

В той же архитектуре для краевых узлов CDN количество потоков в системе — это поток пользователей, обращающихся к граничным узлам. Если предположить, что пользователи не получают доступа, в системе не будет трафика. Когда пользователь в определенной области получает доступ к потоку на определенном узле, в системе существует только один поток вместо многоканального прямого широковещательного потока.

Кроме того, пересылка требует от игрока случайного доступа к нескольким портам для достижения балансировки нагрузки или от игрока к доступу к серверу API и серверу API для достижения балансировки нагрузки, что не подходит для CDN (клиенту необходимо сменить проигрыватель).

Короче говоря, пересылка подходит для небольших кластеров и не подходит для крупномасштабных кластерных приложений CDN.

Перепаковать в поток FLV

Подробная конфигурация:https://github.com/ossrs/srs/wiki/v2_CN_SampleHttpFlv

Язык кода:javascript
копировать
listen              1935;
max_connections     1000;
http_server {
    enabled         on;
    listen          8080;
    dir             ./objs/nginx/html;
}
vhost __defaultVhost__ {
    http_remux {
        enabled     on;
        mount       [vhost]/[app]/[stream].flv;
        hstrs       on;
    }
}

копировать

Сгенерированный адрес потока:

  • Адрес потока RTMP: rtmp://rtmp.psvmc.cn/live/livestream.
  • HTTP FLV: http://rtmp.psvmc.cn:8080/live/livestream.flv

Повторно инкапсулировать в поток HLS.

Подробная конфигурация:https://github.com/ossrs/srs/wiki/v2_CN_SampleHLS

Язык кода:javascript
копировать
listen              1935;
max_connections     1000;
vhost __defaultVhost__ {
    hls {
        enabled         on;
        hls_path        ./objs/nginx/html;
        hls_fragment    10;
        hls_window      60;
    }
}

копировать

Сгенерированный адрес потока:

  • Адрес потока RTMP: rtmp://rtmp.psvmc.cn/live/livestream.
  • Адрес потока HLS: http://rtmp.psvmc.cn/live/livestream.m3u8.

HTTP-обратный вызов

Подробная конфигурация:https://github.com/ossrs/srs/wiki/v2_CN_HTTPCallback

Язык кода:javascript
копировать
vhost __defaultVhost__ {
    http_hooks {
        enabled         on;
        on_connect      http://127.0.0.1:8085/api/v1/clients http://localhost:8085/api/v1/clients;
        on_close        http://127.0.0.1:8085/api/v1/clients http://localhost:8085/api/v1/clients;
        on_publish      http://127.0.0.1:8085/api/v1/streams http://localhost:8085/api/v1/streams;
        on_unpublish    http://127.0.0.1:8085/api/v1/streams http://localhost:8085/api/v1/streams;
        on_play         http://127.0.0.1:8085/api/v1/sessions http://localhost:8085/api/v1/sessions;
        on_stop         http://127.0.0.1:8085/api/v1/sessions http://localhost:8085/api/v1/sessions;
        on_dvr          http://127.0.0.1:8085/api/v1/dvrs http://localhost:8085/api/v1/dvrs;
        on_hls 					http://127.0.0.1:8085/api/v1/hls http://localhost:8085/api/v1/hls;
        on_hls_notify 	http://127.0.0.1:8085/api/v1/hls/[app]/[stream]/[ts_url][param];
    }
}

копировать

События обратного вызова SRS включают:

событие

данные

иллюстрировать

on_connect

{ “action”: “on_connect”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “tcUrl”: “rtmp://x/x?key=xxx”, “pageUrl”: “http://x/x.html" }

Когда клиент подключается к указанному виртуальному хосту и приложению

on_close

{ “action”: “on_close”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “send_bytes”: 10240, “recv_bytes”: 10240 }

Когда клиент закрывает соединение или SRS активно закрывает соединение

on_publish

{ “action”: “on_publish”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “tcUrl”: “rtmp://x/x?key=xxx”, “stream”: “livestream” }

При отправке на сервер

on_unpublish

{ “action”: “on_unpublish”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “stream”: “livestream” }

Когда клиент перестает публиковать поток

on_play

{ “action”: “on_play”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “stream”: “livestream”, “pageUrl”: “http://a.com/i.html", “param”:”?k=v” }

Когда клиент начинает воспроизводить поток

on_stop

{ “action”: “on_stop”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “stream”: “livestream” }

Когда клиент перестает играть. Примечание. Остановка воспроизведения может не привести к разрыву соединения, и воспроизведение может продолжиться.

on_dvr

{ “action”: “on_dvr”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “stream”: “livestream”, “cwd”: “/opt”, “file”: “./l.xxx.flv” }

При записи DVR закрывается FLV-файл

в:

  • событие: когда это событие произойдет,То есть указанный HTTP-адрес вызывается обратно.
  • HTTP-адрес: может поддерживаться несколько адресов, разделенных пробелами. SRS будет последовательно вызывать эти интерфейсы.
  • данные:SRSВоляданныеPOSTприезжатьHTTPинтерфейс。
  • Возвращаемое значение: SRS требует, чтобы HTTP-сервер возвращал HTTP200, а содержимое ответа представляет собой целочисленный код ошибки (0 указывает на успех).,Другие коды ошибок приведут к отключению соединения.

Запустите встроенный интерфейсный сервер

Язык кода:javascript
копировать
python research/api-server/server.py 8085

копировать

начать срс

Язык кода:javascript
копировать
./objs/srs -c conf/http.hooks.callback.conf

копировать

Тестовый поток push-уведомлений

Язык кода:javascript
копировать
ffmpeg -re -stream_loop -1 -i /data/rtmptest.mp4 -vcodec copy -acodec copy -f flv -y rtmp://127.0.0.1:1935/live/test

копировать

Транскодирование FFMpeg

Подробная конфигурация:

RTMP-сервер для потоковой передачи или обработки и пересылки.

К основным процессам транскодирования SRS относятся:

  1. Кодер передает поток RTMP на виртуальный хост SRS.
  2. Если vhost SRS перекодирован, он будет перекодирован.
  3. После перекодирования,в соответствии с Конфигурация,толкатьприезжатьSRSсамилиили другиеRTMPсервер。

Потоковая обработка

Язык кода:javascript
копировать
listen              1935;
max_connections     1000;
daemon              off;
srs_log_tank        console;
vhost __defaultVhost__ {
    transcode {
        enabled     on;
        ffmpeg      ./objs/ffmpeg/bin/ffmpeg;
        engine ff {
            enabled         on;
            vfilter {
            }
            vcodec          libx264;
            vthreads        4;
            vprofile        main;
            vpreset         medium;
            vparams {
            }
            acodec          libfdk_aac;
            aparams {
            }
            output          rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
        }
    }
}

копировать

Обработка и пересылка RTMP-сервера

Язык кода:javascript
копировать
vhost __defaultVhost__ {
	transcode {
        enabled     on;
        ffmpeg      ./objs/ffmpeg/bin/ffmpeg;
        engine ff {
            enabled         on;
            vfilter {
            }
            vcodec          copy;
            acodec          copy;
            output          rtmp://livepush.psvmc.cn/live/test;
        }
    }
}

копировать

запускать

Язык кода:javascript
копировать
cd /usr/local/srs2
./objs/srs -c conf/ffmpeg.transcode.conf
# или
nohup ./objs/srs -c conf/ffmpeg.transcode.conf>log.txt &

копировать

Push-стриминг

Язык кода:javascript
копировать
ffmpeg -re -stream_loop -1 -i /usr/local/srs2/doc/source.200kbps.768x320.flv -vcodec copy -acodec copy -f flv -y rtmp://127.0.0.1:1935/live/test

копировать

Проверьте, может ли ffmpeg на сервере успешно обработать поток.

Язык кода:javascript
копировать
ffmpeg -f flv -i rtmp://127.0.0.1:1935/live/test -vcodec libx264 -threads 4 -profile:v main -preset medium -acodec copy -f flv -y rtmp://127.0.0.1:1935/live/test2

копировать

Задействованные потоки включают в себя:

  • Поток передачи кодировщика: rtmp://rtmp.psvmc.cn:1935/live/test
  • Посмотрите оригинальную трансляцию: rtmp://rtmp.psvmc.cn:1935/live/test.
  • Поток командного перекодирования: rtmp://rtmp.psvmc.cn:1935/live/test2
  • Посмотрите транскодированный поток: rtmp://rtmp.psvmc.cn:1935/live/test_ff.

Пример конфигурации

Путь конфигурации: /usr/local/srs/conf/z.conf

Язык кода:javascript
копировать
listen              1935;
max_connections     1000;
daemon              off;
srs_log_tank        console;
http_server {
    enabled         on;
    listen          8080;
    dir             ./objs/nginx/html;
}
vhost __defaultVhost__ {
    gop_cache       off;
    queue_length    10;
    min_latency     on;
    mr {
        enabled     off;
    }
    mw_latency      100;
    tcp_nodelay     on;
	  dvr {
        enabled         on;
        dvr_path        /data/rtmplive/[app]/[stream]/[2006]/[01]_[02]/[15]_[04]_[05]_[999].flv;
        dvr_plan        session;
        dvr_duration    30;
        dvr_wait_keyframe       on;
        time_jitter    full;
    }
	  http_remux {
        enabled     on;
        mount       [vhost]/[app]/[stream].flv;
        hstrs       on;
    }
}

копировать

Заканчивать

Язык кода:javascript
копировать
lsof -i:1935
kill pid

копировать

запускать

Язык кода:javascript
копировать
cd /usr/local/srs
nohup ./objs/srs -c conf/z.conf>./log.txt &

копировать

Push-стриминг

Язык кода:javascript
копировать
ffmpeg -re -stream_loop -1 -i /data/rtmptest.mp4 -vcodec copy -acodec copy -f flv -y rtmp://rtmp.psvmc.cn:1935/live/test

копировать

Воспроизведение петли FFMpeg низкой версии

Язык кода:javascript
копировать
for((;;)); 
                    
                        
                            
                                
                                Опубликовано в 5 дней назад
                            
                            читать ( 23 )
                                                        Категория: Живой
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose