LoginSignup
URVT
@URVT

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

MP3バイナリの読み方

解決したいこと

MP3のバイナリについて、曲のメタデータなどの取得する方法は調べたら出てくるのですが、音声情報そのもののバイナリの読み方が分かりません。
何バイトずつ読めばいいのか、それが何を表しているのかなどを教えて貰えると有難いです。

0

3Answer

MP3 の正式名称は MPEG-1 Audio Layer-3 です。 これは ISO/IEC 11172-3 として規格化されており、この規格の文書が MP3 の完全な仕様です。 購入するならいくつかの代理店があるようですが、日本規格協会の販売ページから買うのが確実な方法だと思います。

MP3 の規格票はまあまあ高級なものですし自分で実装するには複雑なので、仕様を理解したいわけではなくただ MP3 をデコードして波形を得たいのなら適当なツール (LAMEFFmpeg) で事前に WAV フォーマットに変換しておくのが簡単ではあると思います。


余談ですが厳密に言えば WAV はいわゆるコンテナフォーマットであり、様々な符号化方式を格納できる仕組みになっています。

一般的に WAV は無圧縮 PCM を格納する形で使われるので実質的に WAV は無圧縮 PCM のためのフォーマットであるものと考えることが多いですが WAV の中身の実体が MP3 というようなこともあるにはあります。

4

Comments

  1. @URVT

    Questioner

    ありがとうございます。
    MP3をWAVフォーマットに事前に変えてからやることにします。
    WAVとはそういう圧縮方式(無圧縮)だと勘違いしていました。
    詳細な回答、ありがとうございました。

地道に資料集めたり、github等で既存のMP3デコーダのソースを探して解析したりするしかないと思います。
既存のMP3読み込み可能なオーディオライブラリを使用するのではダメなんですか?

1

Comments

  1. @URVT

    Questioner

    ありがとうございます。
    この瞬間はどの音かというのを(できればpythonで)数値で取得をすることが目的です。
    自分のもとにあるのがmp3だったため、それを対象として質問しました。
    説明不足でした、ごめんなさい。

    追記
    mp3ではなくwavのほうが取得しやすいでしょうか?

  2. mp3ではなくwavのほうが取得しやすいでしょうか?

    mp3は圧縮された音声なので、何らかのオーディオライブラリを使用してPCMにデコードする過程が必要になります。wavは大抵の場合は生のPCMデータが入っているので(圧縮されたwavも存在はします)、取得しやすさでいえば当然デコード不要なwavの方でしょうね。

  3. @URVT

    Questioner

    ありがとうございます。
    wavの方で検索してみたところ、あっさり出てきました。そして無事取得も出来ました。

    申し訳ありませんが、wavに入ってる音声情報(おそらく16 ビット符号付き整数)は、なんの大きさでしょうか?
    こちらはもしお時間があったら応えて頂けると幸いです。

  4. 音が波形で表現されるのはご存じかと思われますが、イメージとしては、波形を数値表現した値ですね。詳しいことは、ご自身でパルス符号変調で調べてみてください。

  5. @URVT

    Questioner

    デジタル化された音やその周辺について自分でいろいろと調べていきます。
    わかりやすい説明ありがとうございました。

WAVの方が楽・・・かもしれませんが同じファイルでもコーデックは色々あるので同じぐらい苦労します

時間を渡せばその時の「音」をpythonで知りたいとのことですが
音っていうのは音量?それとも周波数?どちらかな?

もしこの部分に費やす情熱が人一倍あり、何ヶ月かけても自分で作りたいんだ
という場合は書籍や資料を参考にして作る事も出来るでしょう

ですがそうで無い場合は他の人が言われているように外部ライブラリを使った方が良いです

0

Comments

  1. @URVT

    Questioner

    ありがとうございます。
    音声ファイル内に、大量の数値が入っていて、それが音声情報やメタデータと理解しているのですが、その数値がおそらく音圧(電圧)のようなものを表すものと考えていて、そのフレームごとの値をlistなどでまとめて受け取りたいと考えています。
    自分で一からやりたい!というわけではないのですが、音声波形を出力する外部ライブラリは知っているのですが、その値を得られるライブラリを知らなかったのでこのように質問させていただきました。

    これが正しい返答になっているでしょうか。

    追記
    現在は、pythonの標準ライブラリであるwaveを使って、
    samples = np.frombuffer(raw_data, dtype=dtype) # 一部
    のように取得しています、引数は自分の調べる限りだと間違っていません。

Your answer might help someone💌