はじめに

Cursorで製作したゲームアプリにBGMを付けた際、ファイルサイズが大きい問題を指摘されたので、 mp3をサイズダウンし軽量化するドラッグ&ドロップ対応のGUI付き Pythonスクリプトを作成しました。

製作したゲーム以下のページで遊べます。

機能要件

対象:MP3ファイルを指定のビットレートで一括変換

特徴:

  • ファイルやフォルダの ドラッグ&ドロップ に対応
  • **96kbps + モノラル化(-ac 1)**で軽量変換
  • 元ファイルは上書きせず、ファイル名に _compressed を付与
  • Windows環境前提(.pyw拡張子でターミナル非表示起動可)

Pythonスクリプト

mp3_compressor.pyw

import os
import sys
import subprocess
import tkinter as tk
from tkinter import filedialog, messagebox

# FFmpegの実行可能ファイル名(環境によってはフルパス指定)
FFMPEG = "ffmpeg"

# 出力設定
BITRATE = "96k"
MONO = True

def compress_mp3(file_path):
    base, ext = os.path.splitext(file_path)
    if ext.lower() != ".mp3":
        return
    output_path = base + "_compressed.mp3"
    cmd = [FFMPEG, "-i", file_path]
    if MONO:
        cmd += ["-ac", "1"]
    cmd += ["-b:a", BITRATE, output_path]
    subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
    print(f"✅ {os.path.basename(file_path)}{os.path.basename(output_path)}")

def process_files(paths):
    for path in paths:
        if os.path.isfile(path):
            compress_mp3(path)
        elif os.path.isdir(path):
            for root, _, files in os.walk(path):
                for name in files:
                    compress_mp3(os.path.join(root, name))

def main():
    root = tk.Tk()
    root.withdraw()
    messagebox.showinfo("MP3 Compressor", "MP3ファイルまたはフォルダを選択してください")
    paths = filedialog.askopenfilenames(title="ファイル選択", filetypes=[("MP3", "*.mp3")])
    if not paths:
        return
    process_files(paths)
    messagebox.showinfo("完了", "変換が完了しました!")

if __name__ == "__main__":
    main()

使用方法

  1. 上記スクリプトを mp3_compressor.pyw として保存
  2. ffmpeg.exe が PATH にあることを確認(なければ同フォルダに配置)
  3. スクリプトをダブルクリック
  4. ダイアログでMP3を複数選択 or フォルダを選択(内部で自動探索)
  5. _compressed.mp3 が同フォルダに出力

備考

  • .pyw にしておくとターミナルが出ないので使いやすいです(Windows専用)
  • -b:a を 128k にすれば高音質にも対応
  • フォルダ全体の一括処理にも対応