音声ファイルの簡易コーデック変換
音源をm4aからwavにしたり逆だったりと変換する。
変換ソフトウェアは、FFmpegが使いやすい。
- 無料
- 対応ファイル形式が多い
- 変換元および変換先のコーデックを、指定しなくてもある程度自動判別してくれる。
変換方法
動画や音声ファイルから、別のコーデックの音声ファイルへの変換は、基本的には以下のコマンドできる。
ffmpeg.exe -i {input_path} -vn -sn {output_path}
- i: 入力ファイル指定
- vn: 映像無し
- sn: 字幕無し
変換を頻繁に行う場合は、コマンド入力が面倒なため、バッチファイルをデスクトップなど適当な場所に置いておくとD&Dでささっと変換できる。
変換先のファイル形式を変更したければ、m4a
の部分を任意に変更すればよい。
- m4a.bat
@echo off rem 音声ファイルを.m4a(AAC)に変換 chcp 65001 setlocal enabledelayedexpansion set x=%* for %%i in (!x!) do ( ffmpeg.exe -i %%i "%%~di%%~pi%%~ni.m4a" )
chcp 65001
: ファイル名の特殊文字に対応するため、UTF-8にする- 今はもうしなくてもいいかも?
- 4-5行目: ファイル名を遅延評価する
- 複数ファイルのD&Dに対応するべくfor文を使うが、その際ファイルパスに“)“を含むとエラーになるというバッチファイルの
クソ仕様を防ぐ
もう少し様々なコマンドの紹介
抽出方法
動画と音声が一緒くたになったファイルから、音声ファイルだけをコーデックを変えずに抽出する場合は、 上記の方法では再エンコードが行われてしまう。
コーデックをコピーするオプションを付けるとよい。
ffmpeg.exe -i {input_path} -c:a copy -vn -sn {output_path} ~~~~~~~~~
その際、入力ファイルの音声コーデックによってoutput_pathに付与する拡張子が変わってくる。
-c:a copy
オプションを付けている時点で中身はオリジナルが維持されるので、ファイル名称だけの問題なのだが、何となく気持ち悪い。
ffmpegには「ffprobe」というメディアファイルを解析して情報を出力するツールも付随するので、それを使えば事前にコーデックを識別できる。
ffprobe -i {input_path}
ファイル数が少なければ手動で設定してもいいし、 コーデックをffprobeの出力から判別してoutput_pathの拡張子を決定する簡単なプログラムをバッチか何かで組むと、自動で実態に合った拡張子を指定できる。
雑記
webm(opus)のサンプリングレート
変換先拡張子に'.webm'を指定すると、Opusという高圧縮で遅延の少ないコーデックになる。最近のYouTubeなどに使用されている。
これ、サンプリングレートが元が44100Hzなどでも48000Hzになって変換される。仕様上、44100Hzには対応していない。
リサンプリングが行われてしまうので少し劣化が気になるが、とはいえ、 そもそも不可逆圧縮にかけている時点で劣化は避けられないので、そういうものと割り切る。
AACの高音質エンコーダ
AACへの変換は、FFmpegに内蔵されるエンコーダでもある程度は高品質だが、 Fraunhofer FDK AACというAndroidなど向けにオープンソースで開発されているエンコーダを使えばよりよい音質になると言われている。
これ、ライセンスの関係上FFmpegには同梱できないらしく、使いたければ同梱したFFmpegを自前でビルドする必要がある。 (Windowsで自前ビルド……何とも環境構築でハマる嫌な予感がする)
とはいえ、最近はWindowsでもWSLが使えるし、自動ビルドツール(ffmpeg-windows-build-helpers)もあるので、その通りになぞらえればよい。
- WSL(Windows Subsystem for Linux)にてUbuntu 18.04以降を用意
- 何はともあれアップデート
sudo apt update && sudo apt upgrade
- ffmpegビルドツールをダウンロード
cd ~ git clone https://github.com/rdp/ffmpeg-windows-build-helpers.git cd ffmpeg-windows-build-helpers
- 必要なソフトをインストール
sudo apt install -y subversion curl texinfo g++ bison flex cvs yasm automake libtool autoconf gcc cmake git make pkg-config zlib1g-dev mercurial unzip pax nasm ragel gperf autogen bzip2 autoconf-archive p7zip-full meson python3-distutils
- mesonに関してはUbuntu18.04の標準レポジトリにビルドツールの求めるバージョンが無いので、個別パッケージからインストール
wget http://archive.ubuntu.com/ubuntu/pool/universe/m/meson/meson_0.49.0-2ubuntu1_all.deb dpkg -i meson_0.49.0-2ubuntu1_all.deb
- なんかよく分からんけど干渉するらしい機能を無効化
sudo bash -c 'echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop'
- やっとビルド(時間かかる)
./cross_compile_ffmpeg.sh --build-ffmpeg-static=y --build-intel-qsv=y --disable-nonfree=n --ffmpeg-git-checkout-version=n4.2.2
- オプションについて
–build-ffmpeg-static=y
- ビルドすると ffmpeg, ffplay, ffprobe という3つのexeができるが、ライブラリを共有化しない(それぞれexe単独で動く)
–build-ffmpeg-shared=y
- ライブラリを共有化する(ライブラリと同じフォルダに置かないと動かないが、容量を軽くできる)
–build-intel-qsv=y
- Windows XP以前では使えないが、IntelのCPU機能を使って速く動画処理できるようにする
–disable-nonfree=n
- 本項目のメイン。フリー配布できないライセンス(FDK AAC含む)を同梱してビルドする
–ffmpeg-git-checkout-version=n4.2.2
- その時の最新版を入れる
- ファイルの実体があるパスを確認する
- レジストリの
HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss\{###SID###}\BasePath
に、WSLのルートのある場所が記録されている
- exeを取り出し、適当な場所にコピーする
- 例: (WSLルート)\home\(ユーザ名)\ffmpeg-windows-build-helpers\sandbox\win64\ffmpeg_git_with_fdk_aac_n4.2.2
- sharedでビルドした場合は
ffmpeg_git_with_fdk_aac_n4.2.2_shared\bin
の中身を丸ごとコピーすれば使える