在 C# 中同时显示 4 个视频
showing 4 video at same time in c#
我想使用任务在 Windows 表单中同时显示 4 个视频。我有 4 次视频播放点击。当我点击第一个视频播放按钮时,第一个视频播放,当我点击第二个视频播放按钮时,第二个视频播放和第一个视频同时继续播放。 但是,当我点击第三个视频播放按钮时;第一个视频停止,第二个视频和第三个视频同时播放。同样,当我点击第四个视频播放按钮时,第二个视频停止,同时播放第三个和第四个视频。
我的代码:
private async void play1_Click(object sender, EventArgs e)
{
string inputPath = textBox1.Text;
await Task.Run(() => {
ReadFrames1(inputPath); });
}
和
public void ReadFrames1(string inputPath)
{
using (var vFReader = new VideoFileReader())
{
vFReader.Open(inputPath);
for (int i = 0; i < vFReader.FrameCount; i++)
{
Bitmap videoFrame = vFReader.ReadVideoFrame();
System.Drawing.Image pic = resizeImage(new Bitmap(videoFrame), new Size(305, 267));
pictureBox1.Image = new Bitmap(pic);
}
vFReader.Dispose();
vFReader.Close();
}
}
play2_Click()
、play3_Click()
、play4_Click()
方法同play1_Click()
。 (我的意思是例如 play2_Click()
方法调用 ReadFrames2()
并在 PictureBox2
上显示。)我哪里错了?
对于通过 WinForms 的多线程,使用 BackgroundWorker。
这是一个适合我的代码示例。希望对你有帮助:
public Form1()
{
InitializeComponent();
}
private BackgroundWorker CreateBackgroundWorker()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += ReadFrames;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
return worker;
}
private void worker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
Button playButton = (Button) e.Result;
playButton.Enabled = true;
}
private void ReadFrames(object sender, DoWorkEventArgs e)
{
BackgroundWorker backgroundWorker = (BackgroundWorker) sender;
(string path, PictureBox pictureBox, Button playButton) arguments = ((string, PictureBox, Button)) e.Argument;
using(var vFReader = new VideoFileReader())
{
vFReader.Open(arguments.path);
for (int i = 0; i < vFReader.FrameCount; i++)
{
arguments.pictureBox.Image = new Bitmap(vFReader.ReadVideoFrame(), arguments.pictureBox.Size);
}
vFReader.Dispose();
vFReader.Close();
}
e.Result = arguments.playButton;
}
private void play1_Click(object sender, EventArgs e)
{
var worker = CreateBackgroundWorker();
worker.RunWorkerAsync((textBox1.Text, pictureBox1, play1));
play1.Enabled = false;
}
private void play2_Click(object sender, EventArgs e)
{
var worker = CreateBackgroundWorker();
worker.RunWorkerAsync((textBox2.Text, pictureBox2, play2));
play2.Enabled = false;
}
private void play3_Click(object sender, EventArgs e)
{
var worker = CreateBackgroundWorker();
worker.RunWorkerAsync((textBox3.Text, pictureBox3, play3));
play3.Enabled = false;
}
private void play4_Click(object sender, EventArgs e)
{
var worker = CreateBackgroundWorker();
worker.RunWorkerAsync((textBox4.Text, pictureBox4, play4));
play4.Enabled = false;
}
我想使用任务在 Windows 表单中同时显示 4 个视频。我有 4 次视频播放点击。当我点击第一个视频播放按钮时,第一个视频播放,当我点击第二个视频播放按钮时,第二个视频播放和第一个视频同时继续播放。 但是,当我点击第三个视频播放按钮时;第一个视频停止,第二个视频和第三个视频同时播放。同样,当我点击第四个视频播放按钮时,第二个视频停止,同时播放第三个和第四个视频。
我的代码:
private async void play1_Click(object sender, EventArgs e)
{
string inputPath = textBox1.Text;
await Task.Run(() => {
ReadFrames1(inputPath); });
}
和
public void ReadFrames1(string inputPath)
{
using (var vFReader = new VideoFileReader())
{
vFReader.Open(inputPath);
for (int i = 0; i < vFReader.FrameCount; i++)
{
Bitmap videoFrame = vFReader.ReadVideoFrame();
System.Drawing.Image pic = resizeImage(new Bitmap(videoFrame), new Size(305, 267));
pictureBox1.Image = new Bitmap(pic);
}
vFReader.Dispose();
vFReader.Close();
}
}
play2_Click()
、play3_Click()
、play4_Click()
方法同play1_Click()
。 (我的意思是例如 play2_Click()
方法调用 ReadFrames2()
并在 PictureBox2
上显示。)我哪里错了?
对于通过 WinForms 的多线程,使用 BackgroundWorker。
这是一个适合我的代码示例。希望对你有帮助:
public Form1()
{
InitializeComponent();
}
private BackgroundWorker CreateBackgroundWorker()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += ReadFrames;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
return worker;
}
private void worker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
Button playButton = (Button) e.Result;
playButton.Enabled = true;
}
private void ReadFrames(object sender, DoWorkEventArgs e)
{
BackgroundWorker backgroundWorker = (BackgroundWorker) sender;
(string path, PictureBox pictureBox, Button playButton) arguments = ((string, PictureBox, Button)) e.Argument;
using(var vFReader = new VideoFileReader())
{
vFReader.Open(arguments.path);
for (int i = 0; i < vFReader.FrameCount; i++)
{
arguments.pictureBox.Image = new Bitmap(vFReader.ReadVideoFrame(), arguments.pictureBox.Size);
}
vFReader.Dispose();
vFReader.Close();
}
e.Result = arguments.playButton;
}
private void play1_Click(object sender, EventArgs e)
{
var worker = CreateBackgroundWorker();
worker.RunWorkerAsync((textBox1.Text, pictureBox1, play1));
play1.Enabled = false;
}
private void play2_Click(object sender, EventArgs e)
{
var worker = CreateBackgroundWorker();
worker.RunWorkerAsync((textBox2.Text, pictureBox2, play2));
play2.Enabled = false;
}
private void play3_Click(object sender, EventArgs e)
{
var worker = CreateBackgroundWorker();
worker.RunWorkerAsync((textBox3.Text, pictureBox3, play3));
play3.Enabled = false;
}
private void play4_Click(object sender, EventArgs e)
{
var worker = CreateBackgroundWorker();
worker.RunWorkerAsync((textBox4.Text, pictureBox4, play4));
play4.Enabled = false;
}