2

我正在使用ffmpeg的 vb6 gui 前端,到目前为止,我所能做的就是通过 cmd.exe 调用 ffmpeg,这将在整个过程仍在运行时显示命令提示符。我认为这是查看 WinFF(另一个基于 pascal 的 ffmpeg 前端 gui)如何工作的规范。

但是当我看到另一个有进度条和所有东西的 GVC gui 时,我被震撼了。

所以基本上,我正在研究一种如何干净地隐藏整个命令提示符并将转码进度链接到我的 gui 中的进度条的方法。

所以这是我的计划,我正在考虑找到一个 win32 api 函数,我可以调用 cmd 行并隐藏它,从这里的另一个讨论中,我想我必须阅读日志文件才能获取 ffmpeg 进度信息。

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

更新:

如果有人有兴趣,我会找到一个很好的类模块,介绍如何将 cmd 输出抓取到我的 vb6 应用程序中,这正是伟大的 joacim :)

4

2 回答 2

4

我在 OSX 上为 Java 写了同样的东西。极简逻辑:

  • 您需要在生成 ffmpeg 输出时读取它。
  • 逐行解析输出(CR 和 LF)
    • 找到“持续时间”行,将时间值存储为整数中的秒数。 “持续时间:00 :03:18 .48,开始:0.000000,比特率:274 kb/s”(CRLF 终止)
    • 从那时起,解析 CR 并查找时间(以秒为单位)完成值。 “帧= 2816 fps=667 q=11.0 Lsize= 13036kB 时间= 187.66比特率= 569.1kbits/s”(CR 终止,无 LF)
    • 做除法(时间/持续时间),你有一个百分比!

我不相信让 ffmpeg 写入日志文件会起作用。至少在 *nix 上,ffmpeg 将此输出写入 std err,并且您需要捕获的状态行没有换行符,因此会覆盖先前的状态行。这是您可以在自己的代码中克服的问题。

抱歉,对 VB6 部分无能为力,但会假设直接从您退出的进程中捕获输出。

于 2009-05-15T07:48:23.353 回答
0

首先原谅我的英语我说的是西班牙语。我找到了答案。1/首先放入预设,我有这个例子“输出格式 MPEG2 DVD HQ”

-vcodec mpeg2video -vstats_file MFRfile.txt -r 29.97 -s 352x480 -aspect 4:3 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2

这条指令可以让一个 txt 文件不要忘记-vstats_file Mitxt.txt像示例一样将命令包含到预设中。这可以在您的文件 Source 的文件夹源中生成一个 ubicadet 的报告。如果你愿意,你可以输入任何名字,然后你可以用这个例子来阅读这个 txt。

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

于 2010-01-20T20:27:15.740 回答