2

私はffmpegのvb6 guiフロントエンドで遊んでいますが、今のところ、プロセス全体がまだ実行されている間にコマンドプロンプトを表示するcmd.exeを介してffmpegを呼び出すことができます。そして、ffmpeg 用のもう 1 つのパスカル ベースのフロントエンド GUI である WinFF がどのように機能するかを見て、これが標準だと思いました。

しかし、プログレスバーとすべてを備えたこの他のGVC GUIを見たとき、私は吹き飛ばされました.

基本的に、コマンドプロンプト全体をきれいに非表示にして、トランスコーディングの進行状況をGUIの進行状況バーにリンクする方法を検討しています。

これが私の計画です。cmd行を呼び出してもそれを隠すことができるwin32 API関数を見つけようと考えています.ここでの別の議論から、ログファイルを読んでffmpegの進行情報を取得する必要があると思います

では、win32 API に対してどの関数を呼び出せばよいでしょうか? そして、これを行うためのより良い/より簡単な方法を知っている人はいますか? ありがとう

アップデート:

誰かが興味を持っている場合に備えて、cmd出力を私のvb6アプリに取り込む方法に関する素晴らしいクラスモジュールを見つけました。それは素晴らしいjoacimにほかなりません:)

4

2 に答える 2

4

OSX 上の Java についてもまったく同じことを書きました。非常に最小限のロジック:

  • 生成された ffmpeg 出力を読み取る必要があります。
  • 出力を行ごとに解析します (CR と LF の両方)
    • 「Duration」行を見つけて、時間の値を秒として整数で保存します。 「期間: 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 の部分では役に立ちませんが、シェルアウトしたプロセスからの出力をキャプチャするのは簡単だと思います。

于 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

-vstats_file Mitxt.txtこの指示により、例のようにコマンドをプリセットに含めることを忘れないtxtファイルを作成できます。これにより、ファイル Source のフォルダー 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、結果を見ることができます。ビットレート、処理されたフレーム、秒単位の処理時間。等

于 2010-01-20T20:27:15.740 に答える