Python で生の音声や映像データを再生するプレイヤーを作った
リアルタイムな音声や映像を取り扱うライブラリを Python で色々と作っています。ただ、Python 経由で音声や映像を気軽に再生するプレイヤーが無くて困っています。今まで映像は OpenCV を使って再生していたのですが、正直 720p 120fps を再生しようとすると厳しい現実が待っており、使い物になりません。
ということで SDL (Simple DirectMedia Layer) を利用した生データ専用のプレイヤーを実装することにしました。
方針
基本的には開発向けなので本当にただ再生できるだけで十分です。MP4 を読み込んで再生するというわけではなく、リアルタイムな音声や映像を受け取って同期して再生専用と割り切ることにしました。
raw-player
blend2d で生成した 1080p 120fps の映像を再生できる
実装は uv と nanobind と scikit-build-core と cmake を利用してガッツリ C++ です。性能を出すため色々頑張ってはいますが、シンプルな実装にしています。機能は最低限です。終了処理のためにキーボードハンドリングをコールバックで追加して居ます。

雑感
API の設計を 3 回くらいやり直しました。本当は Python 3.13+ にして Free-threading を採用したかったのですが、自分のスキルが足りませんでした。今後の課題とします。
このプレイヤーによりカメラから得た映像やブラウザから配信された WebRTC の音声や映像を気軽に再生できるようになりました。
時雨堂ではリアルタイムな音声や映像を検証やテストするための Python バインディングライブラリを色々作ってきました。
- libdatachannel-py
- Python から WebRTC が利用できるライブラリ
- blend2d-py
- Python からダミー映像を作れる 2D グラフィックスライブラリ
- mp4-py
- 音声や映像を保存して確認したり、保存した動画を配信したりできるライブラリ
- webcodecs-py
- Python だけで音声や映像をデコード/エンコードできるライブラリ
- raw-player
- Python で高画質、高フレームレートのストリーミング動画を再生できるライブラリ
今は UVC (USB video device class) を Python から利用できるライブラリを作っています。これにより Python で気軽に ndarray でカメラからの生データを取得できるようになります。
音声ライブラリは PortAudio ベースの sounddevice で特に不満があるわけではないのでそのまま利用させて貰おうと考えています。なんとか必要なパーツが揃ってきました。