世界を動かす技術を、日本語で。

Show HN: Typed-FFmpeg 3.0 – FFmpegへの型付きインターフェースとビジュアルフィルターエディタ

概要

typed-ffmpeg は、PythonからFFmpegの複雑なフィルタグラフを型安全かつ直感的に操作できるライブラリ。 IDE補完詳細な型情報ドキュメント統合 など、ffmpeg-pythonの課題を解決。 JSONシリアライズ自動バリデーション など独自機能も搭載。 インストールや基本的な使い方 もシンプル。 インタラクティブなPlayground で実験・学習も可能。

typed-ffmpeg 概要

  • typed-ffmpeg は、FFmpegの強力な機能を Pythonicなインターフェース で提供するパッケージ
  • ffmpeg-python を参考にしつつ、 IDE統合型安全性 を強化
  • 複雑なフィルタグラフ の構築や、 直感的な記法 を実現
  • フィルタグラフのJSON保存・復元自動バリデーション など独自機能を搭載
  • Python標準ライブラリのみ で動作、追加依存なし

主な特徴

  • ゼロ依存性 ・Python標準ライブラリのみで構成、互換性・セキュリティ向上
  • ユーザーフレンドリー ・直感的な記法でフィルタグラフ作成を簡素化
  • FFmpegフィルタ網羅 ・ほとんどのフィルタに対応、 IDEの補完機能 も充実
  • 統合ドキュメント ・インラインdocstringで即座に使用方法を確認可能
  • 堅牢な型付け ・静的・動的型チェックで コード信頼性 と開発体験を向上
  • フィルタグラフのシリアライズ ・JSON形式で保存・再利用が可能
  • グラフ可視化 ・graphviz連携でフィルタグラフを視覚的に表示
  • バリデーション&自動修正 ・フィルタグラフ内のエラー検出・修正支援
  • 入出力オプション対応 ・多様なコーデック・フォーマットも柔軟に指定可能
  • 部分評価 ・フィルタグラフのモジュール化・再利用性向上

今後の開発予定

  • FFmpegバージョン拡張 ・現状はFFmpeg 6.0対応、他バージョン対応も順次強化予定
  • フィルタ追加対応 ・より多様で複雑なフィルタへの対応を拡充予定

インストール方法

  • 基本インストール
    pip install typed-ffmpeg
    
    ・システムに FFmpeg本体 のインストールが必要
  • ffmpeg-pythonとの共存
    pip install typed-ffmpeg-compatible
    
    ・モジュール名競合回避用
  • グラフ可視化サポート
    pip install 'typed-ffmpeg[graph]'
    
    Graphviz のシステムインストールが必要

クイック使用例

  • シンプルな動画反転例
    import ffmpeg
    f = (
        ffmpeg.input(filename='input.mp4')
        .hflip()
        .output(filename='output.mp4')
    )
    f
    
  • 複雑なフィルタグラフ例
    import ffmpeg.filters
    import ffmpeg
    in_file = ffmpeg.input("input.mp4")
    overlay_file = ffmpeg.input("overlay.png")
    f = (
        ffmpeg.filters
        .concat(
            in_file.trim(start_frame=10, end_frame=20),
            in_file.trim(start_frame=30, end_frame=40),
        )
        .video(0)
        .overlay(overlay_file.hflip())
        .drawbox(x="50", y="50", width="120", height="120", color="red", thickness="5")
        .output(filename="out.mp4")
    )
    f
    
  • 詳細な使い方やサンプルは公式ドキュメント参照

インタラクティブPlayground

  • ブラウザ上でtyped-ffmpegを体験可能なPlayground ・FFmpegフィルタやコマンドの実験 ・フィルタグラフのリアルタイム可視化 ・入出力設定のテスト ・インタラクティブな学習例 ・作成したフィルタグラフの共有
  • ローカル環境構築不要で学習・プロトタイピングが可能
  • Playgroundリンク ・https://livingbio.github.io/typed-ffmpeg-playground/

開発背景・謝辞

  • GPT-3による自動SDK生成 を目指し開発を開始
  • 途中で 従来のコード生成手法 へシフトし、より堅牢なツール化を実現
  • GitHub CopilotやGPT-3 の活用で開発効率向上
  • ffmpeg-python のAPI設計・思想に大きく影響を受けている
  • 本プロジェクトは 開発者の息子Austin への誕生日プレゼントとして捧げられている

v3.0の新機能

  • ソースフィルタ対応 (例:color, testsrc等)
  • 入力ストリーム選択 (例:[0:a], [1:v]等)
  • 新しいインタラクティブPlayground ・フィルタグラフのビジュアル構築 ・FFmpeg CLI・型付きPythonコードの自動生成 ・既存のFFmpegコマンドの逆解析・グラフ化
  • CLI→グラフ→型付きコード変換 にも対応 ・教育ツールやFFmpeg IDE、ビジュアルエディタ開発にも有用

フィードバック・今後の展望

  • バグ報告・アイデア提案 は随時歓迎
  • FFmpeg CLIの複雑さに悩む方や教育用途 にも最適
  • 詳細は公式ドキュメント・Playground参照

Hackerたちの意見

お疲れ様!

ちゃんとしたタイピングとIDEサポートに寄り添ってるのがいいね。ffmpeg-pythonも良かったけど、オートコンプリートがないのとタイプヒントが貧弱だったから、いつも制限を感じてた。グラフの可視化やJSONフィルターグラフのエクスポートもかなりいいアイデアだね。もっと複雑なパイプラインでどうなるか気になるな。もうこれを本番で試した人いる?

ほんとに理解できない。なんでLLMがランダムなHNの投稿にコメントする必要があるの? Redditみたいなところでやるのはわかるけど、コメントすることでアカウントにカーマや正当性がもたらされて、後でアストロターフィングに使われたり売られたりするから。でもここでは?面白い会話を礼儀正しくて全く興味のないものに汚してるだけじゃん。

いいアイデアだね。個人的には、これのTypeScript版が楽しみ!

TypeScriptについてはどこにも書いてないね。

同意する!TypeScript版が見たいな。

神の母国語

かっこいい!

面白いね。アクティブに開発されてるのがいいけど、ffmpeg-pythonと同じような問題があるみたいだね。

  • 入力がないフィルター、例えば「color」を指定する方法がないみたい。
  • Popenにフラグを渡す方法がない、例えばWindowsのGUIアプリでCMDウィンドウが出ないようにsubprocess.CREATE_NO_WINDOWを指定することとか。ffmpeg自体を実行するのには大した問題じゃないけど、ffmpeg.compile()して手動で実行すればいいからね。でも、ffprobeの場合はffmpeg.probe()ではそうはいかない。 編集: あ、ソースフィルターのことはわかった、ffmpeg.sources.colorだね。vfilterやafilterみたいに任意のソースフィルターを使う方法はあるのかな?

関係ないけど、僕のC++のソリューション: https://github.com/richardpl/lavfi-preview

それ、すごくいいね!

これこそFFmpegエコシステムに必要だったものだね。FFmpegのパワーは間違いないけど、CLIの難解な構文や発見しにくさは、初心者だけじゃなくて、複雑なパイプラインを構築している経験者にとっても大きな障壁だった。オートコンプリートとバリデーション付きのタイプインターフェースに、ビジュアルエディタが加わるのはゲームチェンジャーだよ。これでデバッグ時間が大幅に減って、洗練されたフィルターグラフの構築がずっと身近になるね。こんな難しいけど影響力のある問題に取り組んでくれて、素晴らしい!

また別のスロップマシンだな。

すべてのコマンドラインオプションパーサーやツールキットが、それぞれ独自の設定言語を持っていることはあまり評価されていない。個々のツールはその言語の「プログラム/設定」みたいなもんだ。無数の方言の語彙的な類似性(ほとんどがUnixシェルが最終的なargvのために単語を分割しているせいで)によって、本当は目が回るような多様性が隠されている。人々は何らかの理由で、実際よりもずっと均一だと思ってしまっている。例えば、私は/usr/binのすべてのプログラムを--helpや-hで実行する実験をしたことがあるけど、有用なヘルプを得られない失敗の数はかなりの割合だった。(その割合の正規化は、私が実行した正確なシステムに特有のものだが)とにかく、ffmpegのような複雑なものにタイプを追加することで、もっと多くの人がこれに気づくかもしれないし、実用的な利点もあるかもしれない。素晴らしい仕事だね!