В книге «Практика разработки 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.
[srt]
latencyMul=4
pktBufSize=8192
port=9000
timeoutSec=5
Кроме того, ZLMediaKit не нужно настраивать какие-либо другие настройки. Просто запустите следующую команду ffmpeg после запуска, чтобы отправить видеофайл по адресу SRT. Обратите внимание: обязательно убедитесь, что FFmpeg на сервере Linux интегрировал библиотеку libsrt, иначе ffmpeg не сможет отправить поток на адрес srt. Подробные инструкции по интеграции см. в предыдущей статье «Интеграция libsrt и librist для FFmpeg в Linux». среда".
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 будет сообщено о следующей ошибке.
non-existing PPS 0 referenced
Кроме того, стандарты кодирования аудио и видео, поддерживаемые ZLMediaKit, перечислены в src/Extension/Frame.h. Подробные стандарты поддержки аудио и видео приведены ниже.
#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 работает нормально.
[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».
ffplay -i 'srt://124.xxx.xxx.xxx:9000?streamid=#!::r=live/test,m=request'
Вышеупомянутый адрес потоковой передачи SRT аналогичен предыдущему push-адресу. Помимо изменения IP-адреса внутренней сети на IP-адрес внешней сети, «m=publish» в конце ссылки меняется на «m=request», где запрос. означает запрос. То есть он используется для получения потока. После запуска ffplay появляется окно проигрывателя, и видеоизображения и звуки воспроизводятся нормально. В то же время просмотрите журнал обслуживания ZLMediaKit, как показано ниже:
[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: от нулевых основ до короткого онлайн-видео».