Проблема с сетью FFmpeg RTP в Ubuntu

Я хочу скопировать кучу источников SD из mpegts, транспортируемых с помощью RTP, в локальные файлы. (VBR mpeg2video, mp2 audio). Он отлично работает для одного источника многоадресной рассылки с помощью следующей команды:

ffmpeg -i rtp://@IP1:PORT -c copy video1.mpg

но когда я запустил второй экземпляр ffmpeg с помощью следующей команды:

ffmpeg -i rtp://@IP2:PORT -c copy video2.mpg

то я получил ошибки от обоих экземпляров FFmpeg («RTP: отбрасывание старого пакета, полученного слишком поздно») и в обоих файлах (video1.mpg и video2.mpg) записанное видео из второго источника (rtp: / / @ IP2: ПОРТ).

Эта проблема возникает только в Linux (я проверял Ubuntu 14.04 - 16.04). У меня нет проблем с Windows и могу корректно перекодировать видео параллельно из файлов. В Ubuntu даже два экземпляра ffplay, настроенные на разные источники, воспроизводят один и тот же контент (из источника, который был открыт последним). Я пробовал воспроизвести с помощью VLC, и такой проблемы нет.

Я могу решить эту проблему, используя FFmpeg с параметром -f:
ffmpeg -f mpegts -i rtp: // @ IP1: PORT -c copy video1.mpg
и
ffmpeg -f mpegts -i rtp: // @ IP2: PORT -c copy video2.mpg, но затем получаю следующие ошибки: "[mpegts @ 0x306e240] Пакет PES несоответствие размера " и получите оба файла (video1.mpg и video2.mpg) с артефактами и эффектами замораживания. Эта проблема возникает в обеих операционных системах.

Как я могу записывать | перекодировать видео из нескольких потоков RTP с помощью FFmpeg одновременно в Ubuntu без ошибок и артефактов?


person Ivan Kolesnikov    schedule 14.08.2015    source источник
comment
Вы решили свою проблему ?! Я получил потерю пакетов RTP и ошибки отсутствия изображения.   -  person Dr.jacky    schedule 13.12.2015
comment
Использование udp для http-прокси (udpxy) решило эту проблему для меня.   -  person Ivan Kolesnikov    schedule 14.12.2015
comment
Я хочу запустить ffmpeg на android, поэтому я не могу использовать решение udpxy. Согласны ли вы, что увеличение максимального размера буфера UDP может помочь?   -  person Dr.jacky    schedule 14.12.2015
comment
В моем случае это не помогло.   -  person Ivan Kolesnikov    schedule 14.12.2015


Ответы (2)


Обновление:

При использовании многоадресной группы вам может потребоваться установить параметр sources для приема пакетов, отправленных с указанного адреса.

sources = адрес [, адрес]

Принимать пакеты, отправленные в группу многоадресной рассылки, только с одного из указанных IP-адресов отправителя.

ffmpeg -i rtp://[multicast-address]:port?sources=xxx


Скорее всего, это вызвано малоразмерный буфер приема на вашем Linux-компьютере. Поскольку вы упомянули SD, оно должно быть установлено довольно низким.

Вы можете получить текущее значение в байтах с помощью:

sysctl net.core.rmem_max

и установите новое значение с помощью:

sysctl -w net.core.rmem_max=26214400

или отредактируйте /etc/sysctl.conf

person aergistal    schedule 14.08.2015
comment
Спасибо за ответ. Я установил net.core.rmem_max равным 26214400. Значение net.core.rmem_max было 212992. Также пытался изменить значение net.core.rmem_default, к сожалению, это не помогло. - person Ivan Kolesnikov; 14.08.2015
comment
Если две ffplay команды с 2 разными источниками воспроизводят одно и то же, возможно, что-то не так с вашей многоадресной рассылкой. Что передаёт на другом конце? - person aergistal; 14.08.2015
comment
Использую следующие команды: ffplay -i rtp: // IP1: PORT? Sources = SourceIP1 - все нормально. Затем: ffplay -i rtp: // IP2: PORT? Sources = SourceIP2 - в обоих окнах воспроизводится видео с rtp: // IP2: PORT. Когда я закрыл второй экземпляр ffplay, в первом окне снова воспроизводилось видео с rtp: // IP1: PORT. Но я могу воспроизводить два разных видеопотока (rtp: // IP1: PORT и rtp: // IP2: PORT) через VLC в Ubuntu. - person Ivan Kolesnikov; 14.08.2015
comment
Вдобавок: когда я открываю два экземпляра ffplay с разными URL-адресами (rtp: // IP1: PORT? Sources = SourceIP1 и rtp: // IP2: PORT? Sources = SourceIP2), они воспроизводят одно и то же видео с rtp: // IP2: PORT . В этот момент я открываю url (rtp: // IP1: PORT? Sources = SourceIP1) в VLC, и VLC воспроизводит видео с rtp: // IP1: PORT. - person Ivan Kolesnikov; 14.08.2015
comment
@aergistal Вы хоть представляете, где этот файл в исходном коде Android ?! (перед компиляцией AOSP нет выходной папки, содержащей папку etc; я хочу изменить sysctl.conf перед компиляцией) - person Dr.jacky; 13.12.2015

Это не лучшее решение, но может решить эту проблему.
Я запускаю udpxy следующим образом: udpxy -p 5556
Затем запускаю ffmpeg в следующем путь: ffmpeg -i http://0.0.0.0:5556/rtp/239.255.1.1:5044

person Ivan Kolesnikov    schedule 22.03.2016