Live555MediaServer перезапускает поток при каждом новом подключении. Почему установка для reuseSource значения true не работает должным образом?

Live555MediaServer можно использовать для потоковой передачи видеофайлов в виде потоков rtsp. У меня есть 2 клиента (vlc), которые подключаются к серверу, A и B. Я хочу видеть точный видеопоток на обоих клиентах. Вот проблема: я подключаю A и через 10 секунд подключаю B. Когда B подключен, видео, которое я вижу, начинается сначала, а A продолжает течь, как было.

Я хотел бы, чтобы 2 одновременных потока были синхронизированы.

В документе live555 говорится, что установка для параметра reuseFirstSource значения True должна работать. Поэтому я попытался установить для reuseSource значение true в DynamicRTSSPServer:121, но это не сработало. Когда я подключаюсь к серверу с помощью клиента B, видео перезапускается с самого начала.

Логическая константа reuseSource = True;

Я ожидаю увидеть синхронизацию двух одновременных потоков, даже если один начинается с задержкой по отношению к другому.


person Avandrea    schedule 22.07.2019    source источник
comment
После некоторого копания я обнаружил, что проблема не связана с логическим значением reuseSource. Диаграмма вызовов live555MediaServer с потоком h264 выглядит следующим образом: DynamicRTSPServer -> H264VideoFileServerMediaSubsession -> FileServerMediaSubsession -> OnDemandServerMediaSubsession В строке 113 есть такая проверка: if (fLastStreamToken != NULL && fReuseFirstSource) которая не проходит при первой проверке. По какой-то причине fLastStreamToken всегда повторно инициализируется, и поэтому эта проверка не выполняется. Теперь вопрос в том, как я могу сохранить fLastStreamToken между двумя запросами клиентов rtsp?   -  person Avandrea    schedule 23.07.2019
comment
Полезные советы по отладке live555: - ./genMakefiles linux-gdb, где требуется следующий gdb; - изменить файл live/config.linux-gdb, добавить -DDEBUG в строку COMPILE_OPTS, чтобы отладка в исходниках была корректной; - ./genMakefiles linux-gdb. - сделать скомпилированный файл - запустить gdb live555ProxyServer - задать входные параметры args, например set args -v rtsp://192.168.xxx.xxx - можно сначала установить точку останова, например break xx, а затем запустить;   -  person Avandrea    schedule 24.07.2019


Ответы (1)


Наконец-то я нашел обходной путь и причину возникновения этой «ошибки».

Быстрый ответ: установите условие в строке 67 в false, т. е.
if (smsExists && isFirstLookupInSession) {
станет
if (false) {

Объяснение: каждый раз, когда начинается новый сеанс, переменная isFirstLookupInSession устанавливается в true, а сеанс удаляется и создается заново.

Написал в поддержку live555 и Финлейсон мне сказал и я цитирую

Код «LIVE555 Media Server» всегда предназначался для такой работы и предназначался как «автономное устройство», код которого не изменялся (например, путем изменения значения «reuseFirstSource»).

Таким образом, единственным решением для создания RTSP-сервера через Live555 является создание собственного сервера на основе примеров testProgs. Предлагаемый здесь обходной путь может привести к нежелательному поведению, но для простого сервера rtsp с несколькими потоками это нормально.

person Avandrea    schedule 26.07.2019