Tom’s PCparts Blog With Other Games

主に自作PCと惑星WTのネタをぶち込むブログ

バッチファイルを使ってWavファイルをFLACやALACにエンコしてやるお話

みなさまこんにちは。TOM1192です。

今回は、お世話になっているいかがわしい音声作品をエンコしてやるお話です。

話の内容上、作品は基本的にR18なモノですが、話す中身は全年齢仕様ですご安心ください。

 

 

1.きっかけ

基本的に音声作品を再生する環境がサブ機を卒業しておうち機になったiPhoneSE(1st)という関係上、音声作品をすべてiTunesで管理するわけですが、そうなった際にメタデータをもったまま取り扱えるのがMP3ないしALACのM4aあるいはAACくらいしか実はありません。

ただ、音声作品はMP3は用意してくれていてもALACなんぞは当然ながら用意はしてくれません(容量的な都合もありますし)。

とはいえ、なんだかんだWavファイルは同時に用意してくれていることは多く、高音質なデータをiTunes上でALACに変換してメタデータを叩き込めばある程度解決します。

 

で、ソレが面倒なのでどうにかこうにかバッチファイルでまとめて用意してやろうというとなったわけですね。

 

2.用意するもの

今回、エンコするために

  1. CUIなマルチエンコーダことffmpeg
  2. CUIな音声エンコーダことQaac
  3. CUIな文字変換ソフトことnkf

を用意しています。

バッチファイルは当然CUIで動かすので全部CUIでないと話になりません。

 

ffmpeg

github.com

Qaacは

github.com

nkf

www.vector.co.jp

それぞれどうぞ。

 

3.手順

音声作品によってはWavのみの可能性があるため、2種類のケースを想定しています。

3-1 Wavファイルのみの場合

この場合はまず、Wavファイルにメタデータを書き込む必要があります(場合によっては最初から書き込まれていることもありますが)

もちろんこの作業をCUIでするのはただのクソ作業なのでGUIでやるのが無難でしょう。

個人的には「AudioShell」で書き込むのが無難だと思ってます。

forest.watch.impress.co.jp

 

さて、その作業が終わったらざっと変換工程を書きます。

①Wavに入っているメタデータ・カバーイラストの取り出し

メタデータのコード変換

③Wavファイルに変換後のデータ書き込み

FLAC・ALACへ変換

⑤カバーイラストの挿入

になります。

3-1-1 Wavファイルからメタデータを別ファイルとして取り出す

最初にこの工程を挟むのはWavファイルに含まれるメタデータがShift+JISで記録されているがためにこのままエンコすると文字化けを起こすためで、それを回避するために文字情報をテキストファイルに叩き出します。

 

この時使用するのはffmpegで、コマンドは

 

ffmpeg -i 入力ファイル -f metadata 出力ファイル.txt

 

となります。

また、カバー画像は同様に

 

ffmpeg -i 入力ファイル 出力ファイル.ipg(ないしpng)

 

で出力できます。

3-1-2 取り出したメタデータffmpegが読めるように加工する

出力されたメタデータのテキストは先ほど書いたとおり、Shift+JISとなっているためコレをUnicodeに変換します。

そうすることで、ffmpegメタデータを直接読み込めるようになります。

なお、カバー画像は加工の必要はありません。

使用するのはnkfで、コマンドは

 

nkf -s -w --overwrite 入力ファイル

 

となります。

上書きの理由はfor文などでループをする際に事故が発生したためで、どうせこの過程で作ったファイルは消すので上書きでも問題ないやという結論にいたったわけです。

変換前のデータ(右下がShift+JISになっている)

変換後のデータ(右下がUnicode(UTF-8)に変わっているのがわかる)




3-1-3 変換したメタデータをWavファイルに書き込みし直す

今度はUnicodeに変換したさっきのメタデータをWavファイルに書き込みます。

タグエディタ上では文字化けを起こしますが入ってるデータは正常なのでご安心ください。

変換前のデータ(文字化けもなくきれいな状態)

変換後のデータ(画像が消えてるのはメタデータを書き込む段階で消えるため)

 

3-1-4 変換作業

ここまでくればあとは煮るなり焼くなりするのみ。

ただ、1つ注意点があって、ALACを生成する際に使うQaacがWavのFloatが取り扱えないという仕様があります。

つまり、WavのFloatは直接変換できないというわけで、コレを解消するために一度FLACを経由する手段をとっています。

Floatのままエンコを飛ばしたい場合は、メタデータを書き込まずにFLACへエンコを行い、その後にメタデータを書き込んでしまえばOKです。

ただ、この手順を取った場合、最初のFLACへ変換したファイルの置き場所を別に用意する必要があるため、少々不格好になってしまいます。

 

FLACへの変換はffmpegを使用し、

 

ffmpeg -i 入力ファイル -c:copy -ac チャンネル -ar サンプリング周波数 -ab ビットレート -acodec flac -f flac 出力ファイル.flac

 

で行います。

その後そのFLACをQaacにかけて

 

Qaac *.flac -A

 

でALACも出来上がります。

そして最後に残ったカバーイラストをffmpegでそれぞれ足して

 

ffmpeg -i 入力ファイル -i カバーイラスト -c copy -map 0 -map 1:v -disposition:1 attached_pic 出力ファイル

 

でカバーイラストとメタデータを引き継いだFLACとALACが出来上がります。

変換終了後のFLACファイル

変換終了後のALACのM4aファイル

っていうのをバッチファイルで行うのが今回のお仕事です。

 

3-1-5 バッチファイルに落とし込む

でコレをバッチファイルに落とし込むわけですが、百聞は一見に如かずという言葉がある通り、見たほうが早いです。

 

コマンドとしては、

@echo off
rem カレントディレクトリの設定
cd /d %~dp0

rem 各種フォルダ作成
mkdir cache
mkdir flac
mkdir alac
mkdir text

rem 実行に使うプログラムのセット
set qaac="..\encode\qaac64.exe"
set ffmpeg=".\encode\ffmpeg.exe"
set ffmpeg2="..\encode\ffmpeg.exe"
set nkf="..\encode\nkf.exe"

rem メタデータとカバーイラストの抜き出し
for %%f in ("*.wav") do (%ffmpeg% -y -i "%%~f" -f ffmetadata ".\text\%%~nf.txt")
for %%f in ("*.wav") do (%ffmpeg% -y -i "%%~f" ".\cache\%%~nf.jpg")

rem メタデータUnicodeに変換
cd /d .\text
for %%i in ("*.txt") do (%nkf% -s -w --overwrite "%%~i")

rem 変換したメタデータをWavに書き込み
cd /d ..\
for %%g in ("*.wav") do (%ffmpeg% -y -i "%%~g" -i ".\text\%%~ng.txt" -map_metadata 1 -c copy ".\cache\%%~g")

rem FLAC・M4a(ALAC)の作成
cd /d .\cache
for %%h in ("*.wav") do (%ffmpeg2% -y -i "%%~h" -c:v copy -ac 2 -ar 48000 -ab 256k -acodec flac -f flac "%%~nh.flac")
%qaac% *.flac -A

rem カバーイラストの取り付け
for %%j in ("*.m4a") do (%ffmpeg2% - y-i "%%~j" -i "%%~nj.jpg" -c copy -map 0 -map 1:v -disposition:1 attached_pic "..\alac\%%~nj.m4a")
for %%k in ("*.flac") do (%ffmpeg2% -y -i "%%~k" -i "%%~nk.jpg" -c copy -map 0 -map 1:v -disposition:1 attached_pic "..\flac\%%~nk.flac")


rem 作業用フォルダの削除
cd /d ..\
rd /s /q text
rd /s /q cache

となっております。

 

面倒な方向けに最後に圧縮したリンクファイルを用意します。

 

3-2 Wavファイルに加えて、MP3ファイルもある場合

この場合は基本的にMP3のほうにメタデータが入っていることが多いので、手順は幾分シンプルになります。というかnkfを使わずに実行できるのでそれ以上に楽だと思います。

理由はMP3に書き込まれているメタデータが最初からUnicodeだからで、別途変換の手間を要しません。

手順としては

①MP3に入っているメタデータ・カバーイラストの取り出し

②Wavにメタデータを書き込み

FLAC・ALACの作成

④カバーイラストの挿入

となり、1工程少なくなります。

ただ、最初の①が少々やっかいなパターンがあるので、ソレ対策のシステムを構築する必要があります。

基本的に3-1-1と手順は同じなのですが、MP3とWavファイルのファイル名が一致しないと取り出したメタデータを読み込めないという事象が発生するため、このタイミングで抽出するデータを固定値にしてしまいます。

 

手順はファイル数をカウントしてもらう必要があるのでForでのループ文を構築し、その中の変数を遅延展開してもらうことで数字だけになったメタデータのファイルを生成してもらいます。

setlocal ENABLEDELAYEDEXPANSION【遅延展開の宣言】

set /a num=0【変数の宣言】

for %%i in ("*.mp3") do (

set /a num=num+1
    %ffmpeg% -y -i "%%~i" -f ffmetadata "!num!.txt"【メタデータの取り出し】
    %ffmpeg% -y -i "%%~i" "!num!.jpg"【カバーイラストの取り出し】
    )

こうすることで、

名前を数字のナンバリングへ固定することが可能になります。

後は、ナンバリングを読み込めばOKなのでその後はほとんど変更点はありません。

 

3-2のバッチファイルのコマンド

で、実際につくったのが、

 

mkdir cache
mkdir flac
mkdir alac
mkdir text
mkdir wav
mkdir mp3

set qaac="..\encode\qaac64.exe"
set ffmpeg="..\encode\ffmpeg.exe"

echo wavフォルダ、mp3フォルダにそれぞれ同じファイルを入れてください。入れ終わったら次へ進んでください。
pause
setlocal ENABLEDELAYEDEXPANSION

set /a num=0
cd /d .\mp3
for %%f in ("*.mp3") do (
    set /a num=num+1
    %ffmpeg% -y -i "%%~f" -f ffmetadata "..\text\!num!.txt"
    %ffmpeg% -y -i "%%~f" "..\cache\!num!.jpg"
    )
rem 変換したメタデータをWavに書き込み
cd /d ..\wav
set /a num=0
for %%g in ("*.wav") do (
    set /a num=num+1
    %ffmpeg% -y -i "%%~g" -i "..\text\!num!.txt" -map_metadata 1 -c copy "..\cache\%%~g")

rem FLAC・M4a(ALAC)の作成
cd /d ..\cache
for %%h in ("*.wav") do (%ffmpeg% -y -i "%%~h" -c:v copy -ac 2 -ar 48000 -ab 256k -acodec flac -f flac "%%~nh.flac")
%qaac% *.flac -A

rem カバーイラストの取り付け
set /a num=0
for %%k in ("*.flac") do (
    set /a num=num+1
    %ffmpeg% -y -i "%%~k" -i "!num!.jpg" -c copy -map 0 -map 1:v -disposition:1 attached_pic "..\flac\%%~nk.flac"
    )
set /a num=0
for %%l in ("*.m4a") do (
    set /a num=num+1
    %ffmpeg% -y -i "%%~l" -i "!num!.jpg" -c copy -map 0 -map 1:v -disposition:1 attached_pic "..\alac\%%~nl.m4a"
    )
rem 作業用フォルダの削除
cd /d ..\
rd /s /q text
rd /s /q cache

pause

 

になります。

MP3とWavを突っ込むためのフォルダを作成した後、投入待ちを用意する必要があるので、ファイルが入ったら次に進むようにしています。

 

4.さいごに

drive.google.com

適当においておくのでご自由にどうぞ。

何か問題があればコメントしていただければ助かります。

作ってて思ったのは、遠回りしてるような気もしないということ。

ただ、楽しかったので個人的には問題なしです。

 

参考にしたサイト

①連番の処理で非常にお世話になった

qiita.com

②For文の使い方を理解するのにお世話になった

www.javadrive.jp

ffmpegにおけるメタデータやカバーイラストの取り扱いでお世話になった

www.server-memo.net

nico-lab.net