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)[ソース]
ベースクラス:
objectFFmpeg の進捗を 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
- property port: int
待ち受けているポート番号。
- 戻り値:
OS が割り当てたポート番号。
- 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]