2 min read

mp4-py を公開した

時雨堂では mp4-rust という Rust 製の MP4 ライブラリを GitHub で Apache-2.0 で公開しています。この Rust 製の MP4 ライブラリをベースに Python から利用できる MP4 ライブラリを公開したので、雑に書いて行きます。

mp4-rust

自社製品ではずっと WebM を採用していたのですが、H.265 が Chrome に実装されたりしたため、どうしても MP4 ライブラリが必要にないました。Erlang/OTP 版の MP4 ライブラリ(クローズド) を開発した後に、Rust 版を開発することにしました。

今回 Rust 版の MP4 を作るに当たって仕様書を購入し、しっかりと読み込んで開発をしました。ちなみに MP4 の仕様書なかなかいいお値段です。

mp4-rust は依存 0 で書かれています。さらに Sans I/O 対応です。そのうえ no_std に対応しており、組み込みでも利用できるようになっています。ここまでしっかり作り込んである MP4 ライブラリは少ないと思います。

さらに C API を生やすことで、 Rust 以外からも気軽に利用できるようになっています。

GitHub - shiguredo/mp4-rust: MP4 library
MP4 library. Contribute to shiguredo/mp4-rust development by creating an account on GitHub.

かなりしっかり作り込んでるので Rust で MP4 ライブラリが必要になったら使ってみてください。

mp4-py

mp4-rust の C API を利用して mp4-py は作られています。PyO3 を採用しなかったのは、もともと C API を利用する前提だったからです。他のプロジェクトでは Maturin を使ったりしています。

あくまで scikit-buld-core で CMake を利用してビルドするというシンプルな方法をとりました。

利用する場合は uv add mp4-py で行けます。

とても簡単に Python から MP4 を読み込んだりすることができるようになります。

import io
from mp4 import Mp4FileDemuxer

# ファイルパスから demuxer を作成
with Mp4FileDemuxer("input.mp4") as demuxer:
    # サンプルを走査して処理
    for sample in demuxer:
        print(f"Sample: {sample.timestamp_seconds}s, keyframe={sample.keyframe}")
        print(f"Data size: {len(sample.data)} bytes")

# バイナリストリームから demuxer を作成
with open("input.mp4", "rb") as fp:
    demuxer = Mp4FileDemuxer(fp)
    for sample in demuxer:
        # サンプルを処理...
        pass
GitHub - shiguredo/mp4-py
Contribute to shiguredo/mp4-py development by creating an account on GitHub.

もし Python で MP4 ライブラリが必要になったら使ってみてください。