目标是在后台工作器的DoWork事件中控制帧提取速度。
我尝试了Thread.Sleep(),但它会抛出异常。
这就是我想做的事情。它在上面和下面都有描述。
using Accord.Video;
using Accord.Video.FFMPEG;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
using (var vFReader = new VideoFileReader())
{
vFReader.Open(@"C:\Users\Chocolade 1972\Downloads\MyVid.mp4");
trackBar1.Maximum = (int)vFReader.FrameCount;
}
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
using (var vFReader = new VideoFileReader())
{
vFReader.Open(@"C:\Users\Chocolade 1972\Downloads\MyVid.mp4");
for (var i = 0; i < vFReader.FrameCount; i++)
{
backgroundWorker1.ReportProgress(0, vFReader.ReadVideoFrame());
}
// Not sure that this would be required as it might happen implicitly at the end of the 'using' block.
vFReader.Close();
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pictureBox1.Image?.Dispose();
pictureBox1.Image = (Image)e.UserState;
}
private void Form1_Resize(object sender, EventArgs e)
{
label1.Text = this.Size.ToString();
}
}
它运行良好,但速度太快了。我该如何使用计时器或其他允许我控制帧提取速度的东西?
VideoFileWriter类可以使用指定的编解码器(枚举)、比特率和帧大小来初始化视频输出。然后你可以为每一帧写入一个缓冲区(字节数组)。所以你可以从两个视频文件中提取帧(如此示例所示),确保所有帧都使用相同的大小(必要时重新采样),然后以任意顺序写入帧。使用ImageConverter类将位图转换为字节数组。试一下,如果结果与预期不符,请提问。 - JimiWaitForNextTickAsync()明显是异步的。或者使用多媒体定时器。 - JimiWaitForNextTickAsync()明显是异步的。或者使用多媒体定时器。 - undefined