gpt4 book ai didi

c# - FFmpeg with Pipe - 如何在 C# 中定期从实时流中抓取实时帧?

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

我是 FFmpeg 和 C# 的新手,我想要抓取帧来使用 IP 摄像机进行图像处理。

我已经制作了以下 C# 类,并且可以从 IP 摄像机获取单帧。

class FFmpegHandler
{
public Process ffmpeg = new Process();
public Image image;

public Image init()
{
ffmpeg = new Process()
{
StartInfo =
{
FileName = @"./ffmpeg/ffmpeg.exe",
//Arguments = "-i http://admin:@192.168.10.1/videostream.asf -an -f image2pipe -preset ultrafast -tune zerolatency -s 320x240 pipe:1", // Hangs
Arguments = "-i http://admin:@192.168.10.1/videostream.asf -vframes 1 -an -f image2pipe -preset ultrafast -tune zerolatency -s 320x240 pipe:1",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
WorkingDirectory = "./ffmpeg/"
}
};

ffmpeg.EnableRaisingEvents = true;
ffmpeg.Start();

var stream = ffmpeg.StandardOutput.BaseStream;
var img = Image.FromStream(stream);
//ffmpeg.WaitForExit();

return img;
}
}

问题是我想在请求时获取实时(最新)图像。

如果我运行 FFmpegHandler.init() ,我需要 2 秒才能延迟图像输出。

我试过删除参数 -vframes 1 , 那么它会在 之后挂起图像 = Image.FromStream(流); .

当我直接检查 ffmpeg 输出时,看起来 ffmpeg 正在继续构建流
frame=    6 fps=0.0 q=2.2 size=      25kB time=00:00:00.24 bitrate= 861.9kbits/s dup=4 drop=0 speed=0.435x    
frame= 65 fps= 60 q=24.8 size= 140kB time=00:00:02.60 bitrate= 440.9kbits/s dup=4 drop=0 speed=2.41x
frame= 77 fps= 49 q=24.8 size= 161kB time=00:00:03.08 bitrate= 428.0kbits/s dup=4 drop=0 speed=1.95x
frame= 89 fps= 43 q=24.8 size= 182kB time=00:00:03.56 bitrate= 418.6kbits/s dup=4 drop=0 speed= 1.7x
frame= 102 fps= 39 q=24.8 size= 205kB time=00:00:04.08 bitrate= 410.7kbits/s dup=4 drop=0 speed=1.57x
frame= 116 fps= 37 q=24.8 size= 229kB time=00:00:04.64 bitrate= 404.2kbits/s dup=4 drop=0 speed=1.49x
frame= 128 fps= 35 q=24.8 size= 250kB time=00:00:05.12 bitrate= 399.8kbits/s dup=4 drop=0 speed=1.41x
frame= 142 fps= 34 q=24.8 size= 274kB time=00:00:05.68 bitrate= 395.7kbits/s dup=4 drop=0 speed=1.36x
frame= 156 fps= 33 q=24.8 size= 299kB time=00:00:06.24 bitrate= 392.3kbits/s dup=4 drop=0 speed=1.32x
frame= 169 fps= 32 q=24.8 size= 322kB time=00:00:06.76 bitrate= 389.7kbits/s dup=4 drop=0 speed=1.29x
frame= 182 fps= 32 q=24.8 size= 344kB time=00:00:07.28 bitrate= 387.4kbits/s dup=4 drop=0 speed=1.26x
frame= 195 fps= 31 q=24.8 size= 367kB time=00:00:07.80 bitrate= 385.5kbits/s dup=4 drop=0 speed=1.24x
frame= 208 fps= 31 q=24.8 size= 390kB time=00:00:08.32 bitrate= 383.8kbits/s dup=4 drop=0 speed=1.22x
frame= 221 fps= 30 q=24.8 size= 413kB time=00:00:08.84 bitrate= 382.3kbits/s dup=4 drop=0 speed=1.21x

如何从这个实时流图像中获取最新帧? (或者是否有一种线程安全的方式来清理流并且只在我请求时获取最新的帧?)

最佳答案

最后我找到了一个使用名为的包的解决方法,

FFmpeg.AutoGen

https://github.com/Ruslan-B/FFmpeg.AutoGen



请参阅他们进行流解码的示例。

FFmpeg.AutoGen.Example > program.cs

private static unsafe void DecodeAllFramesToImages(AVHWDeviceType HWDevice) { ... }

这使我几乎可以实时访问每个输入帧。

关于c# - FFmpeg with Pipe - 如何在 C# 中定期从实时流中抓取实时帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60426304/

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