FFmpeg с Pipe - как я могу периодически извлекать кадры в реальном времени из потоков в реальном времени в C#? - PullRequest
0 голосов
/ 27 февраля 2020

Я новичок в 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 = Image.FromStream (stream); .

Когда я проверяю вывод 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   

Как я могу извлечь последние кадры из этого изображения живого потока ? (ИЛИ есть ли потокобезопасный способ очистки потока и получения только последнего кадра при запросе?)

1 Ответ

0 голосов
/ 02 марта 2020

Наконец я нашел обходной путь, используя пакет под названием

FFmpeg.AutoGen

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

Обратитесь к их примеру, где они выполняют потоковое декодирование.

FFmpeg.AutoGen.Example> program.cs

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

Это дает мне доступ к каждый входной кадр почти в реальном времени.

...