10

のGUIを作成しようとしていFFMPEGます。私はpythonsサブプロセスを使用して、必要なすべての変換に対してffmpegプロセスを作成しています。これは問題なく動作しますが、失敗したかどうかなど、変換の進行状況を取得する方法も必要です。次のようにプロセスの標準にアクセスすることで、これを実行できると考えました。

呼び出しsubprocess.Popen()

# Convert - Calls FFMPEG with current settings. (in a seperate
# thread.)
def convert(self):
    # Check if options are valid
    if self.input == "" or self.output == "":
        return False

# Make the command string
ffmpegString = self.makeString()

# Try to open with these settings
try:
    self.ffmpeg = subprocess.Popen(ffmpegString, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
except OSError:
    self.error.append("OSError: ")
except ValueError:
    self.error.append("ValueError: Couldn't call FFMPEG with these parameters")

# Convert process should be running now.

そして読んでstdout

convert = Convert()
convert.input = "test.ogv"
convert.output = "test.mp4"
convert.output_size = (0, 0)

convert.convert()

while 1:
    print convert.ffmpeg.stdout.readline()

これは機能しますが、ffmpegのステータスは表示されません。私はそれがffmpegがそれをリフレッシュする方法と関係があると思います。アクセスする方法はありますか?

4

6 に答える 6

8

サブプロセスで標準出力を読み取る際の問題(または標準エラーでさえも!)に気付くことがよくあります。これは、バッファリングの問題を克服するのが難しいためです。私のお気に入りの解決策は、サブプロセスからそのようなstdout / stderrを読み取る必要がある場合、、(またはWindowsでは)の代わりにusingに切り替えるsubprocessことpexpectですwexpect

于 2009-09-21T17:26:42.733 に答える
3

ffmpeg はフラッシュされていないデータを stderr に書き込むため、fcntl を使用して stderr ファイル記述子を非ブロックに設定する必要があります。

    fcntl.fcntl(
        pipe.stderr.fileno()、
        fcntl.F_SETFL、
        fcntl.fcntl(pipe.stderr.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK、
    )

次に、選択を使用してループしてデータを読み取ります

    True の間:
        readx = select.select([pipe.stderr.fileno()], [], [])[0]
        readx の場合:
            チャンク = pipe.stderr.read()

完全な例については、こちらを参照してください

于 2010-08-21T05:50:50.163 に答える
3

ffmpeg は 1 行も出力しないため、readline は使用できないと思います。ステータスは、\r (キャリッジ リターン) を書き込んでから再度行を書き込むことで更新されます。

size=      68kB time=0.39 bitrate=1412.1kbits/s    \rsize=    2786kB time=16.17 bitrate=1411.2kbits/s    \rsize=    5472kB time=31.76 bitrate=1411.2kbits/s    \r\n

上の行を調べると、\n が 1 つしかなく、ファイルの変換が完了すると出力されることがわかります。

于 2010-03-01T20:05:47.533 に答える
-1

FFMPEG:

FFMPEG はすべてのステータス テキスト (コマンド ラインで手動で実行したときに表示されるもの) を stderr インターフェイスに出力します。ffmpeg からの出力をキャプチャするには、stderr インターフェイスを監視するか、例のようにリダイレクトする必要があります。

stderr の出力を確認します。

Popen を呼び出すときにリダイレクトする代わりに、stderr から読み取ろうとする別の方法を次に示します。

PythonのPopen クラスには stderr と呼ばれるファイル オブジェクトがあり、stdout にアクセスするのと同じ方法でアクセスします。あなたのループは次のようになると思います:

while 1:
    print convert.ffmpeg.stdout.readline()
    print convert.ffmpeg.stderr.readline()

免責事項: Python でこれをテストしたことはありませんが、Java を使用して同等のアプリケーションを作成しました。

于 2009-09-21T16:53:00.700 に答える