FFplay successfully moved inside my Winform, how to set it borderless?

我只是一个虾纸丫 提交于 2019-12-04 15:12:54

问题


with this code: Show a tcp video stream (from FFPLAY / FFMPEG) in an C# application

I successfully grabbed FFmpeg output inside my c# winform. By changing args is also possible to play video directly (without streaming)... here my complete (short) code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Drawing.Text;
using System.Text.RegularExpressions;
using System.Configuration;
using Microsoft.Win32;
using System.Windows.Forms.VisualStyles;

namespace xFFplay
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        [DllImport("user32.dll")]
        private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);


        //Process ffplay = null;

        public Form1()
        {
            InitializeComponent();
            Application.EnableVisualStyles();
            this.DoubleBuffered = true;
        }

        public Process ffplay = new Process();
        private void xxxFFplay()
        {
            // start ffplay 
            /*var ffplay = new Process
            {
                StartInfo =
                {
                    FileName = "ffplay.exe",
                    Arguments = "Revenge.mp4",
                    // hides the command window
                    CreateNoWindow = true,
                    // redirect input, output, and error streams..
                    //RedirectStandardError = true,
                    RedirectStandardOutput = true,
                    UseShellExecute = false
                }
            };
             * */
                //public Process ffplay = new Process();
                ffplay.StartInfo.FileName = "ffplay.exe";
                ffplay.StartInfo.Arguments = "Revenge.mp4";
                ffplay.StartInfo.CreateNoWindow = true;
                ffplay.StartInfo.RedirectStandardOutput = true;
                ffplay.StartInfo.UseShellExecute = false;

            ffplay.EnableRaisingEvents = true;
            ffplay.OutputDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay");
            ffplay.ErrorDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay");
            ffplay.Exited += (o, e) => Debug.WriteLine("Exited", "ffplay");
            ffplay.Start();

            Thread.Sleep(500); // you need to wait/check the process started, then...

            // child, new parent
            // make 'this' the parent of ffmpeg (presuming you are in scope of a Form or Control)
            SetParent(ffplay.MainWindowHandle, this.Handle);

            // window, x, y, width, height, repaint
            // move the ffplayer window to the top-left corner and set the size to 320x280
            MoveWindow(ffplay.MainWindowHandle, 0, 0, 320, 280, true);
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            xxxFFplay();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            try { ffplay.Kill(); }
            catch { }
        }
    }
}

Unfortunately the FFmpeg output is with a standard BorderType but i need to have it borderless or, at least, without title bar and Minimize/Maximize/Close button.

I really don't know Handles but as i can see i have a complete handle to the window:

MoveWindow(ffplay.MainWindowHandle, 0, 0, 320, 280, true);

Well, there is an easy way to remove FFplay borders?

Thanks for your patience, i moved from Mplayer (super-easy to encapsulate inside WinForms) because it seem to be less compatible with certain files...

Edit: I allready checked for FFplay options but there is not a 'borderless' one.


回答1:


ffplay allows borderless windows with the -noborder option (as of commit 15d7e31).




回答2:


Change this line:

ffplay.StartInfo.Arguments = "-noborder Revenge.mp4";



回答3:


Cannot change BorderStyle? No problem, let's hide it!!

I solved by handle a Panel.... Yes a panel instead of the form... with negative positions the job is done ;-) We can now leave our media player borderless (by fulfilling the panel) or we may draw a cool personalized border with photoshop :-)

SetParent(ffplay.MainWindowHandle, this.panel1.Handle);
MoveWindow(ffplay.MainWindowHandle, -5, -30, 320, 280, true);

I know, it's only a trick but the result is totally compatible with the main question!



来源:https://stackoverflow.com/questions/31465630/ffplay-successfully-moved-inside-my-winform-how-to-set-it-borderless

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