229 Views
November 03, 25
スライド概要
                        iOS環境での音声エンコードをテーマにした Kanagawa.swift #2 でのLT資料です。
Kanagawa.swift #2
https://japan-region-swift.connpass.com/event/365671/
OSSのMP3エンコーダ「LAME」をSwiftで動かし、iOS上でWAVからMP3変換を実現した実装事例となります。
MP3の特許満了後、OSSとして自由に利用可能になったLAMEをSwiftから利用する方法をまとめています。
WAV(PCM)録音データをLAMEライブラリを用いてMP3へ変換する仕組みを、XCFrameworkとして実装した過程を紹介。
主な内容:
・MP3特許とLAMEライセンスの関係
・WAV形式をマスター音源として扱う理由
・LAMEのヘッダ修正とXCFramework化
・SwiftとCの連携(WAV→MP3変換)
・iPadOS 26 / iOS 18.3 での実機検証結果
iOS向けに修正を行なった改修コード差分や、ビルドスクリプト、手順などの詳細は以下をご参照ください。
masaconm / masacom
lame-ios-swift-reference
https://github.com/masaconm/lame-ios-swift-reference
                    
            Swift/iOSで MP3 Encorder LAME 3.100を使って WAVをMP3に変換してみた masacom @masacom
自己紹介 Swift 初学者 / 音響アプリの個人開発をしています 職業:WEBフロントエンドエンジニア masacom @masacom 本日の LAME のiOS用ビルドリファレンスサンプル masaconm / masacom lame-ios-swift-reference https://github.com/masaconm/lame-ios-swiftreference.git
本日話すこと MP3 特許期限切れとLAMEの関係 なぜ WAV (PCM) → MP3変換が必要? SwiftからLAMEを使うには? iOS用修正版での対応ポイント iOS向けの改修コード MP3エンコードまでの3つのステップ まとめ
課題とやりたかったこと 課題 iPadで録音したWAV (PCM) → MP3 変換を実装したいが、 AVFoundationでは AAC(.m4a)、ALAC、PCM(WAV/AIFF/CAF) のエンコードまでのサポートのようだが、オフライン使用可能にしたい 為、端末内でのエンコードを実装したい。何か手段はあるのか? 音楽の個人販売/配信可能な音楽サービスやDTM/DAW、ハードウエア(サンプラー等) の機材との互換性を重視すると、WAVかMP3が扱いやすい。何とかできないものか… この機会に、Ableton Liveやadobe Auditionでも使用されているお馴染 みのMP3エンコーダーOSS:LAME を Swiftから利用できる形にしてみ たい!とりあえずやってみよう!
MP3の圧縮技術には特許制約が あったような気がする… 🤔
MP3 とLAME の関係 MP3 Encorder LAME ー 1998年から開発されているC言語(ANSI C)のOSS ー 高品質なMP3エンコーダーで、多くのDTM/DAWソフトウエア(で使用され ている MP3の特許について ー 主要特許は Fraunhofer IIS および Technicolor 等が保有していた ー 2017年4月23日に特許期限切れとなり、Fraunhofer が MP3 ライセンスプロ グラム終了を発表。 ー 現在、MP3 形式は特許保護下から自由利用可能な状態となっている
MP3 とLAME の関係 まとめ MP3 Encorder LAME 3.100 自体はOSSのため利用制限はなかった けれども、MP3側での特許制約があった事により、高額な商用ソフ トウエアでしかMP3エンコードを実装できない過去があった。 1990年代後半〜2000年代初期には、特許制約を回避して非公式に MP3エンコーダを同梱したフリーソフトが多く存在しました。 「MP3エンコード=高価な商用製品限定」という印象が強かったが、 現在ならばLAMEを正式に実装できる!!
なぜ WAV (PCM) → MP3変換が必要? WAVとMP3, M4Aの違い 項目 WAV MP3 M4A 圧縮方式 非圧縮(PCM) 不可逆圧縮 AACなどの非可逆圧縮 音質 高品質 / 原音に近い 中 / 劣化あり 低ビットレートでも高音質 ファイルサイズ 大きい 小さい 同じ音質の場合MP3より大きい 互換性 高い 非常に高い Apple製品との互換性が高い 用途 編集やマスター音源 軽量データの視聴や配布 軽量データの視聴や配布 音質の劣化を最小限にしながら音声データ編集やエンコードを行うた めには、非圧縮データ(WAV)を使用する必要があります
SwiftからLAMEを使うには? LAMEはC言語(Autotoolsビルド前提) Swift / iOS環境ではそのまま使用できない - #ifdefやWindows依存マクロが多い - C++互換ガード(extern "C")がない - 標準ヘッダの不足など etc… 課題 Xcodeでヘッダ認識・リンクエラーが大量発生! SwiftからLAMEを認識させるにはこれらの修正が必要!
エラー例 ヘッダ関連 ʻlame.h' le not found / stddef.h not found C/Swiftブリッジ Use of undeclared identi er 'lame̲init' リンクエラー Unde ned symbols for architecture arm64: '̲lame̲init' シンボル競合 rede nition of 'lame̲global̲ ags' fl fi fi fi fi Swiftプロジェクトでは、これらが複合してビルド不能になる
修正概要 今回の環境での修正内容 修正結果 extern "C" ガードを追加 ✅ シンボル名の崩壊防止 不要な#ifdefやWindows依存マクロ削除 ✅ iOS対応 <stdint.h> 等の標準ヘッダ明示 ✅ 型未定義エラー回避 Bridging Header経由のincludeとする ✅ import lame 不要 libmp3lame.aをリンク ✅ シンボル解決OK
LAME 3.100をiOS用に修正した結果 比較 LAME 3.100 Swift対応版 Swift互換性 ❌ なし ✅ あり iOS/Xcode対応 ❌ Autotools構成 ✅ Xcode直接ビルド可 Bridging Header対応 ❌ 不可 ✅可 そのままビルド ❌ 多数エラー ✅ 通る 使用対象 Linux / Windows Cアプリ Swift / iOSアプリ デバイス+シミュレータ両対応のLame.xcframework の生成ができた!
iOS向けの改修コード 実際に修正をしたコード詳細は以下となります。 iOS向けのLAME 3.100ビルドリファレンスとして、手順を纏 めてみました。リポジトリはGitHubで公開しています。 masaconm / masacom lame-ios-swift-reference https://github.com/masaconm/lame-ios-swift-reference
MP3エンコードまでの3つのステップ
録音完了を通知 RecordingView ↓ AudioEngineManager ↓ Noti cation ↓ EncodeVM ↓ convertToMP3 LAME fi ↓ Export fi ⭐︎ Step 1. 録音完了から通知までの処理 AudioEngineManager.stopRecording() NotificationCenter.default.post( name: .newRecordingFinished, object: fileURL ) ・WAVファイルで録音 ・URLをNoti cationCenterで通知
RecordingView ↓ AudioEngineManager ↓ Noti cation ↓ EncodeVM ↓ convertToMP3 LAME ↓ Export fi ⭐︎ Step 2. MP3エンコード ViewModelで変換処理を呼び出す encodeVM.convert(wav: wavURL, kbps: 192) Point convertToMP3(). 内で 1. WAVファイルを読み込み 2. LAMEを使ってMP3エンコード 3. MP3ファイルを書き出し XCFramework化したことでLAMEを呼び出せる
RecordingView ↓ AudioEngineManager ↓ Noti cation ↓ EncodeVM ↓ convertToMP3 LAME ↓ Export fi ⭐︎ Step 3. 変換後のファイル出力 .fileExporter( document: ExportedAudioFile( url: mp3URL, format: .mp3_192 ), contentType: .mp3 ) エクスポート時に、UIで任意 の音声ファイル形式を選択 (WAV, MP3 192 bps, 320 bps 等)
まとめ MP3エンコーダー LAME 3.100 本体を iOS/Swift で使用する為に は、Cコードのヘッダー改修が必要となるが実装可能でした。 iOS向けに修正を行なった改修コード差分や、ビルドスクリプト、 手順などの詳細は以下をご参照ください masaconm / masacom lame-ios-swift-reference https://github.com/masaconm/lame-ios-swift-reference
参考ドキュメント About LAME https://lame.sourceforge.io/about.php LAME Ain't an MP3 Encoder https://github.com/lameproject/lame.git テクニカラー 社とフラウンホーファーIISのライセンス・プログラム終了についてオーディオ・ブログ(英語) https://www.audioblog.iis.fraunhofer.com/mp3-software-patents-licenses Hydrogenaudio (MP3品質比較): https://wiki.hydrogenaud.io/index.php?title=LAME LGPLライセンス: https://www.gnu.org/licenses/lgpl-3.0.html