Замечания по разработке FFmpeg (42) Используйте ZLMediaKit для включения службы прямой трансляции видео SRT.
Замечания по разработке FFmpeg (42) Используйте ZLMediaKit для включения службы прямой трансляции видео SRT.

В книге «Практика разработки FFmpeg: от нулевых основ к короткому видео онлайн» в главе 10 представлен легкий сервер потокового мультимедиа MediaMTX. Этот инструмент может тестировать потоки push и pull протоколов потокового мультимедиа, таких как RTSP/RTMP. Однако функция MediaMTX слишком проста и не может быть применена к производственной среде реальной прямой трансляции. Сервер потокового мультимедиа, который можно по-настоящему использовать в производственной среде, зависит от SRS или ZLMediaKit.

ZLMediaKit — это домашний сервер потокового мультимедиа с открытым исходным кодом, который поддерживает основные протоколы прямого вещания, такие как RTSP, RTMP и SRT. Инструкции по установке см. в предыдущей статье «Установка ZLMediaKit в среде Linux для реализации потокового видео». Объединение ZLMediaKit и ffmpeg для реализации функции потоковой передачи протокола RTSP/RTMP подробно описано в статье «Установка ZLMediaKit в среде Linux для реализации передачи видео». Здесь мы отдельно объясним, как реализовать функцию потоковой передачи протокола SRT через ZLMediaKit. и ффмпег. ZLMediaKit уже поддерживает SRT по умолчанию при компиляции и запуске. Проверьте файл конфигурации config.ini ZLMediaKit и найдите информацию о конфигурации части srt следующим образом. Видно, что ZLMediaKit по умолчанию назначает порт 9000 протоколу SRT.

Язык кода:javascript
копировать
[srt]
latencyMul=4
pktBufSize=8192
port=9000
timeoutSec=5

Кроме того, ZLMediaKit не нужно настраивать какие-либо другие настройки. Просто запустите следующую команду ffmpeg после запуска, чтобы отправить видеофайл по адресу SRT. Обратите внимание: обязательно убедитесь, что FFmpeg на сервере Linux интегрировал библиотеку libsrt, иначе ffmpeg не сможет отправить поток на адрес srt. Подробные инструкции по интеграции см. в предыдущей статье «Интеграция libsrt и librist для FFmpeg в Linux». среда".

Язык кода:javascript
копировать
ffmpeg -re -stream_loop -1 -i "/usr/local/src/test/cctv5.ts" -c copy -f mpegts 'srt://127.0.0.1:9000?streamid=#!::r=live/test,m=publish'

Обратите внимание, что вторая половина адреса srt в приведенной выше команде — «r=live/test,m=publish», где «r=live/test» означает, что имя службы SRT — «live/test», а « m=publish" Указывает, что адрес принадлежит функции публикации и используется отправляющей стороной. ZLMediaKit также предъявляет требования к формату инкапсуляции исходных видеофайлов. Он не только требует, чтобы исходные файлы были в формате ts, но также требует, чтобы формат push был в формате ts, поэтому к команде ffmpeg добавляется «-f mpegts». для обозначения преобразования в формат потока ts mpeg. Если исходный файл не в формате ts или не конвертирован в формат mpegts, при воспроизведении ссылки srt через ffplay будет сообщено о следующей ошибке.

Язык кода:javascript
копировать
non-existing PPS 0 referenced

Кроме того, стандарты кодирования аудио и видео, поддерживаемые ZLMediaKit, перечислены в src/Extension/Frame.h. Подробные стандарты поддержки аудио и видео приведены ниже.

Язык кода:javascript
копировать
#define CODEC_MAP(XX) \
    XX(CodecH264,  TrackVideo, 0, "H264", PSI_STREAM_H264, MOV_OBJECT_H264)          \
    XX(CodecH265,  TrackVideo, 1, "H265", PSI_STREAM_H265, MOV_OBJECT_HEVC)          \
    XX(CodecAAC,   TrackAudio, 2, "mpeg4-generic", PSI_STREAM_AAC, MOV_OBJECT_AAC)   \
    XX(CodecG711A, TrackAudio, 3, "PCMA", PSI_STREAM_AUDIO_G711A, MOV_OBJECT_G711a)  \
    XX(CodecG711U, TrackAudio, 4, "PCMU", PSI_STREAM_AUDIO_G711U, MOV_OBJECT_G711u)  \
    XX(CodecOpus,  TrackAudio, 5, "opus", PSI_STREAM_AUDIO_OPUS, MOV_OBJECT_OPUS)    \
    XX(CodecL16,   TrackAudio, 6, "L16", PSI_STREAM_RESERVED, MOV_OBJECT_NONE)       \
    XX(CodecVP8,   TrackVideo, 7, "VP8", PSI_STREAM_VP8, MOV_OBJECT_VP8)             \
    XX(CodecVP9,   TrackVideo, 8, "VP9", PSI_STREAM_VP9, MOV_OBJECT_VP9)             \
    XX(CodecAV1,   TrackVideo, 9, "AV1", PSI_STREAM_AV1, MOV_OBJECT_AV1)             \
    XX(CodecJPEG,  TrackVideo, 10, "JPEG", PSI_STREAM_JPEG_2000, MOV_OBJECT_JPEG)

Видно, что если отправляемый видеофайл не соответствует вышеуказанным стандартам кодирования аудио и видео, он не будет нормально отправлен через адрес службы SRT. После запуска команды push SRT ffmpeg ZLMediaKit выводит следующую информацию журнала, которая показывает, что его функция push SRT работает нормально.

Язык кода:javascript
копировать
[MediaServer] [576478-event poller 0] SrtSession.cpp:103 onRecv | 1-11(127.0.0.1:33630) 
[MediaServer] [576478-event poller 0] SrtTransportImp.cpp:166 operator() | test(127.0.0.1:33630) позволять srt Push-стриминг
[MediaServer] [576478-event poller 0] Decoder.cpp:143 onTrack | Got track: H264
[MediaServer] [576478-event poller 0] Decoder.cpp:143 onTrack | Got track: mpeg4-generic
[MediaServer] [576478-event poller 0] Decoder.cpp:97 onStream | Add track finished
[MediaServer] [576478-event poller 0] MediaSink.cpp:161 emitAllTrackReady | All track ready use 172ms
[MediaServer] [576478-event poller 0] MediaSource.cpp:517 emitEvent | Регистрация носителя: fmp4://__defaultVhost__/live/test
[MediaServer] [576478-event poller 0] MultiMediaSourceMuxer.cpp:551 onAllTrackReady | stream: schema://__defaultVhost__/app/stream , codec info: mpeg4-generic[48000/2/16] H264[1280/720/25] 
[MediaServer] [576478-event poller 0] MediaSource.cpp:517 emitEvent | Регистрация носителя:rtmp://__defaultVhost__/live/test
[MediaServer] [576478-event poller 0] MediaSource.cpp:517 emitEvent | Регистрация носителя: rtsp://__defaultVhost__/live/test
[MediaServer] [576478-event poller 0] MediaSource.cpp:517 emitEvent | Регистрация носителя: ts://__defaultVhost__/live/test
[MediaServer] [576478-event poller 0] MediaSource.cpp:517 emitEvent | Регистрация носителя:hls://__defaultVhost__/live/test

Затем следуйте введению «1.3 Установка FFmpeg в системе Windows» в книге «Разработка FFmpeg: от нулевых основ до короткого видео в Интернете», установите FFmpeg на свой персональный компьютер и откройте командную строку MSYS, запустите следующую команду ffplay и ожидайте начать с адреса SRT Потоковое воспроизведение. Обратите внимание: обязательно убедитесь, что FFmpeg на вашем компьютере интегрировал библиотеку libsrt, иначе ffplay не сможет воспроизвести ссылку srt. Подробные инструкции по интеграции см. в предыдущей статье «Интеграция libsrt для FFmpeg в среду Windows».

Язык кода:javascript
копировать
ffplay -i 'srt://124.xxx.xxx.xxx:9000?streamid=#!::r=live/test,m=request'

Вышеупомянутый адрес потоковой передачи SRT аналогичен предыдущему push-адресу. Помимо изменения IP-адреса внутренней сети на IP-адрес внешней сети, «m=publish» в конце ссылки меняется на «m=request», где запрос. означает запрос. То есть он используется для получения потока. После запуска ffplay появляется окно проигрывателя, и видеоизображения и звуки воспроизводятся нормально. В то же время просмотрите журнал обслуживания ZLMediaKit, как показано ниже:

Язык кода:javascript
копировать
[MediaServer] [576478-event poller 0] SrtSession.cpp:103 onRecv | 2-16(112.5.138.145:57022) 
[MediaServer] [576478-event poller 0] SrtTransport.cpp:731 onShutdown | peer close connection
[MediaServer] [576478-event poller 0] SrtSession.cpp:118 onError | 2-16(112.5.138.145:57022) 6(peer close connection)
[MediaServer] [576478-event poller 0] SrtTransportImp.cpp:14 ~SrtTransportImp | test(112.5.138.145:57022) srt Игрок (__defaultVhost__/live/test) отключился, время (с): 16

Как видно из приведенных выше журналов, ZLMediaKit успешно реализовал функцию двухтактной потоковой передачи живого видео SRT через протокол SRT.

Более подробную информацию о разработке FFmpeg можно найти в книге «Практика разработки FFmpeg: от нулевых основ до короткого онлайн-видео».

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода