C#调用FFMPEG,并异步读取输出信息的代码
来源:互联网 发布:oracle数据库经典书籍 编辑:程序博客网 时间:2024/05/21 10:13
public void ConvertVideo()
{
Process p = new Process();//建立外部调用线程p.StartInfo.FileName = @"c:\ffmpeg.exe";//要调用外部程序的绝对路径p.StartInfo.Arguments = "-i XXXXXXXXXXXXXX";//参数(这里就是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();//释放资源
}private void Output(object sendProcess, DataReceivedEventArgs output){
if (!String.IsNullOrEmpty(output.Data)){//处理方法...}
}
BeginErrorReadLine 可同步或异步读取 StandardError 流。Read、ReadLine 和 ReadToEnd 等方法对进程的错误输出流执行同步读取操作。这些同步读取操作只有在关联的 Process写入其 StandardError 流或关闭该流后才能完成。 相反,BeginErrorReadLine 在 StandardError 流上开始异步读取操作。此方法会为流输出启用指定的事件处理程序并立即返回到调用方,这样当流输出被定向到该事件处理程序时,调用方还可以执行其他操作。 按照这些步骤对 Process 的 StandardError 执行异步读取操作:
- 将 UseShellExecute 设置为 false。
- 将 RedirectStandardError 设置为 true。
- 向 ErrorDataReceived 事件添加事件处理程序。事件处理程序必须与System.Diagnostics.DataReceivedEventHandler
委托签名相匹配。 - 启动 Process。
- 调用 Process 的 BeginErrorReadLine。此调用将启动 StandardError上的异步读取操作。
- 启动异步读取操作时,关联的 Process 每向其 StandardError流写入一行文本时,都将调用该事件处理程序。
- 可通过调用 CancelErrorRead取消异步读取操作。可通过调用方或事件处理程序取消读取操作。取消之后,可以再次调用BeginErrorReadLine 继续进行异步读取操作。
ErrorDataReceived 事件指示关联的进程已写入其重定向 StandardError 流中。 该事件仅在对 StandardError 进行异步读取操作期间发生。若要启动异步读取操作,必须重定向 Process 的 StandardError 流,向 ErrorDataReceived 事件添加事件处理程序,并调用 BeginErrorReadLine。之后,每当该进程向重定向 StandardError 流中写入一行时,ErrorDataReceived 事件都会发出信号,直到该进程退出或调用 CancelErrorRead为止。
NET 2.0 调用FFMPEG,并同步读取输出信息的代码...
public void ConvertVideo(){ Process p = new Process();//建立外部调用线程 p.StartInfo.FileName = @"c:\ffmpeg.exe";//要调用外部程序的绝对路径 p.StartInfo.Arguments = "-i XXXXXXXXXXXXXX";//参数(这里就是FFMPEG的参数了) p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN) p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的...这是我耗费了2个多月得出来的经验...mencoder就是用standardOutput来捕获的) p.StartInfo.CreateNoWindow = false;//不创建进程窗口 p.Start();//启动线程 p.WaitForExit();//等待完成 p.StandardError.ReadToEnd();//开始同步读取 p.Close();//关闭进程 p.Dispose();//释放资源}
StandardError 可以同步或异步读取重定向的 StandardError 流。Read、ReadLine 和 ReadToEnd 等方法对进程的错误输出流执行同步读取操作。这些同步读取操作只有在关联的 Process 写入其 StandardError 流或关闭该流后才能完成。 相反,BeginErrorReadLine 在 StandardError 流上开始异步读取操作。此方法为流输出启用一个指定的事件处理程序并立即返回到调用方,这样当流输出被定向到该事件处理程序时,调用方可以执行其他操作。 同步读取操作在读取 StandardError 流的调用方及写入该流中的子进程之间引入一个依赖项。这些依赖项可能导致产生死锁情况。调用方读取子进程的重定向流时依赖于该子进程。调用方将等待读取操作,直到子进程写入流或关闭流为止。子进程写入足够多的数据以填充重定向流的时间依赖于父进程。子进程将等待下一次写操作,直到父进程读取了全部流或关闭该流为止。当调用方和子进程相互等待对方完成操作时,就会产生死锁情况,使双方都无法继续执行操作。您可以通过计算调用方和子进程之间的依赖项从而避免出现死锁情况。
PS.以上全部引用来自MSDN(代码除外)
我在.NET 2.0中用这些代码,调用FFMPEG很方便...
至于同步还是异步...我会选择异步的...因为异步很方便,有信息就会自动输出...输出的信息还可以经过特定的处理代码,把进度等信息显示出来...至于代码怎么写,无非就是文本处理操作...什么indexof,substring或者正则表达式之类的...
这只是代码模型而已,可以引申出更高级的处理类,例如多线程调用,多线程并发处理,批处理(从文件列表或者数据库数据)等等...
0 0
- C#调用FFMPEG,并异步读取输出信息的代码
- NET 2.0 调用FFMPEG,并异步读取输出信息的代码
- c#读取,修改配置信息,并连接数据库代码测试
- 把一个类存放在硬盘,并通过代码读取类的信息,输出到屏幕上
- 调用控制台应用程序并获得程序的输出信息
- C#的异步调用
- C#的异步调用
- c#的异步调用
- C#中委托异步调用输出日志
- ffmpeg读取视频帧并显示相关信息
- 【代码积累】xml文件读取并输出
- 02.输出提示信息,读取信息并发送
- Java调用ffmpeg转换视频,并读取转换后视频的分辨率、大小以及时长
- C#异步跟踪exe输出并输出到RichTextBox
- java调用ffmpeg转换视频,并读取转…
- C# 调用TTS 并输出WAV
- 在.Net中用C#调用Windows系统信息的代码
- C#异步调用的例子
- 9. Palindrome Number
- 为 HTTrack 在下载页面的时候提供 cookies 以便下载已经登录的页面
- NSGAIII中的normalization objectives
- 51Nod1091 线段的重叠(贪心法+区间相关)
- NET 2.0(C#)调用ffmpeg处理视频的方法
- C#调用FFMPEG,并异步读取输出信息的代码
- Populating Next Right Pointers in Each Node I, II
- SpatialHadoop中空间索引系列之(五)四叉树索引原理
- SQL Server 中几个有用的特殊函数
- SQL书写规范
- SQL Server中获得本周,本月日期的方法
- SpatialHadoop中空间索引系列之(六)R树索引原理
- SQL中如何根据分隔符将表字段中一列转多列
- 278. First Bad Version