gpt4 book ai didi

c# - 如何使用 ffmpeg C# 将捕获的图像帧流式传输到 rtmp 服务器

转载 作者:行者123 更新时间:2023-12-04 23:20:25 25 4
gpt4 key购买 nike

我正在执行一项任务,我需要从 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 服务器进行直播。

最佳答案

您想从 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
例如:
  • 使用 FFmpeg 从 IP Camera 拉取 RTSP 并将 RTMP 推送到媒体服务器。
  • 使用 OpenCV/FFmpeg 从媒体服务器中提取 RTMP 并进行处理。
  • 处理完 RTMP 流后,将另一个新的 RTMP 流推回媒体服务器。

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

    关于c# - 如何使用 ffmpeg C# 将捕获的图像帧流式传输到 rtmp 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67886338/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com