C#指定的可执行文件不是此OS平台的有效应用程序

时间:2015-04-19 19:02:24

标签: c# asp.net multithreading video ffmpeg

我为我的学士学位制作了一个视频共享应用程序(像youtube一样)(该项目是在asp.net网页上完成的) 我想将用户上传的任何视频转换为mp4。为此我使用Nreco ffmpeg包装器为asp。

我在本地做这一切,这个项目没有上线。

视频转换是在一个单独的线程中完成的。

protected void Upload_Click(object sender, EventArgs e)
{
//File Uploads to Server
Thread t1 = new Thread(
unused => compressVideo(Video_Path, Final_Path,User_id)
);
t1.Start();
}

public static void compressVideo(string Video_Path, string Final_Path,string UID)
{
    var ffMpeg = new NReco.VideoConverter.FFMpegConverter();
    ffMpeg2.ConvertProgress += (o, args) =>
        {
            //SignalR calls.Doing this to update the ui
        };

    ffMpeg.ConvertMedia(Video_Path, Final_Path, NReco.VideoConverter.Format.mp4);
}

我第一次这样做一切都很好,没有一个问题。 两周后,在不修改此页面后,我再次尝试,应用程序抛出此异常:

  

未处理的类型' System.ComponentModel.Win32Exception'   发生在NReco.VideoConverter.dll

     

其他信息:指定的可执行文件无效   该OS平台的应用程序。

就行:

ffMpeg.ConvertMedia(Video_Path, Final_Path, NReco.VideoConverter.Format.mp4);

如果我调用ffMpeg.ConvertMedia(),则不会抛出异常并且代码按预期工作。所以我猜测它与threads有关。但这并不是全部。 在搞乱代码试图解决这个并且没有成功之后我恢复原始代码。在最后一次尝试中我再次尝试(使用原始代码)并且应用程序给出了构建错误。

  

尝试访问已卸载的appdomain。

我对代码所做的任何修改都被忽略了,编译时我总是遇到错误。 在休息五分钟后冷静下来,我再次尝试。它神奇地修复了自己。构建错误消失了,甚至转换工作正常。

但梦想并没有持续很长时间。几分钟后,转换线程又开始抛出同样的异常。 我无法复制相同的结果。

我在asp.net网页表单和网页设计方面的经验和知识相当低,所以请尽量保持答案。

2 个答案:

答案 0 :(得分:0)

您是否尝试卸载NReco.VideoConverter NuGet包并重新安装?您所使用的代码 - 它似乎是包库的一个问题,可能会通过重新安装来解决。

答案 1 :(得分:0)

由于视频转换在同步调用中运行良好且稳定(仅来自Upload_Click处理程序的ConvertMedia),我可能会提出以下原因:您已在t1.Start()的新主题中开始转换,但我不知道看到任何等待线程结束的代码。结果当前请求处理已完成,但转换线程仍可以运行并引发ConvertProgress事件(可以访问已完成的请求的对象)。根据情况(例如,asp.net应用程序重启/回收),转换可能会在"尝试访问已卸载的应用程序域"或其他错误。

如果您想在后台执行asp.net应用程序的转换过程,您可以使用HostingEnvironment.QueueBackgroundWorkItem(仅适用于.NET framework 4.5.2或更高版本)或组织您自己的后台队列(例如,创建新的& #34;转换任务"在数据库表中执行转换,由特殊工作人员实现转换为Windows服务或控制台应用程序,定期启动Windows Scheduler)。