video_converter.progress module

FFmpeg の進捗を TCP 経由で受け取り、プログレスバーへ反映するモジュール。

FFmpeg の -progress tcp://127.0.0.1:<port> オプションを利用し、変換の 進捗を別プロセスから受信する。受信側は Observer パターンで実装されており、 FFmpegTCPSender (Subject) が tqdm プログレスバーまたは GUI の コールバック関数 (Observer) へ進捗を通知する。

FFmpeg の実行と進捗の受信を並行させるために gevent を用いるため、 run_pipeline_with_observer() を呼ぶ前に gevent.monkey.patch_all() が適用されている必要がある。CLI では video_converter.__main__ の 先頭で適用している。

video_converter.progress.DEFAULT_ACCEPT_TIMEOUT = 30.0

FFmpeg からの進捗用 TCP 接続を待つ既定の秒数。 FFmpeg が接続前に終了した場合に待ち続けないための上限。

class video_converter.progress.FFmpegTCPSender(pbar, total, timeout=30.0)[ソース]

ベースクラス: object

FFmpeg の進捗を TCP で受信し、プログレスバーへ通知する Subject。

パラメータ:
  • pbar (tqdm | Callable[[float], None]) -- 進捗の通知先 (Observer)。n 属性を持つ tqdm プログレス バー、または経過秒数を 1 引数で受け取るコールバック関数のいずれか。 どちらであるかは _notify_pbar() が実行時に判別する。

  • total (float) -- 動画の合計時間 (秒)。

  • timeout (float) -- FFmpeg からの接続を待つ秒数。FFmpeg が接続前に 終了した場合に待ち続けないための上限。

_connect()[ソース]

FFmpeg からの TCP 接続を受け付ける。

戻り値:

接続済みの socket.socket オブジェクト。

例外:

TimeoutError -- timeout 秒以内に FFmpeg が接続してこない場合。 FFmpeg が起動直後に終了したときに待ち続けないためのガード。

戻り値の型:

socket

_notify_pbar(key, value)[ソース]

プログレスバーを更新する。

パラメータ:
  • key (str) -- FFmpeg から送信されたキー。

  • value (str) -- FFmpeg から送信された値。

戻り値の型:

None

close()[ソース]

待ち受けソケットと接続済みソケットを閉じる。

戻り値の型:

None

property port: int

待ち受けているポート番号。

戻り値:

OS が割り当てたポート番号。

tcp_handler()[ソース]

TCP データの受信および処理を行う。

例外:

TimeoutError -- FFmpeg が制限時間内に接続してこない場合。

戻り値の型:

None

video_converter.progress._ensure_monkey_patched()[ソース]

gevent の monkey patch が適用済みかを確認する。

未適用の場合は、この時点で socket を patch する。既に ssl などが import されている状態での patch は不完全になりうるため、あわせて警告する。

戻り値の型:

None

video_converter.progress.probe_duration(path)[ソース]

動画の合計再生時間を取得する。

パラメータ:

path (str | PathLike) -- 動画のファイルパス。

戻り値:

合計再生時間 (秒)。

戻り値の型:

float

video_converter.progress.run_pipeline_with_observer(pipeline, observer, total, timeout=30.0)[ソース]

FFmpeg を実行し、進捗を Observer へ通知する。

パラメータ:
  • pipeline (Node) -- FFmpeg の pipeline オブジェクト。

  • observer (tqdm | Callable[[float], None]) -- 進捗の通知先。tqdm プログレスバーまたはコールバック関数。

  • total (float) -- 動画の合計時間 (秒)。

  • timeout (float) -- FFmpeg からの接続を待つ秒数。

戻り値:

pipeline.run() の戻り値 (stdout, stderr) のタプル。 capture_stdout / capture_stderr を指定していないため、 いずれの要素も None になる。

例外:
  • ffmpeg.Error -- FFmpeg が異常終了した場合。

  • TimeoutError -- FFmpeg が制限時間内に進捗用の TCP 接続を 行わなかった場合。

戻り値の型:

tuple[bytes | None, bytes | None]

video_converter.progress.run_with_tcp_pbar(path, pipeline)[ソース]

FFmpeg の実行時に TCP 通信でプログレスバーを表示する。

パラメータ:
  • path (str | PathLike) -- 動画のファイルパス。合計時間の取得に使用する。

  • pipeline (Node) -- FFmpeg の pipeline オブジェクト。

戻り値:

pipeline.run() の戻り値 (stdout, stderr) のタプル。 capture_stdout / capture_stderr を指定していないため、 いずれの要素も None になる。

例外:
  • ffmpeg.Error -- FFmpeg が異常終了した場合。

  • TimeoutError -- FFmpeg が制限時間内に進捗用の TCP 接続を 行わなかった場合。

戻り値の型:

tuple[bytes | None, bytes | None]