Search code examples
c#ffmpegstreamsetparent

Passing ffmpeg stream to c# window


Is it possible to pass FFMPEG video stream to C# window? Now it opens as new process in new window, I just simply want to pass it to my own SessionWindow. At this moment I execute ffplay like this:

public void ExecuteCommandSync(String command, String args)
{
    try
    {
        System.Diagnostics.ProcessStartInfo procStartInfo =
         new System.Diagnostics.ProcessStartInfo("\"" + command + "\"", args);

        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.UseShellExecute = false;

        procStartInfo.CreateNoWindow = true;

        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo = procStartInfo;
        proc.Start();

        string result = proc.StandardOutput.ReadToEnd();

        Debug.WriteLine(result);
    }
    catch (Exception objException)
    {

    }
}

private void button2_Click(object sender, EventArgs e)
{
    String runPlay = @"C:\FFMPEG\bin\ffplay.exe";
    String Random = "udp://127.0.0.1:1234";

    this.ExecuteCommandSync(runPlay, Random);
}

PS. I don't want to use Windows Media Player since I want this app to look and work like remote desktop.


Solution

  • Looks like I found answer.

     Process ProcFFplay = new Process();
            ProcFFplay.StartInfo.FileName = @"C:\FFMPEG\bin\ffplay.exe";
            ProcFFplay.StartInfo.Arguments = @"-probesize 32 udp://192.168.88.228:12340";
            ProcFFplay.StartInfo.CreateNoWindow = true;
            ProcFFplay.StartInfo.RedirectStandardOutput = true;
            ProcFFplay.StartInfo.UseShellExecute = false;
            ProcFFplay.EnableRaisingEvents = true;
            ProcFFplay.OutputDataReceived += (o, k) => Debug.WriteLine(k.Data ?? "NULL", "ffplay");
            ProcFFplay.ErrorDataReceived += (o, k) => Debug.WriteLine(k.Data ?? "NULL", "ffplay");
            ProcFFplay.Exited += (o, k) => Debug.WriteLine("Exited", "ffplay");
            ProcFFplay.Start();
            Thread.Sleep(4500);//this is time which you need to wait to get first frames approximately
            SetParent(ProcFFplay.MainWindowHandle, this.panel1.Handle);
            MoveWindow(ProcFFplay.MainWindowHandle, -5, -30, 1200, 800, true); //these parameteres may look weird but you hide top "stripe" using them.
    

    Enjoy.