Фоновое воспроизведение для IP-камеры RTSP в формате net и вывод в поток http - PullRequest
0 голосов
/ 18 января 2020

В настоящее время я изучаю лучший метод, позволяющий клиентам воспроизводить IP-камеру в режиме реального времени, где мой сервер является источником, использующим RTSP для захвата потока, поэтому в то же время мне нужно иметь возможность выводить это живое воспроизведение на * 1033. * стандартный проигрыватель "тег видео" и всякий раз, когда я хочу, мне нужно довольно быстро получить снимок.

Я пытался использовать WebRequest для получения снимок, но проблема в том, что для подготовки снимка камере требуется около 1 секунды.

Я пробовал другое решение, как здесь Извлечение эскиза из RTSP , но для этого изображения требуется 2 секунды чтобы быть готовым к моему заявлению.

Обновление 1

Мне удалось получить один кадр с помощью ffmpeg.exe через интерфейс командной строки и передать аргументы:

"- i rtsp: // UN:PW@IP: 554 / live -vframes 1 -f singlejpeg -"

А потом после запуска процесс, я читаю поток в вывод, где это мой двоичные изображения с использованием:

process.StandardOutput.BaseStream.CopyTo (output);

Теперь моя единственная оставленная проблема заключается в том, что я хотел продолжить чтение rtsp и получить двоичные файлы со скоростью, например, «2 кадра в секунду». Есть идеи рабочего кода?

1 Ответ

0 голосов
/ 21 января 2020

Хорошо, думаю, я понял, как сделать то, что мне нужно было сделать. Сначала запишите аргументы команды, которые будут работать без проблем с ffmpeg:

-rtsp_transport tcp -i rtsp: // UN:PW@IP: 554 / live -err_detect ignore_err -r 10 -f image2pipe -

Далее вы настроили процесс следующим образом:

using (var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
                CreateNoWindow = true,
                Arguments = arguments,
                FileName = fFMpegExePath
            },
            EnableRaisingEvents = true
        })
        {
            // code body
        }

Теперь вам нужно process.Start () и затем начать слушать process.StandardOutput.BaseStream as FileStream и обрабатывает считывающий байт за байтом. Обратите внимание, что я установил низкую частоту кадров -r 10 , потому что если она вообще не установлена, поток будет зависать без видимой причины, но в этом случае я тестировал задачу более 2 часов, и она никогда не давала сбоя.

Надеюсь, это поможет вам всем, кто сталкивался с этой проблемой.

...