【问题标题】:how to stream capture image frame to rtmp server using ffmpeg C#如何使用 ffmpeg C# 将捕获的图像帧流式传输到 rtmp 服务器
【发布时间】:2021-06-08 11:52:27
【问题描述】:

我正在执行一项任务,我需要从 IP 摄像机捕获流,然后我需要将捕获帧发送到 RTMP 服务器。

为了从相机捕获图像帧,我使用 Emgu CV 的 OpenCV C# 包装器。

为了将帧发送到 RTMP 服务器,我使用的是 ffmpeg,但它工作正常。 任何人都可以帮助我如何完成这项任务。

  private void ProcessFrame(object sender, EventArgs e)
        {
            try
            {
                if (_capture != null && _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服务器进行直播。

【问题讨论】:

    标签: c# ffmpeg rtmp live-streaming red5


    【解决方案1】:

    你想从 IP 摄像头获取图像,然后通过 OpenCV 处理帧,最后通过 FFmpeg 编码并通过 FFmpeg 发送到媒体服务器吗?你的工作流程是这样的:

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

    还有另一个工作流程,可能非常简单,使用 FFmpeg 直接从您的 IP 摄像机中提取流,然后通过 OpenCV 处理 RTMP 流,如下所示:

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

    例如:

    1. 使用 FFmpeg 从 IP Camera 拉取 RTSP 并将 RTMP 推送到媒体服务器。
    2. 使用 OpenCV/FFmpeg 从媒体服务器中提取 RTMP 并进行处理。
    3. 处理完 RTMP 流后,将另一个新的 RTMP 流推回媒体服务器。

    所有组件在管道中使用通用的 RTSP/RTMP 协议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-11
      • 2020-10-27
      • 2013-10-08
      • 2013-12-26
      • 1970-01-01
      • 2013-02-15
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多