文章2:
最近完成了这个小Demo,来分享一下!
上面给了我两天时间,来完成这个小功能
于时我花了半天时间从网络上到处鄱资料,又花了半天时间调试代码,成功之后,终于有了以下一点的经验之谈:
这里讲一下重要的:
1.用到两个工具,一个是ffmpeg.exe,另一个是mencoder.exe
ffmpeg最新版本的下载地址:http://ffdshow.faireal.net/mirror/ffmpeg/
Mencoder新版本的下载地址:http://www5.mplayerhq.hu/MPlayer/releases/win32/
这里有一个重点,网上的文章都没讲到,所以造成有些人运行后没反应,原因是上面路径的下载,有很多版本,不同的版本可能个别参数不同,而网上的文章所用的参数都是用很早的版本写的,所以会造成运行后因参数错误而没有效果
简单处理是:把网上参数在cmd命令行执行一下,这时命令行会报哪个参数错误,把它删了即可!
2.判断处理成功与失败或是进度是否完成,从异步获取的输出信息判断[包括获取原视频的宽与高]
这里重点在两个委托事件中,详情见以下几行代码
-
private void StartProcess(string tool)
-
{
-
StartProcess(tool, false);
-
}
-
private void StartProcess(string tool,bool onlyCheckInfo)
-
{
-
System.Diagnostics.Process p = new System.Diagnostics.Process();
-
p.StartInfo.FileName = tool;
-
p.StartInfo.Arguments = commandPara;
-
p.StartInfo.UseShellExecute = false;
-
p.StartInfo.RedirectStandardInput = true;
-
p.StartInfo.RedirectStandardOutput = true;
-
p.StartInfo.RedirectStandardError = true;
-
p.StartInfo.CreateNoWindow = false;
-
p.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(p_OutputDataReceived);
-
if (onlyCheckInfo)
-
{
-
p.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(p_CheckInfoDataReceived);
-
}
-
else
-
{
-
p.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(p_ErrorDataReceived);
-
}
-
-
try
-
{
-
p.Start();
-
p.BeginOutputReadLine();
-
p.BeginErrorReadLine();
-
p.WaitForExit();
-
}
-
catch (Exception err)
-
{
-
Console.WriteLine(err.Message);
-
}
-
finally
-
{
-
p.Close();
-
}
-
}
-
void p_CheckInfoDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
-
{
-
if (!string.IsNullOrEmpty(e.Data))
-
{
-
if (e.Data.Contains("Stream") && e.Data.Contains("Video:"))
-
{
-
Match match = Regex.Match(e.Data, @", (\d+)x(\d+)");
-
if (match != null)
-
{
-
videoWidth = match.Groups[1].Value;
-
videoHeight = match.Groups[2].Value;
-
}
-
}
-
else if (e.Data.Contains("could not find codec parameters"))
-
{
-
isCanChangeToFlv = false;
-
Program.SetDataBase(id, 1, count + 1);
-
}
-
}
-
-
}
-
-
void p_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
-
{
-
if (!string.IsNullOrEmpty(e.Data))
-
{
-
if (e.Data.Contains("video:") && e.Data.Contains("muxing overhead"))
-
{
-
Program.SetDataBase(id, 2, count + 1);
-
Console.WriteLine("转换完成");
-
}
-
Console.WriteLine(e.Data);
-
}
-
-
}
-
-
void p_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
-
{
-
if (!string.IsNullOrEmpty(e.Data))
-
{
-
if (e.Data.Contains("Writing index"))
-
{
-
Program.SetDataBase(id, 2, count + 1);
-
Console.WriteLine("转换完成");
-
}
-
-
-
-
-
Console.WriteLine(e.Data);
-
}
-
}
private void StartProcess(string tool)
{
StartProcess(tool, false);
}
private void StartProcess(string tool,bool onlyCheckInfo)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = tool;
p.StartInfo.Arguments = commandPara;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = false;
p.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(p_OutputDataReceived);
if (onlyCheckInfo)//只检测文件是否可转换与获到内部宽与高
{
p.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(p_CheckInfoDataReceived);
}
else
{
p.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(p_ErrorDataReceived);
}
//开始执行
try
{
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
finally
{
p.Close();
}
}
void p_CheckInfoDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
if (e.Data.Contains("Stream") && e.Data.Contains("Video:"))//设置原视频窗口大小作为flv视频的宽与高
{
Match match = Regex.Match(e.Data, @", (\d+)x(\d+)");
if (match != null)
{
videoWidth = match.Groups[1].Value;
videoHeight = match.Groups[2].Value;
}
}
else if (e.Data.Contains("could not find codec parameters"))//ffmpeg转换失败
{
isCanChangeToFlv = false;
Program.SetDataBase(id, 1, count + 1);
}
}
}
void p_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
if (e.Data.Contains("video:") && e.Data.Contains("muxing overhead"))//ffmpeg转换完成
{
Program.SetDataBase(id, 2, count + 1);
Console.WriteLine("转换完成");
}
Console.WriteLine(e.Data);
}
}
void p_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
if (e.Data.Contains("Writing index"))//mencoder转换完成
{
Program.SetDataBase(id, 2, count + 1);
Console.WriteLine("转换完成");
}
//else if (e.Data.Contains("Exiting"))//mencoder转换失败
//{
// Console.WriteLine("转换失败");
//}
Console.WriteLine(e.Data);
}
}
本文只讲重点,请结合网络其它文章与本文即可!
文章3:
Youtube的成功,使得国内的视频网站如雨后春笋般的冒出来,前不久朋友叫我帮他写一个将各种视频格式转换成flv的程序,这里就将编写程序遇到困难和获得的经验拿出来和大家分享一下。 1、使用引擎:ffmpeg + Mencoder 2、ffmpeg最新版本的下载地址:http://ffdshow.faireal.net/mirror/ffmpeg/ Mencoder新版本的下载地址:http://www5.mplayerhq.hu/MPlayer/releases/win32/ 3、转换速度比较:总体上ffmpeg转换的速度快于Mencoder 4、转换格式要求:rm、rmvb、r
Youtube的成功,使得国内的视频网站如雨后春笋般的冒出来,前不久朋友叫我帮他写一个将各种视频格式转换成flv的程序,这里就将编写程序遇到困难和获得的经验拿出来和大家分享一下。
1、使用引擎:ffmpeg + Mencoder
2、ffmpeg最新版本的下载地址:http://ffdshow.faireal.net/mirror/ffmpeg/
Mencoder新版本的下载地址:http://www5.mplayerhq.hu/MPlayer/releases/win32/
3、转换速度比较:总体上ffmpeg转换的速度快于Mencoder
4、转换格式要求:rm、rmvb、rt格式的文件只能用Mencoder转换,出于速度考虑我基本上都用ffmpeg转换,所以Mencoder能转换的格式我没有详细测试(哪个朋友知道,麻烦你告诉我下,我补充上去)。
5、纯音频格式只能用Mencoder进行转换。如何判断是否是纯音频格式可以通过使用命令 FFmpeg -i "文件的完整路径" 获得输出后就可以分析出来。
6、.mov格式的用ffmpeg转换出来的效果比较差,建议用Mencoder进行转换,wmv8用ffmpeg经常会有花屏产生建议用Mencoder。
7、视频按比率输出的问题:必须先获取源视频文件的宽度和高度(也是通过 FFmpeg -i "文件的完整路径" 获得输出后就可以分析出来)根据这个高度和宽度的比率来设定输出文件的尺寸。
8、可能的难点:因为这ffmpeg 和 Mencoder都是命令行工具(当然你也可以下载源代码自己修改成com之类的),在C#只能用Process调用,前面我提过要获得输出信息(获取视频相关信息、获取当前的转换进度、获取什么时候完成转换),必须设置process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true;然后必须通过异步编程的方式获取Process.StandardOutput和Process.StandardError的值,相关说明可以见(ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html /frlrfSystemDiagnosticsProcessClassStandardOutputTopic.htm)(必须安装了msdn的才能看)。
本文旨在帮助大家少走一些弯路,并不提供实际的解决方案及相关的源码下载。