У меня возникла следующая проблема:
Я хочу иметь возможность отключать и включать звук из потока ffmpeg во время работы ffmpeg. Я искал некоторое время и задавался вопросом, как это сделать. Я много читал в интернете, но не нашел проблему, которую искал.
Теперь я знаю только, что это можно сделать с помощью фильтров sendcmd или zmq, но API ffmpeg для этого не дает мне никаких результатов.
Кто-нибудь может объяснить, как это сделать? Если я правильно понял, то нужно вставить параметры фильтра в работающую программу через sendcmd
или zmq
фильтры.
Вот что у меня есть .bat
для запуска ffmpeg:
start cmd /K ffmpeg -i "rtsp://[IPADRESS]" -b:v 6000K -minrate 6000K -maxrate 6000K -vcodec copy -acodec copy -f flv rtmp://[IPADRESS]
решение1
Для интерактивного отключения и включения звука вы можете использоватьазмкфильтр собъемфильтр.
Для использования интерактивных команд нам понадобится инструмент под названием zmqsend
.
Вы можете загрузить ffmpeg-tools.zip
версию для Windows с сайтаздесь. (Для тестирования я извлек инструменты в ту же папку, что и ffmpeg.exe).
Добавьте следующий аудиофильтр: -af "azmq,volume@my=volume=1"
к вашей команде FFmpeg.
volume@my
использует «интерактивное имя» для фильтра громкости.azmq
требуется для разрешения интерактивных команд для аудиофильтра, который идет послеazmq
(интерактивные команды дляvolume
фильтра).
Вот пакетный файл, который запускает FFplay и прослушивает поток FFmpeg RTMP:
start ffplay -listen 1 -timeout 10000 -f flv rtmp://127.0.0.1:5000/mystream/test
ping 127.0.0.1 -n 6 > nul
start ffmpeg -y -re -f lavfi -i testsrc=duration=25000:size=192x108:rate=25 -f lavfi -i sine=frequency=500 -af "azmq,volume@my=volume=1" -vcodec libx264 -tune zerolatency -crf 17 -pix_fmt yuv420p -f flv rtmp://127.0.0.1:5000/mystream/test
Приведенные выше команды транслируют синтетический звук и видео (для тестирования).
Команда ping
используется для ожидания нескольких секунд перед запуском FFmpeg.
Вы можете поместить пакетный файл в ту же папку, что и ffmpeg.exe и zmqsend.exe
Выполните пакетный файл...
Для отключения звука выполните (из консоли):
echo volume@my volume 0 | zmqsend
Чтобы включить звук, выполните:
echo volume@my volume 1 | zmqsend
Возможно, есть и другие методы, но тема интерактивных команд недостаточно хорошо документирована...