Вопрос или проблема
Каждый раз, когда я пытаюсь транслировать С аудио, независимо от источника ввода, я получаю “av_interleaved_write_frame(): Broken pipe”. Ошибка возникает не мгновенно, а время от времени. Я пытаюсь использовать FFMPEG из AutoHotkey, чтобы, когда пользователи запускают AHK Script, их веб-камера со звуком автоматически транслировалась на центральный RTSP-Proxy.
Версия: ffmpeg-2022-11-23-git-c8e9cc8d20-full_build
ОС: Win 10 64bit 22H2 19045.2251
Для тестирования я пытался стримить в локальной сети с одного ПК на другой, напрямую подключенных через Ethernet к одному свитчу, так что проблем быть не должно.
Я попробовал следующую команду, выполненную из .BAT, в командной строке и из командной строки, встроенной в Autohotkey.
ffmpeg -loglevel 56 -hide_banner -f dshow -i audio="VoiceMeeter Output (VB-Audio VoiceMeeter VAIO)" -rtsp_transport tcp rtsp://10.18.7.103:8554/live
Трейслог: https://pastebin.com/ABV049BT
Я думаю, эта ошибка возникает потому, что RTSP-сервер, на который вы стримите, закрыл соединение, например, из-за тайм-аута.
Я однажды сталкивался с этой проблемой. В моем случае, если поток останавливался на некоторое время, сервер закрывал соединение. Чтобы этого избежать, можно передавать пакеты с тишиной вместо полного отсутствия передачи.
.
Ответ или решение
Решение проблемы с ошибкой "av_interleaved_write_frame(): Broken Pipe" при потоковой передаче с помощью FFMPEG
Проблема, с которой вы столкнулись, связана с использованием FFMPEG для потоковой передачи аудио и видео через RTSP. Ошибка "av_interleaved_write_frame(): Broken Pipe" часто возникает, когда RTSP-сервер, к которому вы подключаетесь, неожиданно закрывает соединение. Это может происходить по различным причинам, включая тайм-ауты или потерю пакетов в сети.
Анализ проблемы:
-
Программное окружение:
- Вы используете FFMPEG версии от 23 ноября 2022 года на системе Windows 10 64bit версии 22H2.
- Поток передается с локального устройства на другой компьютер через Ethernet-соединение.
-
Технические детали:
- FFMPEG выполняет команду для потоковой передачи аудио через RTSP-протокол, но возникает ошибка с "сломанной трубой" спустя некоторое время после начала передачи.
-
Потенциальные причины:
- RTSP-сервер может закрывать соединение из-за отсутствия аудиопотока (паузы в передаче).
- Проблемы с сетью или конфигурацией сети, которые приводят к задержкам и потере пакетов.
- Использование несоответствующего аудиокодека или формата, который не поддерживается целевым RTSP-сервером.
Рекомендации по решению:
-
Передача заглушек в аудиопотоке:
- Ваша догадка о том, что передача пустых аудиопакетов может помочь избежать закрытия соединения, верна. Для этого можно использовать генерацию тихого (беззвучного) звука в потоке вместо полной остановки передачи.
-
Отладка с использованием других настроек:
- Проверьте настройки аудиокодека в вашей команде. Возможно, стоит сменить кодек на более стабильный или совместимый с RTSP-сервером.
- Используйте флаг
-re
в FFMPEG для более "естественной" потоковой передачи, симулируя скорость реального времени.
-
Тестирование сетевой инфраструктуры:
- Убедитесь, что сеть не страдает от перегрузок или сбоев, которые могут вызывать потерю соединения.
- Проверка локальных параметров сетевой карты и проводимости Ethernet-кабеля может устранить аппаратные сбои.
-
Улучшение стабильности RTSP-сервера:
- Как временное решение, попробуйте увеличить таймаут на RTSP-сервере, если это возможно. Это позволить повысить устойчивость соединения.
- Применение более надежного RTSP-прокси или использование другого сервера может улучшить параметры связи.
-
Проверка логов:
- Воспользуйтесь подробным логированием FFMPEG
-report
для анализа проблемы. Это может предоставить больше информации о том, в какой момент и по какой причине возникает сбой.
- Воспользуйтесь подробным логированием FFMPEG
Заключение
Необходимо уделить внимание не только исправлению проблем с самим кодеком и FFMPEG, но и исследованию влияния сетевой инфраструктуры и конфигураций RTSP-сервера. Исправление или минимизация пауз в аудиопотоке позволит избежать преждевременного разрыва соединения сервером.