как передать кадр захвата изображения на rtmp-сервер с помощью ffmpeg C#

#c# #ffmpeg #rtmp #live-streaming #red5

Вопрос:

Я работаю над задачей, в которой мне нужно захватить поток с IP-камеры, а затем отправить кадр захвата на RTMP-сервер.

для захвата кадра изображения с камеры я использую оболочку OpenCV C# Emgu CV.

Для отправки кадра на RTMP-сервер я использую ffmpeg, но он работает нормально. Может ли кто-нибудь помочь мне с тем, как я могу выполнить эту задачу.

   private void ProcessFrame(object sender, EventArgs e)
        {
            try
            {
                if (_capture != null amp;amp; _capture.Ptr != IntPtr.Zero)
                {
                    _capture.Retrieve(_frame, 0);
                  
                    if (_capture.IsOpened)
                    {
                        string imagename = "image"   count   ".png";
                        _frame.Save(@"C:\Staging\Jacob\CameraImage\"  imagename);
                        var myBinary = ImageToByteArray(_frame.ToBitmap());
                        if (ffMpegTask != null)
                        {
                            ffMpegTask.Write(myBinary, 0, myBinary.Length);
                            if ((DateTime.UtcNow - starttime).TotalSeconds > 5)
                            {
                                ffMpegTask.Write(myBinary, 0, myBinary.Length);
                                starttime = DateTime.UtcNow;
                            }

                        }
                        else
                        {
                            ffMpegg = new NReco.VideoConverter.FFMpegConverter();
                            ffMpegTask = ffMpegg.ConvertLiveMedia(
                             null,
                             "rawvideo",
                             "rtmp://localhost/live/abcd",
                             Format.flv,
                             new ConvertSettings()
                             {
                                 //CustomInputArgs = String.Format(" -pix_fmt bgr24 -video_size 640x360 -framerate 5 "),
                                 //CustomInputArgs = String.Format(" -pix_fmt bgr24 -video_size 640x480 -framerate 5 ",frameBmp.Width, frameBmp.Height)
                                 CustomInputArgs = String.Format("-y -an -f rawvideo -vcodec rawvideo -pix_fmt bgr24 -video_size 640x480 -framerate 5 -r 5", _frame.Width, _frame.Height),
                                 //CustomOutputArgs = "-c:v libx264 -pix_fmt yuv420p -preset ultrafast -f flv",
                                 CustomOutputArgs = "-c:v libx264 -pix_fmt yuv420p -preset ultrafast -f flv",
                             }

                        );
                            ffMpegTask.Start();
                        }
                    }
                    else
                    {
                        process.Close();
                    }



                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
 

В приведенном выше коде я постоянно получаю кадр изображения, теперь мне нужно непрерывно отправлять этот кадр на rtmp — сервер для прямой трансляции.

Ответ №1:

Вы хотите получить изображение с IP-камеры, затем обработать кадр с помощью OpenCV, наконец, закодировать с помощью FFmpeg и отправить на медиасервер с помощью FFmpeg? Ваш рабочий процесс выглядит следующим образом:

 IP Camera --YUV---> OpenCV ---Frame--> FFmpeg --RTMP---> Media Server
 

Существует еще один рабочий процесс, который может быть очень простым, чтобы использовать FFmpeg для прямого извлечения потока с вашей IP-камеры, а затем обработать поток RTMP с помощью OpenCV, например:

 IP Camera -RTSP-> FFmpeg -> Media Server -> OpenCV/FFmpeg -> Media Server
 

Например:

  1. Используйте FFmpeg для извлечения RTSP с IP — камеры и передачи RTMP на медиасервер.
  2. Используйте OpenCV/FFmpeg для извлечения RTMP с медиа-сервера и его обработки.
  3. После обработки потока RTMP отправьте еще один новый поток RTMP на медиасервер.

Все компоненты используют общий протокол RTSP/RTMP в конвейере.