C#调用FFMPEG时路径问题

水晶圣教士 2011-04-20 02:11:35
C#调用FFMPEG转换视频问题

代码如下:

public string gvCommand = "-y -i " + @"E:\Basic\test.avi" + " -vcodec h263 -b 30000 -r 6 -s qcif -acodec libopencore_amrnb -ac 1 -ar 8000 -ab 10.2k -f 3gp " + @"D:\test.3gp";
public string gvFilepath = @"E:\Basic\test.avi";

public void ConvertVideo()
{
Process p = new Process();//建立外部调用线程
p.StartInfo.FileName = @"..\..\Basic\ffmpeg.exe";//要调用外部程序的绝对路径
(成功)p.StartInfo.Arguments = gvCommand ;
(成功)p.StartInfo.Arguments = "-y -i " + gvFilepath + " -vcodec h263 -b 30000 -r 6 -s qcif -acodec libopencore_amrnb -ac 1 -ar 8000 -ab 10.2k -f 3gp " + @"D:\test.3gp"; ;//参数(这里就是FFMPEG的参数了)
p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的...这是我耗费了2个多月得出来的经验...mencoder就是用standardOutput来捕获的)
p.StartInfo.CreateNoWindow = false;//不创建进程窗口
p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
p.Start();//启动线程
p.BeginErrorReadLine();//开始异步读取
p.WaitForExit();//阻塞等待进程结束
p.Close();//关闭进程
p.Dispose();//释放资源
}

当我直接把命令全部赋值给Arguments时,转换是成功的;
当我使用gvFilepath再赋值给Arguments时,转换也是成功的;
可是当我把文件路径写到DataGridView中,再通过foreach读取出来使用时就不行了

public void mGetDataSetFilepath()
{
foreach (DataRow i in gvVideolist.Tables["VideoList"].Rows)
{
gvFilepath = i["文件路径"].ToString();
gvCommand = "-y -i " + gvFilepath + " -vcodec h263 -b 30000 -r 6 -s qcif -acodec libopencore_amrnb -ac 1 -ar 8000 -ab 10.2k -f 3gp " + @"D:\test.3gp";
this.ConvertVideo();
}
}

这样会转换失败,提示"系统找不到指定的文件。"
我单步调试对比过成功和失败时gvCommand和gvFilepath的字符串内容,都完全一样,为什么会这样呢?
请指教,谢谢^_^
...全文
718 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
细雨婷 2013-10-23
  • 打赏
  • 举报
回复
为什么我按楼主的方法写,看不到转换后的文件呀
水晶圣教士 2012-09-02
  • 打赏
  • 举报
回复
主要问题应该是Application.StartupPath方式能更好的识别路径,而..\..\有时可能不是这么有效果!
yy10100825 2012-08-31
  • 打赏
  • 举报
回复
嗯,这个错误就是这样的,你的路径不对的,Application.StartupPath根文件是:当前程序目录\bin\Debug
水晶圣教士 2011-04-21
  • 打赏
  • 举报
回复
问题已经解决了,因为使用了"..\..\Basic\ffmpeg.exe"表示的相对路径,而我现在改为Application.StartupPath + @"\Basic\ffmpeg.exe"表示的相对路径。

产生错误的原因是:
前面直接赋值命令时,程序能够从程序位置出发,正确找到相对路径下的ffmpeg.exe文件;
而使用DataGridView中转后,程序没有从程序的位置开始找ffmpeg.exe,而是从转换的视频的位置开始查找,所以就找不到ffmpeg.exe,也不知道为什么。

还有,其中一次通过一个private声明的方法调用时,也是同样错误,而改用public后就能正确调用文件了。

问题是找到了,但是问题产生的根源还不清楚。^_^

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧