Сделать снимок экрана из онлайн-видеопотока

Мне нужно сделать снимки экрана из видеопотока rtmp или http. Я хочу делать снимок экрана каждые 10 секунд и сохранять его в виде файла png или jpg.

Я не смог найти никаких программ, которые делают это для меня, поэтому я подумал о написании приложения на C# с использованием библиотеки из: http://www.broccoliproducts.com/softnotebook/rtmpclient/rtmpclient.php

К сожалению, похоже, что библиотека rtmpClient захватывает только потоки rtmp и сохраняет их в файл FLV, а это не то, что мне нужно. Кто-нибудь, кто знает какие-нибудь лучшие библиотеки, которые могут помочь мне в этом?


person Flatron    schedule 17.10.2012    source источник


Ответы (4)


Я нашел решение проблемы сейчас. Если кто-то хочет знать, я написал небольшую программу, которая использует rtmpdump и ffmpeg для захвата изображения.

    static void Main(string[] args)
    {
        const string rtmpDump = "rtmpdump.exe";
        const string rtmpDumpArguments = "-v -r rtmp://{stream} -o 1.flv -B 1";
        sRunExternalExe(rtmpDump, rtmpDumpArguments);

        const string ffmpeg = "ffmpeg.exe";
        const string ffmpegArguments = "-i 1.flv -ss 00:00:01 -an -r 1 -vframes 1 -s 400x300 -y 1.jpg";
        RunExternalExe(ffmpeg, ffmpegArguments);

        var theFile = new FileInfo("1.flv");
        if (theFile.Exists)
        {
            File.Delete("1.flv");
        }
    }


    public static string RunExternalExe(string filename, string arguments = null)
    {
        var process = new Process();

        process.StartInfo.FileName = filename;
        if (!string.IsNullOrEmpty(arguments))
        {
            process.StartInfo.Arguments = arguments;
        }

        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        process.StartInfo.UseShellExecute = false;

        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardOutput = true;
        var stdOutput = new StringBuilder();
        process.OutputDataReceived += (sender, args) => stdOutput.Append(args.Data);

        string stdError = null;
        try
        {
            process.Start();
            process.BeginOutputReadLine();
            stdError = process.StandardError.ReadToEnd();
            process.WaitForExit();
        }
        catch (Exception e)
        {
            throw new Exception("OS error while executing " + Format(filename, arguments) + ": " + e.Message, e);
        }

        if (process.ExitCode == 0 || process.ExitCode == 2)
        {
            return stdOutput.ToString();
        }
        else
        {
            var message = new StringBuilder();

            if (!string.IsNullOrEmpty(stdError))
            {
                message.AppendLine(stdError);
            }

            if (stdOutput.Length != 0)
            {
                message.AppendLine("Std output:");
                message.AppendLine(stdOutput.ToString());
            }

            throw new Exception(Format(filename, arguments) + " finished with exit code = " + process.ExitCode + ": " + message);
        }
    }

    private static string Format(string filename, string arguments)
    {
        return "'" + filename +
            ((string.IsNullOrEmpty(arguments)) ? string.Empty : " " + arguments) +
            "'";
    }
person Flatron    schedule 17.10.2012
comment
Спасибо. Похоже, что эта команда rtmpdump загружает секунду видео, прежде чем ffmpeg берет кадр из этого второго длинного видео. Не похоже, чтобы rtmpdump поддерживал загрузку только одного видеокадра, но я думаю, что это возможно, изменив источник rtmpdump на остановку после первого пакета VIDEODATA: adobe.com/content/dam/Adobe/en/devnet/flv/pdfs/ - person Andrew Smart; 03.06.2016

Вы можете использовать bash, если вы работаете в Linux (это может быть неприменимо к вам, но, надеюсь, поможет любому поиску в Google), вот как я использую его для нашего потокового продукта, используя «rtmpdump» (apt-get install rtmpdump):

/скрипты/rtmpsnapshot

#!/bin/bash
rtmpdump --live --timeout=9 -r $1 -a $2 -y $3  --stop 1 -o - | avconv -i - -s 720x404 -vframes 1 $4

называется так:

/scripts/rtmpsnapshot rtmp://myserver.com/applicationname/ applicationname streamname /tmp/mysnapshot.jpg
person Ashley Hindle    schedule 20.03.2013

Вы смотрели SnagIt! v11.1? Я только что обновил свою копию, и она будет захватывать видеопотоки и связанный с ними звук.

Я не знаю насчет снимка экрана каждые 10 секунд, но я знаю, что он имеет встроенные возможности таймера и возможность изолировать отдельные кадры.

Может стоит посмотреть. Я думаю, что это идет с 30-дневной пробной версией.

person Randy Minder    schedule 17.10.2012

Если вы используете Windows 7, она поставляется с инструментом для создания фрагментов экрана.

person Icemanind    schedule 17.10.2012
comment
@Default — это инструмент Snippet, который можно найти в разделе «Аксессуары». - person Icemanind; 18.10.2012
comment
@icemanind: На моем компьютере это называется Snipping tool. Но как настроить этот инструмент на создание снимка экрана каждые 10 секунд? Или ОП должен каждый раз щелкать и перетаскивать за себя? - person Patrick; 18.10.2012
comment
@Patrick: я не думаю, что вы можете настроить его для автоматического создания снимков экрана. Вы должны были бы сделать это вручную. - person Icemanind; 18.10.2012