C# 如何在 Libvlcsharp videoview 对象上绘制覆盖层?

问题描述 投票:0回答:1

我需要在我的视频上写一些 OSD 信息 我使用 libvlcsharp 和 videoview 来播放我的视频。 我看到当我播放视频时,我无法访问视频位图来在其上绘制一些图形 这是我的代码和结果 感谢您的帮助:)

   public partial class Form1 : Form
    {
        private LibVLC libVLC;
        private MediaPlayer mediaPlayer;

        public Form1()
        {
            InitializeComponent();
            libVLC = new LibVLC();
            mediaPlayer = new MediaPlayer(libVLC);
            var myMedia = new Media(libVLC, new Uri(@"C:\ffmpeg\Sample.mp4"));
            mediaPlayer.Media = myMedia;
            videoView1.MediaPlayer = mediaPlayer;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void cmdPlay_Click(object sender, EventArgs e)
        {
            if (videoView1.MediaPlayer.IsPlaying)
            {
                cmdPlay.Text = "Play";
                videoView1.MediaPlayer.Pause();
            }
            else
            {
                cmdPlay.Text = "Pause";
                videoView1.MediaPlayer.Play();
            }
        }

        private void videoView1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawString("Hello", new Font("Arial", 9, FontStyle.Bold), Brushes.White, new Point(10, 10));
        }

        private void cmdDrawOSD_Click(object sender, EventArgs e)
        {
            Graphics g = Graphics.FromHwnd(videoView1.Handle);
            g.DrawString("Hello", new Font("Arial", 9, FontStyle.Bold), Brushes.White, new Point(20, 20));
        }

        private void cmdRewind_Click(object sender, EventArgs e)
        {
            videoView1.MediaPlayer.Stop();
        }
    }

videoview 绘制事件在播放任何视频之前起作用,如果您播放任何视频,此代码不会在屏幕上绘制任何内容

        private void videoView1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawString("Hello", new Font("Arial", 9, FontStyle.Bold), Brushes.White, new Point(10, 10));
        }

我尝试通过此代码访问视频视图图形

            Graphics g = Graphics.FromHwnd(videoView1.Handle);
            g.DrawString("Hello", new Font("Arial", 9, FontStyle.Bold), Brushes.White, new Point(20, 20));

如果你不播放视频,它就可以工作,当你播放视频时,此代码不起作用,你看不到 videoview 对象上发生的任何事情。

Result without play video Result when play video

感谢您的关注

我尝试访问图形句柄,但尚未成功,当视频播放时所有绘图都消失了

c# graphics libvlc libvlcsharp
1个回答
0
投票

为此,您必须使用视频回调,但性能会很差,因为它消除了硬件解码,因此您可以从 CPU 与该位图进行交互。这是一个起点https://github.com/mfkl/libvlcsharp-samples/blob/master/PreviewThumbnailExtractor/Program.cs

为了获得最佳性能,请使用直接使用 direct3d 或 opengl 的等效 libvlc 4 api。

© www.soinside.com 2019 - 2024. All rights reserved.