clinnebur
New member
We have an ASP.NET web application (C#) that copies videos from a CCTV truck to a Linux server. What I am trying to do is convert the .AVI videos(which is how they are created on the truck) to .WMV in my C# code using Windows Media Encoder. I have a virtual directory to the truck location of the videos. I also have a virtual directory created to the Linux box. The application resides on a Windows Server 2003 and I am using VS 2005, .NET framework 2.0. The method calling the conversion function uses impersonation and all virtual directories are set up to connect with the impersonated user. When I use the application to copy the videos without converting, it works perfectly. When I try to implement the conversion code I receive the following error:
Attempted to read or write protected memory. This is often an indication that other memory has been corrupted
The line that fails is: m_Encoder.PrepareToEncode(true);
I have been Googling this error for days now and have found few solutions. I have tried some of the solutions I did manage to find, but nothing has helped. Im thinking its a permissions issue, but I cant figure out what! Any help would be greatly appreciated and please let me know if you need any more information. I am totally new to WME so I could even be doing this all wrong!
Thanks in Advance,
Carmen
Here is the code Im using for the conversion and then the method where I am calling the ConvertFile function:
Attempted to read or write protected memory. This is often an indication that other memory has been corrupted
The line that fails is: m_Encoder.PrepareToEncode(true);
I have been Googling this error for days now and have found few solutions. I have tried some of the solutions I did manage to find, but nothing has helped. Im thinking its a permissions issue, but I cant figure out what! Any help would be greatly appreciated and please let me know if you need any more information. I am totally new to WME so I could even be doing this all wrong!
Thanks in Advance,
Carmen
Here is the code Im using for the conversion and then the method where I am calling the ConvertFile function:
Code:
private static string ConvertFile(string mediaFile)
{
UtilDaoOracle oraDao = new UtilDaoOracle();
oraDao.LogError(mediaFile, "ConvertFile", 500321);
WMEncoder m_Encoder = new WMEncoder();
IWMEncSourceGroup SrcGrp = (IWMEncSourceGroup)m_Encoder.SourceGroupCollection.Add("SG_1");
IWMEncVideoSource SrcVid = (IWMEncVideoSource)SrcGrp.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO);
SrcVid.SetInput(mediaFile, "", "");
const string ProfileName = "Screen Video Medium (CBR)";
foreach (IWMEncProfile aProfile in m_Encoder.ProfileCollection)
{
if (aProfile.Name == ProfileName)
{
SrcGrp.set_Profile(aProfile);
oraDao.LogError(aProfile.Name.ToString(), "ConvertFileLoop", 500321);
break;
}
}
m_Encoder.File.LocalFileName = Regex.Replace(mediaFile, ".avi", ".wmv");
oraDao.LogError(m_Encoder.File.LocalFileName, "ConvertFileREturn", 500321);
m_Encoder.AutoStop = true;
try
{
m_Encoder.PrepareToEncode(true);
}
catch (Exception exp)
{
oraDao.LogError(exp.Message, "Preparetoencode", 500321);
m_Encoder.Flush();
}
try
{
m_Encoder.Start();
}
catch (Exception exp)
{
oraDao.LogError(exp.Message, "encoderstart", 500321);
m_Encoder.Flush();
}
return m_Encoder.File.LocalFileName;
}
Code:
private static bool CopyFile(string srcDir, string destDir, string fileName, bool ignoreIfInParentDir)
{
UtilDaoOracle oraDao = new UtilDaoOracle();
FileInfo destFile = new FileInfo(CombinePath(destDir, fileName));
//Only copy if the file does not already exist.
if (!destFile.Exists)
{
if (ignoreIfInParentDir && File.Exists(CombinePath(destFile.Directory.Parent.FullName, fileName)))
{
// Return if the files already exists in the parent directory.
return false;
}
FileInfo srcFile = new FileInfo(CombinePath(srcDir, fileName));
if (srcFile.Exists)
{
// Create the destination directory if not there already.
if (!destFile.Directory.Exists)
{
destFile.Directory.Create();
}
if (srcFile.Extension == ".avi")
{
string convertedFile = ConvertFile(srcFile.ToString());
FileInfo convertedFileDone = new FileInfo(convertedFile);
convertedFileDone.CopyTo(destFile.FullName);
}
else
{
srcFile.CopyTo(destFile.FullName);
}
return true;
}
else
{
Logger.LogWarning(string.Format("Source file not found on machine: {0}", srcFile.FullName));
}
}
return false;
}