我需要在我的视频上写一些 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 对象上发生的任何事情。
感谢您的关注
我尝试访问图形句柄,但尚未成功,当视频播放时所有绘图都消失了
为此,您必须使用视频回调,但性能会很差,因为它消除了硬件解码,因此您可以从 CPU 与该位图进行交互。这是一个起点https://github.com/mfkl/libvlcsharp-samples/blob/master/PreviewThumbnailExtractor/Program.cs
为了获得最佳性能,请使用直接使用 direct3d 或 opengl 的等效 libvlc 4 api。