如何将ffmpeg转码过程信息链接到vb6 GUI应用程序?

如何将ffmpeg转码过程信息链接到vb6 GUI应用程序?,vb6,ffmpeg,progress-bar,Vb6,Ffmpeg,Progress Bar,我正在玩vb6 gui前端,现在我所能做的就是通过cmd.exe调用ffmpeg,它将在整个进程仍在运行时显示命令提示符。我认为这是WinFF的标准,WinFF是另一个基于pascal的ffmpeg前端gui 但当我看到另一个时,我被吓坏了 因此,基本上,我正在寻找一种方法,如何干净地隐藏整个命令提示符,并将代码转换进度链接到进度条,并将其链接到gui中 这是我的计划,我想找到一个win32 api函数,我可以调用cmd行并隐藏它,我想我必须读取日志文件才能获得ffmpeg进度信息 那么我应该为

我正在玩vb6 gui前端,现在我所能做的就是通过cmd.exe调用ffmpeg,它将在整个进程仍在运行时显示命令提示符。我认为这是WinFF的标准,WinFF是另一个基于pascal的ffmpeg前端gui

但当我看到另一个时,我被吓坏了

因此,基本上,我正在寻找一种方法,如何干净地隐藏整个命令提示符,并将代码转换进度链接到进度条,并将其链接到gui中

这是我的计划,我想找到一个win32 api函数,我可以调用cmd行并隐藏它,我想我必须读取日志文件才能获得ffmpeg进度信息

那么我应该为win32 api调用哪个函数呢? 有人知道更好/更容易的方法来完成这项工作吗? 谢谢

更新:
如果有人感兴趣,我会发现:)

我在OSX上为Java编写了完全相同的东西。极简逻辑:

  • 您需要在生成ffmpeg输出时读取它
  • 逐行分析输出(CR和LF)
    • 找到“Duration”行,将时间值存储为整数中的秒数。“持续时间:00:03:180.48,开始时间:0.000000,比特率:274kb/s”(CRLF终止)
    • 从那时起,解析CR并查找完成的时间(以秒为单位)值。“帧=2816 fps=667 q=11.0 Lsize=13036kB时间=187.66比特率=569.1kbits/s”(CR终止,无LF)
    • 进行划分(时间/持续时间),您就有了一个百分比
我认为让ffmpeg写入日志文件是行不通的。至少在*nix上,ffmpeg会将此输出写入std err,并且需要捕获的状态行没有换行符,因此会覆盖上一个状态行。这是您可以在自己的代码中克服的


很抱歉,无法帮助您使用VB6部件,但我们假设您可以直接从一个进程捕获输出。

首先请原谅我的英语,我讲西班牙语。 我找到了答案。 1/首先输入预设,我有一个示例“输出格式MPEG2 DVD HQ”

此指令可以使txt文件不要忘记将命令
-vstats_file Mitxt.txt
包含到预设中,如示例所示。这可以生成一个报告,该报告位于文件源的文件夹source中。如果你愿意,你可以输入任何名字,然后你可以用这个例子来阅读这个文本

Private Sub Timer1_Timer()
 Dim strLastLine As String
 'For example my ruta "C:\Documents and Settings\Gortiz\Mis documentos\file.txt"

 strLastLine = ReadLastLineOfFile("C:\Documents and Settings\Gortiz\Mis _ documentos\file.txt")
 Lst1.AddItem strLastLine
End Sub

Function ReadLastLineOfFile(sFileName As String) As String
 Dim objFSO, TS
 Dim sTmpContents As String
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 Set TS = objFSO.OpenTextFile(sFileName, 1)
 sTmpContents = TS.ReadAll
 TS.Close
 Set TS = Nothing
 Set objFSO = Nothing

 ReadLastLineOfFile = Split(sTmpContents, vbCrLf)(UBound(Split(sTmpContents, vbCrLf)) - 1)
End Function

在名为
Lst1
的列表框中,您可以看到显示的结果。比特率、处理的帧、处理时间(秒)。etc

谢谢,伙计,我会在找到如何从cmd窗口返回输出后再查看:伟大的斯图·汤普森!!!!!!来吧工作完美!!!!!呵呵呵呵干得好!!!!!
Private Sub Timer1_Timer()
 Dim strLastLine As String
 'For example my ruta "C:\Documents and Settings\Gortiz\Mis documentos\file.txt"

 strLastLine = ReadLastLineOfFile("C:\Documents and Settings\Gortiz\Mis _ documentos\file.txt")
 Lst1.AddItem strLastLine
End Sub

Function ReadLastLineOfFile(sFileName As String) As String
 Dim objFSO, TS
 Dim sTmpContents As String
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 Set TS = objFSO.OpenTextFile(sFileName, 1)
 sTmpContents = TS.ReadAll
 TS.Close
 Set TS = Nothing
 Set objFSO = Nothing

 ReadLastLineOfFile = Split(sTmpContents, vbCrLf)(UBound(Split(sTmpContents, vbCrLf)) - 1)
End Function