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

时间:2009-05-15 07:23:38

标签: vb6 ffmpeg progress-bar

我正在使用ffmpeg的vb6 gui前端,到目前为止,我所能做的就是通过cmd.exe调用ffmpeg,这将显示整个进程仍在运行时的命令提示符。而且我认为这是常态,看看WinFF,另一个以ffmpeg为基础的pascal前端gui的工作方式。

但是当我看到另一个GVC gui which has a progress bar and everything.

时,我感到很震惊

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

所以这是我的计划,我正在考虑找到一个win32 api函数,我可以调用cmd行然后隐藏它,from another discussion here,我想我必须读取日志文件才能得到ffmpeg进度信息。

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

更新

如果有人感兴趣,我会找到nice class module on how to grab the cmd output into my vb6 app, and it's by none other than the great joacim:)

2 个答案:

答案 0 :(得分:4)

我在OSX上为Java写过这个完全相同的东西。极简主义的逻辑:

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

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

很抱歉,对VB6部分无法提供帮助,但是我们可以假设您可以直接从外壳进程中捕获输出。

答案 1 :(得分: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。你可以根据需要添加任何名称,然后你就可以用这个例子阅读这个文本。

Private Sub Timer1_Timer() Dim strLastLine As String '例如我的ruta“C:\ Documents and Settings \ Gortiz \ Mis documentos \ file.txt”

strLastLine = ReadLastLineOfFile(“C:\ Documents and Settings \ Gortiz \ Mis _ documentos \ file.txt”“) Lst1.AddItem strLastLine 结束子

函数ReadLastLineOfFile(sFileName As String)As String Dim objFSO,TS Dim sTmpContents As String 设置objFSO = CreateObject(“Scripting.FileSystemObject”) 设置TS = objFSO.OpenTextFile(sFileName,1) sTmpContents = TS.ReadAll TS.Close 设置TS = Nothing 设置objFSO = Nothing

ReadLastLineOfFile = Split(sTmpContents,vbCrLf)(UBound(Split(sTmpContents,vbCrLf)) - 1) 结束功能

在名为Lst1的列表框中,您可以看到结果。比特率,进行帧,进程时间,以秒为单位。等等

问候。