.NET 2.0 调用FFMPEG,并异步读取输出信息的代码...

1 public void ConvertVideo()
 2 {
 3           Process p = new Process();//建立外部调用线程
 4           p.StartInfo.FileName = @"c:"ffmpeg.exe";//要调用外部程序的绝对路径
 5           p.StartInfo.Arguments = "-i XXXXXXXXXXXXXX";//参数(这里就是FFMPEG的参数了)
 6           p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
 7           p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的这是我耗费了2个多月得出来的经验mencoder就是用standardOutput来捕获的)
 8           p.StartInfo.CreateNoWindow = false;//不创建进程窗口
 9           p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
10          p.Start();//启动线程
11          p.BeginErrorReadLine();//开始异步读取
12          p.WaitForExit();//阻塞等待进程结束
13          p.Close();//关闭进程
14          p.Dispose();//释放资源
15 }
16 private void Output(object sendProcess, DataReceivedEventArgs output)
17 {
18       if (!String.IsNullOrEmpty(output.Data))
19       {
20                //处理方法
21        }
22 }
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,并同步读取输出信息的代码...

1 public void ConvertVideo()
 2 {
 3            Process p = new Process();//建立外部调用线程
 4            p.StartInfo.FileName = @"c:"ffmpeg.exe";//要调用外部程序的绝对路径
 5            p.StartInfo.Arguments = "-i XXXXXXXXXXXXXX";//参数(这里就是FFMPEG的参数了)
 6            p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
 7            p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的这是我耗费了2个多月得出来的经验mencoder就是用standardOutput来捕获的)
 8            p.StartInfo.CreateNoWindow = false;//不创建进程窗口
 9            p.Start();//启动线程
10            p.WaitForExit();//等待完成
11            p.StandardError.ReadToEnd();//开始同步读取
12            p.Close();//关闭进程
13            p.Dispose();//释放资源
14 }
StandardError
可以同步或异步读取重定向的 StandardError 流。Read、ReadLine 和 ReadToEnd 等方法对进程的错误输出流执行同步读取操作。这些同步读取操作只有在关联的 Process 写入其 StandardError 流或关闭该流后才能完成。
相反,BeginErrorReadLine 在 StandardError 流上开始异步读取操作。此方法为流输出启用一个指定的事件处理程序并立即返回到调用方,这样当流输出被定向到该事件处理程序时,调用方可以执行其他操作。
同步读取操作在读取 StandardError 流的调用方及写入该流中的子进程之间引入一个依赖项。这些依赖项可能导致产生死锁情况。调用方读取子进程的重定向流时依赖于该子进程。调用方将等待读取操作,直到子进程写入流或关闭流为止。子进程写入足够多的数据以填充重定向流的时间依赖于父进程。子进程将等待下一次写操作,直到父进程读取了全部流或关闭该流为止。当调用方和子进程相互等待对方完成操作时,就会产生死锁情况,使双方都无法继续执行操作。您可以通过计算调用方和子进程之间的依赖项从而避免出现死锁情况。

转载于:https://www.cnblogs.com/huangtu/p/3850412.html

.NET 2.0 调用FFMPEG相关推荐

  1. C#调用FFMPEG,并异步读取输出信息的代码

    public void ConvertVideo() { Process p = new Process();//建立外部调用线程 p.StartInfo.FileName = @"c:\f ...

  2. java调用ffmpeg,mencoder进行视频转换,读取时长等

    2019独角兽企业重金招聘Python工程师标准>>> 以前做的一个基于ffmpeg的视频格式转换的程序,现在抽空整理一下,很多地方都是从别的大神那借鉴的,只是把自己的觉得有用的,对 ...

  3. 在visual studio 2010中调用ffmpeg

    转自:http://blog.sina.com.cn/s/blog_4178f4bf01018wqh.html 最近几天一直在折腾ffmpeg,在网上也查了许多资料,费了不少劲,现在在这里和大家分享一 ...

  4. 转载给ffmpeg入门级:我的第一个调用FFmpeg库的程序出炉

    好消息,写了第一个使用了ffmpeg的库的小程序. 看起来就是这么简单的一个消息,但是you have no idea how much work that I did before it works ...

  5. Android Java调用ffmpeg命令

    0. 前言 ffmpeg命令很强大,但是在Android工程中无法执行可执行文件ffmpeg,即无法使用ffmpeg.  本文介绍把ffmpeg改造成库文件,然后通过JNI调用它,即可实现在Java中 ...

  6. java flv转mp3_Java调用ffmpeg转换视频格式为flv的示例详解

    这篇文章主要介绍了 详解java调用ffmpeg转换视频格式为flv的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下 详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在L ...

  7. mysql+视频文件转成流_详解java调用ffmpeg转换视频格式为flv

    详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:W ...

  8. C++调用ffmpeg批量合并bilibili缓存视频

    文章目录 前言 一.先看效果 二.开始写代码 1.遍历文件 2.获取视频标题和视频名称 3.生成视频 4.主函数 总结 前言 手机bilibili缓存了很多视频,想导入电脑看,但发现缓存的视频被分割成 ...

  9. java调用ffmpeg把rtsp视频流保存为MP4文件

    前言:最近需要把rtsp的视频流保存为MP4文件(就是录制直播流).刚开始用的javacv的FFmpegFrameGrabber和FFmpegFrameRecorder,但是声音流和视频流无法调整,声 ...

  10. C# 调用FFmpeg处理音视频的示例

    FFmpeg 开源.跨平台.体积小.功能强大,提供了录制.转换以及流化音视频的完整解决方案. 官网:https://www.ffmpeg.org/ 百科:https://baike.baidu.com ...

最新文章

  1. iOS 开发 OC编程 字典和集合 排序方法
  2. python 哈希表_哈希表哪家强?编程语言找你来帮忙!
  3. oracle显示当天日期函数,oracle日期函数
  4. Java 匿名对象、内部类
  5. Ubuntu SSH root user cannot login
  6. flutter webview浏览器及与js交互、打开第三方app
  7. 俞敏洪最新干货演讲:在动荡的时代做不动荡的自己
  8. java多线程【线程安全问题】
  9. 巴菲特午宴中标者孙宇晨与王小川隔空互怼 还要对赌100个比特币?
  10. Python——装饰器的学习笔记(legacy)
  11. kotlin多继承_Kotlin继承
  12. EXCEL 常用的宏代码大全
  13. 小米手机无需刷入Recovery获取Root权限,卡刷包payload.bin提取boot.img文件
  14. oracle导出pck文件,Oracle sqlloader自动化导入迁移工具—可批量生成千万控制文件与批处理文件|一键执行(推荐)...
  15. Android或者是IOS/普通屏全面屏及qq浏览器和qq内置浏览器判断
  16. 一文看懂推荐系统:概要01:推荐系统的基本概念
  17. 移动设备软件开发测试
  18. BackTrack5 Note01
  19. 2-2 用Plot函数绘图
  20. msdtc后门的实现思路

热门文章

  1. 季节怎么形容_描写四季冬的词语 形容冬天季节的词语
  2. String的intern()方法浅析
  3. 写给安卓软件工程师的3条建议,全套教学资料
  4. 计算机处理器(CPU)基础
  5. 计算机组成cpu的是,组成计算机cpu的两大部件
  6. matlab绘制一般计算时间函数的曲线
  7. 使用vue-giant-tree根据id定位位置
  8. AMD处理器的发展历程
  9. C语言小技巧之如何求平均数
  10. Android Material 常用组件详解(七)—— BottomNavigationView 使用详解