FFmpeg是一个开源的命令行音频/视频转换工具。本文将介绍如何在.NET应用程序中执行FFmpeg命令行参数转换,并通过BackgroundWorker组件实现异步处理,以避免在转换过程中阻塞UI界面。
在.NET应用程序中,使用BackgroundWorker组件来执行耗时操作,这样可以避免在转换过程中阻塞UI界面。BackgroundWorker组件允许在应用程序的主UI线程之外的线程上异步执行耗时操作。
FFmpeg可以在互联网上免费获取。需要下载二进制版本,即ffmpeg.exe,并将其放置在项目应用目录中。
首先,需要通过命令行调用ffmpeg.exe。在Windows环境中打开命令提示符,导航到ffmpeg.exe所在的目录。假设ffmpeg位于C:盘根目录,可以使用以下命令将.avi视频文件转换为.flv文件:
ffmpeg -i input.avi output.flv
这个命令会将input.avi文件转换为output.flv文件。程序将执行类似的操作,但不会显示命令行窗口。将通过程序向ffmpeg发送参数。
以下是在.NET程序中实现视频转换的步骤:
在新的窗体中插入三个文本框、一个滑动条、一个BackgroundWorker、打开和保存对话框以及四个命令按钮。同时,确保ffmpeg.exe位于应用程序目录的/bin文件夹中。
创建一个名为startConversion的函数,该函数执行文件的实际转换。以下是VB.NET的示例代码:
Dim input As String = Me.dlgOpen.FileName ' 输入文件
Dim output As String = Me.dlgSave.FileName ' 输出文件
Dim exepath As String = Application.StartupPath + "\bin\ffmpeg.exe" ' ffmpeg位置
Dim quality As Integer = TrackBar1.Value * 2 ' 从滑动条获取质量值
Dim startinfo As New System.Diagnostics.ProcessStartInfo
Dim sr As StreamReader
Dim cmd As String = "-i """ + input + """ -ar 22050 -qscale " & quality & "-y """ + output + """"
' ffmpeg命令 -y强制覆盖
startinfo.FileName = exepath
startinfo.Arguments = cmd
startinfo.UseShellExecute = False
startinfo.WindowStyle = ProcessWindowStyle.Hidden
startinfo.RedirectStandardError = True ' 重定向ffmpeg的输出
startinfo.RedirectStandardOutput = True
startinfo.CreateNoWindow = True
proc.StartInfo = startinfo
proc.Start()
Me.lblInfo.Text = "转换进行中... 请稍候..."
sr = proc.StandardError
Me.btnStart.Enabled = False
Do
If BackgroundWorker1.CancellationPending Then
Exit Function
End If
Dim ffmpegOutput As String = sr.ReadLine
Me.txtProgress.Text = ffmpegOutput
Loop Until proc.HasExited And (ffmpegOutput = Nothing Or ffmpegOutput = "")
Me.txtProgress.Text = "完成!"
Me.lblInfo.Text = "完成!"
MsgBox("完成!", MsgBoxStyle.Exclamation)
Me.btnStart.Enabled = True
在开始按钮的点击事件中,检查输入和输出文件是否已选择,并启动BackgroundWorker。以下是VB.NET的示例代码:
If txtOpen.Text = "" Or txtOpen.Text <> dlgOpen.FileName Then
MsgBox("请选择要转换的文件", MsgBoxStyle.Information, "选择文件")
Exit Sub
ElseIf txtSave.Text = "" Or txtSave.Text <> dlgSave.FileName Then
MsgBox("请选择输出文件名", MsgBoxStyle.Information, "选择文件")
Exit Sub
End If
BackgroundWorker1.RunWorkerAsync() ' 启动后台工作线程
在保存对话框的FileOk事件中,设置对话框的属性。以下是VB.NET的示例代码:
dlgSave.OverwritePrompt = True
dlgSave.DereferenceLinks = True
dlgSave.CreatePrompt = True
dlgSave.DefaultExt = ".flv" ' 此程序仅转换为flv格式
txtSave.Text = dlgSave.FileName
在停止按钮的点击事件中,发送取消请求到BackgroundWorker,并终止ffmpeg进程。以下是VB.NET的示例代码:
On Error GoTo handle
BackgroundWorker1.CancelAsync()
If btnStart.Enabled = False Then
lblInfo.Text = "转换已取消!"
MsgBox("转换已被取消!", MsgBoxStyle.Exclamation)
btnStart.Enabled = True
Else
MsgBox("请先开始转换", MsgBoxStyle.Critical)
End If
proc.Kill()
handle:
Exit Sub
在BackgroundWorker的DoWork事件中调用转换函数。以下是VB.NET的示例代码:
BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
startConversion()
End Sub
此应用程序仅将视频文件转换为.flv(Flash视频)格式。要保存视频为其他格式,只需在保存对话框的文件扩展名过滤属性中添加更多的视频文件扩展名。