この記事は公開から4年以上経過しています。
Linux上に沢山ある音楽ファイルをまとめて別のフォーマットに変換したい事情があったため、そのときの対応の備忘録です。
この手の変換ツールは調べれば何かあると思いますが、単発の要件であれば自分で作ってしまったほうが早いです。
ちなみに、今回はLinux上での利用を前提としているためVisualStudioCodeと.NET Coreのコンソールアプリケーションで作成しましたが、.NET CoreとFFmpegが動けば他のプラットフォームでも利用可能です。
また、.NET Coreプロジェクトの作成方法等については、インターネットで検索すれば分かりやすく説明されていますので、ここでの説明は割愛します。
Pythonバージョンは「PythonのPydubを使ってmp3をwmaに一括変換する方法」をご参照下さい。
このプログラムはファイル書き込み操作を行います。ファイル喪失等にも繋がりかねないため、プログラム実行の際は、充分にご注意下さい。
また、変換することだけが目的であるため、エラー処理等は一切実装していません。
サンプルソースコード
今回のサンプルソースではMP3
からWMA
に固定変換していますが、単なるバッチ処理なので少し修正すれば別のフォーマットへの変換やビットレートだけ変更するなどのカスタマイズにも対応が可能です。興味がある方はFFmpegの解説サイト等をご覧ください。
// Program.cs
using System;
using System.IO;
using System.Diagnostics;
namespace MP3ToWMA
{
class Program
{
static void Main(string[] args)
{
// 入力ディレクトリ名を引数から取得
var currentDir = args[0];
Console.WriteLine($"'y'を押すと{currentDir}のファイルの変換を開始します");
if (Console.ReadKey().Key != ConsoleKey.Y)
{
Console.WriteLine("処理を中止しました");
// 終了 ※制御フローに逆らわないgoto使用
goto END;
}
// 出力ディレクトリ名を同階層から取得、無ければ作成
var outputDir = Path.Combine(currentDir, "wma");
if (!Directory.Exists(outputDir))
Directory.CreateDirectory(outputDir);
// MP3ファイルを入力ディレクトリから列挙
var sourceFilePaths = Directory.EnumerateFiles(currentDir, "*.mp3");
foreach (var sourceFilePath in sourceFilePaths)
{
// 拡張子を除くファイル名部分だけ取得
var baseFileName = Path.GetFileNameWithoutExtension(sourceFilePath);
// 出力ファイルパスを作成
var destinationFilePath = Path.Combine(outputDir, $"{baseFileName}.wma");
// FFmpegでMP3→WMA(128k)に変換
Console.WriteLine($"{baseFileName}の処理を開始");
Process.Start("ffmpeg", $"-i \"{sourceFilePath}\" -vn -ac 2 -ar 44100 -ab 128k -acodec wmav2 -f asf \"{destinationFilePath}\"").WaitForExit();
Console.WriteLine($"{baseFileName}の処理が終了");
}
Console.WriteLine("処理が完了しました");
END:
Console.ReadKey();
}
}
}
使い方
ビルドしたdllを実行する際に、第一引数に処理対象のMP3ファイルが格納されているディレクトリを指定します。
変換結果ファイルは上記ディレクトリ内にwma
というディレクトリを作成し、そこに同名(拡張子はwma)で格納します。
dotnet MP3ToWMA.dll "入力ファイルのあるディレクトリパス"
参考ウェブサイトなど
- Qiita
[ffmpeg] 音声形式の変換方法まとめ
以上です。