Как связать информацию о процессе перекодирования ffmpeg в приложение vb6 GUI? - PullRequest
2 голосов
/ 15 мая 2009

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

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

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

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

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

Обновление:

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

Ответы [ 2 ]

4 голосов
/ 15 мая 2009

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

  • Вам нужно прочитать вывод ffmpeg по мере его создания.
  • Разбор строки построчно (как CR, так и LF)
    • Найдите строку «Длительность», сохраните значение времени в секундах в виде целого числа. "Длительность: 00: 03: 18 .48, старт: 0,000000, битрейт: 274 кбит / с" (CRLF прекращен)
    • С этого момента анализируйте CR и ищите время (в секундах) завершенных значений. "кадр = 2816 кадр / с = 667 q = 11,0 Lsize = 13036 кБ время = 187,66 битрейт = 569,1 кбит / с" (CR завершен, без LF)
    • Делай деление (время / продолжительность) и получаешь процент!

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

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

0 голосов
/ 20 января 2010

Сначала извините за мой английский, я говорю по-испански Я нахожу ответ. 1 / Сначала поместите в пресеты, у меня есть этот пример "Выходной формат MPEG2 DVD HQ"

"- vcodec mpeg2video -vstats_file MFRfile.txt -r 29,97 -s 352x480 -спект 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 вашего файла Source. вы можете указать любое имя, если хотите, тогда вы можете прочитать этот текст на этом примере.

Private Sub Timer1_Timer () Dim strLastLine As String «Например, мой рут« C: \ Documents and Settings \ Gortiz \ Mis documents »\ file.txt»

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

Функция ReadLastLineOfFile (sFileName As String) как String Дим объектФСО, ТС Dim sTmpContents As String Установите objFSO = CreateObject ("Scripting.FileSystemObject") Установить TS = objFSO.OpenTextFile (sFileName, 1) sTmpContents = TS.ReadAll TS.Close Установить TS = ничего Установить objFSO = ничего

ReadLastLineOfFile = Split (sTmpContents, vbCrLf) (UBound (Split (sTmpContents, vbCrLf)) - 1) Конечная функция

в списке с именем Lst1 вы можете увидеть результат, который есть. Битрейт, исходящие кадры, время процесса в секундах. и т. д.

Привет.

...