如何解决如何解决 Accord.Video.FFMPEG 内存泄漏问题
我正在开发一个数字广告牌应用程序,允许客户点击触摸屏来回切换。
屏幕 0 -> 触摸 -> 屏幕 1 -> 触摸 -> 屏幕 2 -> 超时 -> 屏幕 0
如果没有交互发生,屏幕 0 将无限循环。每个屏幕都在运行自己的 MP4 文件。
但是,对于屏幕 1 的每个运行周期,它都会占用内存并且应用程序很快就会崩溃。
是因为 VideoFileSource 的视频对象没有被正确处理还是因为 video_NewFrame 中的一些线程问题?
因为我偶尔会收到此错误 - “在创建 Windows 句柄之前,无法在控件上调用 Invoke 或 BeginInvoke”
我使用 VS2017 .NET Framework 4.5 和 Accord.Video.FFMPEG by Accord.NET version 3.8
屏幕 0 MP4 大小 - 5.5MB 屏幕 1 MP4 大小 - 5.6MB 屏幕 2 MP4 大小 - 7.0MB
这是我的代码:- ...
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();
}
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。