STM32F7でのmp3再生の調査

STM32F7 DiscoveryでのMP3再生について調べてみました。
非力なCPUならVS1053のようなハードウェアデコーダを使うのが良さそうですが、STM32F7はクロックも200MHzあるので、十分ソフトデコード可能な計算パワーがあります。

ちょっと調べてみたところ、F7 Discoveryで動く下記のソフトウェアが見つかりました。

pwegrzyn/STM32F7-MP3-Player: MP3 Player project for uni course.

学生さんが授業の課題か何かで作ったものでしょうか。コンパイル済みで、バイナリが

build/f7project.hex

に入っていますので、これをST-Link UtilityでF7 Discoveryへ書き込むだけで動作します。

MP3ファイルをUSBメモリに入れて、CN13コネクタへ接続すれば勝手に再生されます。SDカードは読んでくれないようです。

このソフトウェアは、MP3デコーダとして「Helix decoder」を使っていました。
これは、かつてRealPlayerというソフトで一世を風靡したRealNetworksが公開しているデコーダです。
調べてみると、他にもSTM32とこのデコーダを組み合わせて使っているソフトがいくつか見つかりました。

vanbwodonk/STM32F4_USB_MP3: STM32F4-Discovery as MP3 player

jiangrunwu/Helix_STM32: Port the Helix MP3

cahya-wirawan/stm32f4-musicplayer: Music player (read mp3 and wav files) running on STM32F4 Discovery

このHelix decoderのライセンスは、「RealNetworks Public Source License (the “RPSL”)」というRealNetworks独自のライセンス形態になっています。

RealNetworks Public Source License Version 1.0 (RPSL-1.0) | Open Source Initiative

内容までは読んでいませんが、MicroChipはこのデコーダをPIC32向けに提供するにあたり、ライブラリを利用する開発者の開発物とHelixが混ざらないように動的ローディングのような仕組みをわざわざ提供しています。
このことから、MITライセンスやBSDライセンスほど緩いライセンスではないように思われます。

Helix MP3 Decoder Library for PIC32

オープンソースのMP3デコーダと言えば、20年くらい前からmpg123というソフトウェアがあります。
後には、mpg321というものもありました。
私の記憶では、mpg123は固定小数点演算ではなく浮動小数点演算を使っており、従ってマイコン向けとしてはちょっとハードルが高かったように思います。

代替になるものがないか、ちょっとネットを探してみたところ、KeyJという人が作ったminimp3というデコーダが見つかりました。

KeyJ's Blog : Blog Archive » Honey, I shrunk the MP3 decoder

これはWindows用で、ライセンスはLGPLとなっています。

また、minimp3よりも音質が良いというMinimalistic MP3 decoderというデコーダも見つかりました。

lieff/minimp3: Minimalistic MP3 decoder single header library

このデコーダのライセンスはCreative Commons Zero v1.0 Universalとなっています。これは権利を最大限放棄した、いわゆるパブリックドメインなソフトウェアです。

中を見てみると、minimp3.hという一見ヘッダファイルのような1800行余りのファイルがデコーダの本体になっています。
x86、x64のほか、ARM(arm9e、cortex-a15、armv8-a)、powerpc、powerpc64でも動作確認できているようです。
検証用のデータが大量に付いているところも特徴的です。

他には、上記のGitHubリポジトリからリンクされているPDMP3というものもあります。2600行足らずのシングルファイルのデコーダで、「修士論文用に開発した」と書かれています。

technosaurus/PDMP3: Public domain mp3 decoder

組み込み向けで使うならMinimalistic MP3 decoderをベースにしてみるのが良さそうだと思いました。

コメント

  1. ben より:

    tried it with stm32f769i-discovery but black screen.
    useful info though, will add mp2 player functionality to my project here eventually.
    https://hackaday.io/project/7041-multichannel-audio-dsp-field-mixer-recorder

  2. boochow より:

    yeah it is for F746G-discovery and probably doesn’t work on F769i-discovery.
    So, your project looks great! seems good also for DAW-less setups.