Memory 如何解决Accord.Video.FFMPEG内存泄漏问题
我正在开发一个数字广告牌应用程序,允许客户在触摸屏上来回点击 屏幕0->触摸->屏幕1->触摸->屏幕2->超时->屏幕0 如果没有交互,屏幕0将无限循环。每个屏幕都运行自己的MP4文件 但是,对于Screen 1的每个运行周期,它都会占用内存,应用程序很快就会崩溃 是因为VideoFileSource的视频对象未被正确处理,还是因为video_NewFrame中存在线程问题 因为我偶尔会遇到这样的错误——“在创建windows句柄之前,无法对控件调用Invoke或BeginInvoke” 我正在使用VS2017.NET Framework 4.5和Accord.NET 3.8版的Accord.Video.FFMPEG 屏幕0 MP4大小-5.5MB 屏幕1 MP4大小-5.6MB 屏幕2 MP4尺寸-7.0MB 这是我的密码:-Memory 如何解决Accord.Video.FFMPEG内存泄漏问题,memory,ffmpeg,mp4,Memory,Ffmpeg,Mp4,我正在开发一个数字广告牌应用程序,允许客户在触摸屏上来回点击 屏幕0->触摸->屏幕1->触摸->屏幕2->超时->屏幕0 如果没有交互,屏幕0将无限循环。每个屏幕都运行自己的MP4文件 但是,对于Screen 1的每个运行周期,它都会占用内存,应用程序很快就会崩溃 是因为VideoFileSource的视频对象未被正确处理,还是因为video_NewFrame中存在线程问题 因为我偶尔会遇到这样的错误——“在创建windows句柄之前,无法对控件调用Invoke或BeginInvoke” 我正
Bitmap image;
VideoFileSource video;
int screenIdx = 0;
bool enableClicking = true;
bool isTimeOut = false;
string VideoPath = @"d:\KioskApp\Bkgrnd\"
public frmMain()
{
InitializeComponent();
StartFirstScreen();
tmrScreen01.Interval = 10000;
tmrScreen02.Interval = 10000;
}
private void StartFirstScreen()
{
try
{
string fileName = VideoPath + Screen00();
video = new VideoFileSource(fileName);
video.PlayingFinished += new Accord.Video.PlayingFinishedEventHandler(video_Finished);
video.NewFrame += new Accord.Video.NewFrameEventHandler(video_NewFrame);
video.Start();
screenIdx = 1;
}
catch (Exception ex)
{
string strErrMsg = strMsg + " - " + ex.Message;
MessageBox.Show(strErrMsg);
}
}
private void video_NewFrame(object sender, Accord.Video.NewFrameEventArgs eventArgs)
{
try
{
Invoke(new Action(() =>
{
System.Drawing.Image OldImage;
OldImage = pictureBox1.Image;
pictureBox1.Image = AForge.Imaging.Image.Clone(eventArgs.Frame);
if (OldImage != null)
OldImage.Dispose();
}));
}
catch (Exception ex)
{
var strErrMsg = "video_NewFrame - " + ex.Message;
MessageBox.Show(strErrMsg);
}
}
private void video_Finished(object sender, Accord.Video.ReasonToFinishPlaying reason)
{
try
{
if (screenIdx == 1)
{
video.PlayingFinished -= video_Finished;
video.NewFrame -= video_NewFrame;
video = null;
StartFirstScreen();
return;
}
enableClicking = true;
}
catch (Exception ex)
{
var strErrMsg = "video_Finished - " + ex.Message;
MessageBox.Show(strErrMsg);
}
}
void startLastScreen()
{
string fileName = string.Empty;
video.SignalToStop();
fileName = VideoPath + Screen02();
screenIdx = 0;
if (object.ReferenceEquals(null, video))
{
video = new VideoFileSource(fileName);
}
else
{
video = null;
video = new VideoFileSource(fileName);
}
video.PlayingFinished += new Accord.Video.PlayingFinishedEventHandler(video_Finished);
video.NewFrame += new Accord.Video.NewFrameEventHandler(video_NewFrame);
video.Start();
enableClicking = false;
}
private void pictureBox1_Click(object sender, EventArgs e)
{
if (!enableClicking && screenIdx != 1) return;
tmrScreen01.Stop();
tmrScreen02.Stop();
// Check clickable area before allow to proceed to the next screen
string fileName = string.Empty;
video.SignalToStop();
video.Stop();
if (screenIdx == 0)
{
fileName = VideoPath + Screen00();
screenIdx = 1;
}
else if (screenIdx == 1)
{
fileName = VideoPath + Screen01();
screenIdx = 2;
}
else if (screenIdx == 2)
{
fileName = VideoPath + Screen02();
screenIdx = 0;
}
if (object.ReferenceEquals(null, video))
{
video = new VideoFileSource(fileName);
}
else
{
video = null;
video = new VideoFileSource(fileName);
}
video.PlayingFinished += new Accord.Video.PlayingFinishedEventHandler(video_Finished);
video.NewFrame += new Accord.Video.NewFrameEventHandler(video_NewFrame);
enableClicking = false;
isTimeOut = false;
video.Start();
}