Вопрос по image, stdin, binarywriter, ffmpeg, c# – Более быстрый способ записи изображения в Process.StandardInput.BaseStream

5

Я пытаюсь отправить много захваченных на рабочем столе изображений в стандартный кодировщик (FFmpeg).

Следующий пример кода работает.

CaptureScreen() Функция выдает изображение за 5-10 мс.

Если я сохраню изображение в MemoryStream, это почти не займет времени.

But I can only save 1 image every 45 ms to proc.StandardInput.BaseStream.

public void Start(string bitrate, string buffer, string fps, string rtmp, string resolution, string preset)
{
    proc.StartInfo.FileName = myPath + "\\ffmpeg.exe";
    proc.StartInfo.Arguments = "-f image2pipe -i pipe:.bmp -vcodec libx264 -preset " + preset + " -maxrate " + bitrate + "k -bufsize " +
    buffer + "k -bt 10 -r " + fps + " -an -y test.avi"; //+ rtmp;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardInput = true;
    proc.StartInfo.RedirectStandardOutput = true;

    proc.Start();

    Stopwatch st = new Stopwatch();
    BinaryWriter writer = new BinaryWriter(proc.StandardInput.BaseStream);
    System.Drawing.Image img;

    st.Reset();
    st.Start();

    for (int z = 0; z < 100; z++)
    {
        img = ScrCap.CaptureScreen();
        img.Save(writer.BaseStream, System.Drawing.Imaging.ImageFormat.Bmp);
        img.Dispose();
    }

    st.Stop();
    System.Windows.Forms.MessageBox.Show(st.ElapsedMilliseconds.ToString());
}

Вопрос в том:

Могу ли я сделать процесс сохранения быстрее?

Я пытаюсь получить стабильный 60 кадров в секунду таким образом

Я попробовал это. Это даже медленнее ... как 130 мс Hasibii
Вы пытались использоватьImageFormat.png Таким образом, фактическое количество данных, читаемых / записываемых, уменьшается? PhonicUK

Ваш Ответ

1   ответ
2

что ffmpeg читает данные с той же скоростью, что и сжимает их в .avi, что медленно. Так что вашиimg.Save метод блокируется до тех пор, пока в буфере потока не будет места для записи его данных.

Там не так много, вы можете сделать. Сжатие HD-видео со скоростью 60 кадров в секунду в режиме реального времени требует огромной вычислительной мощности.

это должно быть отправка его в ffmpeg .. я попытался записать th bmp в другой поток, и это заняло почти нет времени. Может ли быть быстрее использовать именованный канал? Hasibii
это не так много, к сожалению Hasibii
Хорошо. Может быть, вы можете попробовать обернутьwriter.BaseStream вBufferedStream чтобы облегчить вещь.
Вы должны выяснить, что блокирует цепь. Захват изображения? Кодировать это в BMP? Отправлять его в ffmpeg? Сжимать его в .avi? Записать получившееся видео на жесткий диск?
Есть ли способ сказать ffmpeg, чтобы ускорить процесс? Я имею в виду, что это должно быть возможно, потому что в прошлом я делал hd в режиме реального времени 60 кадров в секунду, а ffmpeg использует только 7% мощности процессора. Hasibii

Похожие вопросы