#c# #ffmpeg
#c# #ffmpeg
Вопрос:
Недавно я хотел попробовать AForge.NET поскольку я обнаружил, что это довольно просто, я решил выполнить простое воспроизведение видео с использованием Video.Из него удалено пространство имен FFMPEG, чтобы я мог поместить каждый кадр непосредственно в PictureBox. Это само по себе работает хорошо, но я хотел удалить каждое изображение после того, как оно не было важным, потому что оно занимало около 1,5 ГБ памяти без видимой причины. Вот где началась моя проблема. По какой-то причине иногда это просто выдает это исключение (обычно при изменении размера окна). Я не совсем уверен, чем это может быть вызвано. Возможно, это действительно глупая ошибка. Я предполагаю, что это могло быть вызвано таймером, но я мог бы сделать совершенно другую ошибку и просто не могу ее увидеть. Это исключение, которое я продолжаю получать:
************** Exception Text **************
System.ArgumentException: Parameter is not valid.
at System.Drawing.Image.get_Width()
at System.Drawing.Image.get_Size()
at System.Windows.Forms.PictureBox.ImageRectangleFromSizeMode(PictureBoxSizeMode mode)
at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
at System.Windows.Forms.Control.WmPaint(Messageamp; m)
at System.Windows.Forms.Control.WndProc(Messageamp; m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Messageamp; m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Messageamp; m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Это код (я понимаю, что общедоступные переменные не годятся, я просто тестирую, конечно):
public long i = 0;
public Bitmap img;
public VideoFileReader reader;
public System.Timers.Timer aTimer;
public void render(object source, ElapsedEventArgs e)
{
if (img != null) img.Dispose();
if (i < reader.FrameCount)
{
img = reader.ReadVideoFrame();
pictureBox1.Image = img;
}
i ;
}
private void button1_Click(object sender, EventArgs e)
{
reader = new VideoFileReader();
aTimer = new System.Timers.Timer();
reader.Open("d:\result.avi");
aTimer.Elapsed = new ElapsedEventHandler(render);
aTimer.Interval = reader.FrameRate;
aTimer.Enabled = true;
}
Ответ №1:
Я думаю, я что-то пропустил, когда дело доходит до таймеров, они, похоже, не работают наилучшим образом для этого случая. Для людей, которые хотели бы использовать AForge.В сети для воспроизведения это может быть решением. Я отключил таймеры и вместо этого использовал BackgroundWorker с секундомером, пока никаких проблем не возникало.
public Image img;
public VideoFileReader reader;
private void button1_Click(object sender, EventArgs e)
{
reader = new VideoFileReader();
reader.Open("d:\result.avi");
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Stopwatch watch = new Stopwatch();
for (i=0;i<reader.FrameCount;i )
{
img = pictureBox1.Image;
pictureBox1.Image = reader.ReadVideoFrame();
if (img != null) img.Dispose();
watch.Start();
while (watch.ElapsedMilliseconds < reader.FrameRate);
watch.Stop();
watch.Reset();
}
}