Как связать информацию о процессе перекодировки ffmpeg с графическим интерфейсом пользователя vb6?

Я играю с графическим интерфейсом vb6 для ffmpeg, и на данный момент все, что я могу сделать, это для вызова ffmpeg через cmd.exe, который покажет командную строку, пока весь процесс все еще выполняется. И я подумал, что это было нормой, когда я видел, как работает WinFF, еще один интерфейс интерфейса, основанный на паскале, для ffmpeg.

Но я был потрясен, когда увидел этот другой графический интерфейс GVC, в котором есть индикатор выполнения и все такое.

В общем, я ищу способ полностью скрыть всю командную строку и связать прогресс перекодирования с индикатором выполнения в моем графическом интерфейсе.

Итак, вот мой план, я подумываю найти функцию win32 api, которую я могу вызвать строку cmd и все же скрыть ее, и из другого обсуждения здесь, думаю, мне нужно прочитать файл журнала, чтобы получить информацию о ходе выполнения ffmpeg.

Итак, какую функцию я должен вызывать для Win32 api? И кто-нибудь знает лучший / более простой способ сделать это? Благодарность

Обновления:

Если кому-то интересно, я нахожу хороший модуль класса о том, как получить вывод cmd в мое приложение vb6, и это не кто иной, как великий joacim :)


person melaos    schedule 15.05.2009    source источник


Ответы (2)


Я написал то же самое для Java на OSX. Очень минималистичная логика:

  • Вам необходимо прочитать вывод ffmpeg по мере его создания.
  • Parse the output line by line (both CR and LF)
    • Find the 'Duration' line, store the time value as seconds in an integer. "Duration: 00:03:18.48, start: 0.000000, bitrate: 274 kb/s" (CRLF terminated)
    • С этого момента проанализируйте CR и найдите время (в секундах) завершенных значений. "frame = 2816 fps = 667 q = 11.0 Lsize = 13036kB time = 187.66 bitrate = 569.1kbit / s" (CR завершен, без LF)
    • Сделайте деление (время / продолжительность) и у вас будет процент!

Я не верю, что запись ffmpeg в файл журнала сработает. По крайней мере, в * nix, ffmpeg записывает этот вывод в std err, а строки состояния, которые вам нужно захватить, не имеют перевода строки и поэтому перезаписывают предыдущую строку состояния. Это то, что вы можете преодолеть в своем собственном коде.

Извините, я не могу помочь с частью VB6, но предполагаю, что это просто захват вывода из процесса, который вы обрабатываете.

person Stu Thompson    schedule 15.05.2009
comment
спасибо, чувак, я посмотрю на него после того, как узнаю, как вернуть вывод из окна cmd: P - person melaos; 15.05.2009
comment
ОТЛИЧНЫЙ ОТЛИЧНЫЙ Стю Томпсон !!!!!! ДАВАЙ!!! РАБОТАЕТ ОТЛИЧНО !!!!! ХЕХЕХЕХЕХЕХЕ ХОРОШАЯ РАБОТА !!!!! - person ; 23.02.2011

Во-первых, прошу прощения за мой английский, я говорю по-испански. Я нахожу ответ. 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

Эта инструкция может сделать текстовый файл, не забудьте включить команды -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 вы можете увидеть результат, который есть. Битрейт, обработанные кадры, время обработки в секундах. и т.д

person Geovanny1974    schedule 20.01.2010