.NET 2.0 调用FFMPEG

.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 流的调用方及写入该流中的子进程之间引入一个依赖项。这些依赖项可能导致产生死锁情况。调用方读取子进程的重定向流时依赖于该子进程。调用方将等待读取操作,直到子进程写入流或关闭流为止。子进程写入足够多的数据以填充重定向流的时间依赖于父进程。子进程将等待下一次写操作,直到父进程读取了全部流或关闭该流为止。当调用方和子进程相互等待对方完成操作时,就会产生死锁情况,使双方都无法继续执行操作。您可以通过计算调用方和子进程之间的依赖项从而避免出现死锁情况。

.NET 2.0 调用FFMPEG

时间: 2024-10-17 00:48:45

.NET 2.0 调用FFMPEG的相关文章

在visual studio 2010中调用ffmpeg

本文来自:http://blog.sina.com.cn/s/blog_4178f4bf01018wqh.html 最近几天一直在折腾ffmpeg,在网上也查了许多资料,费了不少劲,现在在这里和大家分享一下. 一.准备工作 本来是想自己在windows下编译ffmpeg生成lib.dll等库文件的,但是折腾好久总是出错,于是果断放弃.幸好网上已经有了编译好的版本,可以拿过来直接用,网址为http://ffmpeg.zeranoe.com/builds/.我们需要的是32-bit Builds (

ASP.NET下调用ffmpeg与mencoder实现视频转换截屏

最近要做一个视频播放的系统,用到了ffmpeg和mencoder两个工具,查了一些资料,发现这方面的资料还挺多的,但是就是乱了一点,我自己从头整理了一下,和大家分享一下: 1.ffmpeg实现视频(avi,wmv等格式)转换为flv格式: /// <summary> /// 转换视频为flv /// </summary> /// <param name="fileName">上传视频文件的路径(原文件)</param> /// <p

CentOS 下通过 JavaCPP 调用 FFMPEG

1. Java 与 FFMPEG FFMPEG 是一个广泛用于媒体处理的库,在Java的世界里,处理视频的能力相当弱,于是有很大需求需要Java 调用 FFMPEG. Java 调用C 的方式有很多,可以用最原始的JNI方式,也可以JNA方式,还可以是命令行. 采用命令行的方式比较简单,不过有很大局限性,尤其是涉及到 视频的处理和分析的时候,比如要取出某个packet,然后进行处理. 这里介绍的是用JavaCPP 调用 ffmpeg 库的方式,而不是命令行模式. JavaCPP的源码在这里:ht

pyinstaller打包PySide2写的GUI程序,调用ffmpeg隐藏CMD控制台解决方案

1 问题描述 使用PySide2写了一个GUI程序,调用ffmpeg命令行工具,做简单的批量视频处理(调整帧宽度.帧高度.视频变速.降低视频码率达到限制视频大小),使用了ffmpeg. ffmpeg-python库: 挺简单的事儿,但遇到一个问题: pyinstaller打包程序时: 不加 -w 或 --noconsole,有CMD丑黑框,程序可以正常运行,但是程序界面背后一个大大的CMD黑框真心难看... 加上 -w 或 --noconsole,没有CMD黑框,程序会直接无限等待,无法正常运行

OAuth2.0学习(5-4)新浪开放平台-微博API-使用OAuth2.0调用API

使用OAuth2.0调用API 使用OAuth2.0调用API接口有两种方式: 1. 直接使用参数,传递参数名为 access_token URL 1 https://api.weibo.com/2/statuses/public_timeline.json?access_token=abcd 2.在header里传递,形式为在header里添加 Authorization:OAuth2空格abcd,这里的abcd假定为Access Token的值,其它接口参数正常传递即可. 注:所有的微博开放

新浪微博 使用OAuth2.0调用API

# -*- coding: cp936 -*- #python 2.7.10 #xiaodeng #新浪微博 使用OAuth2.0调用API #微博开放接口的调用,都需要获取用户的身份认证.目前微博开放平台用户认证鉴权主要采用OAuth2.0. #使用OAuth2.0调用API接口有2个方式: 1.直接使用参数,传递参数名为access_token URL='https://api.weibo.com/2/statuses/public_timeline.json?access_token=ab

VB6.0调用DLL

目录 第1章 VB6.0调用DLL    1 1 VC++编写DLL    1 1.1 使用__stdcall    1 1.2 使用 .DEF 文件    1 2 简单数据类型    2 2.1 传值(ByVal)    2 2.2 传址(ByRef)    3 2.3 传址(VarPtr)    4 2.4 转换为Variant    4 3 String    6 3.1 BSTR内存布局    6 3.2 StrPtr.VarPtr    7 3.3 示例代码    7 3.4 转换为V

cocos2d-x V3.0 调用重力加速器 Acceleration

今天解决了一个问题心情很爽 哈哈: 今天解决的就是cocos2d-x 3.0 调用重力加速器的问题,网上搜了很多的资料 发现都是不行的,不能解决问题,不知道是不是我使用的是3.0 的版本问题,但是网上有些教程说的也是3.0 的版本啊,难道beta版和正式版也有那么大差别么?坑爹啊, 就说这个重写的方法吧:网上搜索的到好多都是重写父类的 didAccelerate(CCAcceleration* pAccelerationValue);方法,但是我用的3.0 根本就没有了这个方法,搜索的3.0 还

bash shell,调用ffmpeg定期截图

#!/bin/bash #获取当前目录中所有m3u8文件,并 var=$(ls |grep '.m3u8'|cut -d '.' -f1) #死循环 while [ 1 = 1 ] do #循环每个文件 for stream in $var do #获取当前最新视频文件 ts=$(ls -t|grep "$stream") for file in $ts do #存储M3U8文件文件名作为图片文件名,截图为220*120,截取第一帧,存储在当前目录的screen文件夹 img=$(ls