Faster way to write image to Process.StandardInput.BaseStream

微笑、不失礼 提交于 2019-12-03 13:42:12

问题


Im trying to send a lot of desktop captured images to an encoders (FFmpeg) stdin.

The following code example works.

the CaptureScreen() function provides an image in 5-10 ms.

If I save the image in a MemoryStream it takes almost no time.

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());
}

The question is:

Can I do the saving process faster?

I try to get stable 60 fps this way


回答1:


The bottleneck here is that ffmpeg reads data at the same speed it compresses it to .avi, which is slow. So your img.Save method blocks until there is some space in the stream's buffer to write its data.

There is not much you can do. Compressing 60 fps HD video in real time require a huge processing power.



来源:https://stackoverflow.com/questions/12257939/faster-way-to-write-image-to-process-standardinput-basestream

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!