iPod classic用にバッチファイルを作成(2025.10.10改訂)

先日エンコードした.mp4/.m4vの中に時々ブチッというノイズが出るファイルがありました。特に元ファイルが.mkvだったものが多いと感じました。

何とかしなければと思い、様々な設定を追い込んでみました。

そんな記事です。あくまでもiPod classic用の設定であることはご了承ください。

動作環境はWindows 11 Homeです。Windows PowerShellを使っています。

iPod classic用の設定でなぜノイズが発生するのか

これについてはいくつか検討がついていました。

  1. HandbrakeとiTunesでエンコードを2回かけているということ
  2. 音声ファイルの故障
  3. 元ファイルの音声がFLACだったこと

この3つが主な原因だと思います。

エンコードを1回にしてみる

2回エンコードが悪い、それならばFFmpegで一度にやってしまおうという考えです。

元ファイルはinput.mkvで出力ファイルはoutput.m4vとします。

ffmpeg -i "input.mkv" -c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -vf "scale=640:480" -r 30 -c:a aac -b:a 160k -ac 2 -ar 44100 "output.m4v"

これで一度に変換できます。オプションが多いので少し説明します。

  • -i :入力ファイルを指定する
  • -c:v :映像コーデック
  • -profile:v :映像コーデック、特にH.264のエンコードプロファイルを指定する
  • baseline -level 3.0 :baselineは古く低スペック端末用、-level 3.0とセットでiPod classicに対応させることができる
  • -pix_fmt :色の表現方法、yuv420pは古い端末と相性がいい
  • -vf :映像フィルタ、”scale=幅:高さ”を指定できる
  • -r :フレームレート、iPod classicは30固定です
  • -c:a :音声コーデック、今回はAACを指定しています
  • -b:a :音声ビットレート、AAC LC。
  • -ac :オーディオチャンネル、1ならモノラル、2ならステレオです
  • -ar :音声サンプリングレート、44100kはiPod classicの限界、48000kまでいけるかも
  • ” ” :ファイル名の前後につけている理由は日本語が入っている場合、” “でくくらないとエラーになるからです

このような感じのオプションをつけてみました。何だか試行錯誤していたらてんこ盛りになってしまいました。もう少し絞れるのかな。

が、しかしノイズは出てしまいます。次に期待します。

音声が壊れていないかチェック

まずは音声ファイルが壊れていないか、.mkvファイルから.wavファイルを切り離します。

ffmpeg -i "E:\iTunes\Movie\input.mp4" -vn -acodec pcm_s16le "E:\iTunes\Movie\input.wav"  

そしてオプションは次のようなものを使ってみました。

  • -vn :Video None、入力ファイルから映像を無視します
  • -acodec :Audio Codecを指定します。今回はpcm_s16leを指定しています。使い方は-c:aと似ていますが、-c:aはより新しい記述の仕方です。今回は古い機器なので-acodecを使ってみました。
  • pcm_s16le :pcmはPulse Code Modulation、圧縮無しのリニアPCM方式でWAVによく使われます。s16は-signed 16-bit、符号付き16ビット整数で音声データを表現する。leはLittle Endionは先ほどの16bitの並び順をリトルエンディアンで格納する方式で、Intel系CPUで使われます。今回はWindows PCでCPUがIntel製なので使ってみました。
  • -arと-ac :前述の通り音声データのサンプリングレート(44.1k)とステレオ指定(2)です。

これPowerShellで実行すると、数秒で.wavファイルが生成されます。

この出力されたファイルをiTunes上で鳴らし、そして同期したiPod classicのミュージックで再生してみました。当たり前ですが、ノイズはどこにも発生しませんでした。

ということは、iPod classicのノイズは元データの音声データが問題だったわけではないとわかりました。

映像をエンコードすると同時に音声データを統合する

音声データに問題がなかったため、映像をエンコードして音声データと統合して.m4vにしてみることにしました。

ffmpeg -i "input.mkv" -i "output.wav" -c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -vf "scale=640:480" -r 30 -c:a aac -b:a 160k -ac 2 -ar 44100 "output.m4v"

オプションは先に使ったものばかりです。説明は省きます。FlacからWAVを経由してAACにした感じです。

結果から言うと失敗でした。iTunes上ではノイズがなかったのですが、iPod classicでは決まった場所で必ずノイズが入ります。それにファイルサイズがかなり大きくなってしまいました。

しかし、めげずに追い込んでみたいと思います。

ffmpeg -i "input.mkv" -i "output.wav" -map 0:v:0 -map 1:a:0 -c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -vf "scale=640:480" -r 30 -c:a aac -b:a 160k -ac 2 -ar 44100 "output.m4v"

今度はオプションに-mapを追加してみました。

  • -map 0:v:0 :これは一番上の映像ストリームだけを出力するという意味です。0は最初の入力ファイル(-i)、-vはビデオストリームを指定、最後の0はその中の一番目の映像ストリームだけという意味です。
  • -map 1:a:0 :これは音声トラックです。最初の1は2番目の入力ファイル(-1、入力ファイルは0,1,2と0が1番目を表す)、aはオーディオストリーム、最後の0はその中の一番目の音声ストリームだけという意味です。

-mapで明示的に指定しないとFFmpegは最後に指定した音声のみを出力する可能性がありました。あまり関係がないと思うので期待はしていません。

当然のことながらノイズはおさまりません。

問題の切り分けと試考

一度エンコードから離れて、なぜ現在のiPod classicだけでノイズが発生している状況について一度整理してみます。

ノイズの発生条件

  • WAV :iTunes/iPod classicで再生しても問題なし
  • MKV + WAVをM4V(映像と音声を合体):iPod classicでノイズ発生

これらが表すことはエンコードしたデータがiPod classicの対応フォーマットの制約に引っかかっている可能性がとても大きいです。

iPod classicの公式スペック

一応Appleの発表していたiPod classicの公式スペックも調べてみました。

  • 映像
    H.264/MPEG-4、最大2.5Mbps、解像度の最大値640×480、フレームレートの最大値30fps、ProfileはH.264 Baseline Level 3.0以下
  • 音声
    AAC-LCまたはMP3、サンプリングレート44.1kHz

問題の洗い出し

映像はiTunesおよびiPod classicで問題ありません。つまりiTunesではノイズが発生せずiPod classicでのみノイズが発生するということは、音声データに問題があるということです。

  • 音声がPCM/WAVのまま残っている説
    昔のiPodがサポートしているのはAAC LCかMP3のみ
  • 音声エンコード方式が合っていない説
    -c:a aacはFFmpeg独自のAAC エンコーダを使っているので、Apple製品と互換性が完璧なApple AAC(qaac)に変えてみる

最も確実そうな音声エンコード方式を変えてみることにします。

Apple AAC(qaac)で音声をエンコードしてみる。

qaacはApple CoreAudioのフレームワークを利用したエンコーダです。Windowsで使いたい場合はiTunesかQuickTimeのライブラリが必要になります。Macは標準で入っていたはずです。

GitHubでqaac本体をダウンロードして適当なところへ.zipを解凍します。ここでは仮にC:\tools\qaac\に置いたことにします。

そしてPowerShellで一時的にパスを追加します。qaacフォルダを指定することが大事です。

$env:Path += ";C:\tools\qaac"

これでqaac –checkと打ち込み、バージョン情報が表示されれば導入成功です。

音声データをqaacで変換してみる

先にやった通り映像と音声を切り離し、音声をqaacでAAC-LCに変換し、また映像と結合します。

# 映像からWAVを切り離す
ffmpeg -i "input.mkv" -vn -acodec pcm_s16le "output.wav"
# qaacでAAC-LCに変換
qaac "output.wav" --tvbr 55 -o "output.m4a"

オプションの–tvbrはエンコード方式をTrue Variable Bitrateにすることを意味しています。Apple CoreAudio AACによる最も自然な品質モードがiPod classicに優しいのではないかと。

オプション-oをつけ忘れると出力されずに元WAVの拡張子が.m4aに変わるだけで意味が無くなってしまうものです。忘れずに。

# 映像と結合
ffmpeg -i "input.mkv" -i "output.m4a" -map 0:v:0 -map 1:a:0 -c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -vf "scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2" -r 30 -c:a copy "output.m4v"

音声ファイルが.m4aになっているところだけ注意してください。

“scale=”の部分にある640:480の数字を再生したい機器の横と縦のサイズに合わせれば、そのように変換されると思います。

結果:大成功

大成功でした。qaacでエンコードしたところiPod classicでノイズが発生しなくなりました。

結局のところ、qaacでエンコードされたものはApple製品との互換性が完璧のようで、古いiPod classicならば最初からqaacを使うべきでした。

結論

# 音声をWAVで抽出
ffmpeg -i "input.mkv" -vn -acodec pcm_s16le "output.wav"

# qaacでAAC-LC に変換
qaac "output.wav" --tvbr 55 -o "output.m4a"

# 映像と結合
ffmpeg -i "input.mkv" -i "output.m4a" -map 0:v:0 -map 1:a:0 -c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -vf "scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2" -r 30 -c:a copy "output.m4v"

ファイルサイズも抑えられて、これで一件落着です。

iPod classicに対応したエンコード
iPod classicに対応したエンコード

バッチファイルの調整完了

ひとつひとつ動画をiPod classic用にエンコードをしていたのですが、とても面倒くさいことに気が付きました。

そこで、同じフォルダにあるものを全て同じ設定でアウトプットできないか試してみました。もちろんタイトルはそのままでファイルサイズを抑えたものです。

色々悩みましたが、これで最終稿とさせていただきます。(2025.10.10)

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

:: ============================================
:: 設定
:: ============================================
set "FFMPEG=ffmpeg.exeのフルパス"
set "QAAC=qaac.exeのフルパス"

echo ============================================
echo mkv-wav-m4a-m4v 変換 for iPod Classic
echo ============================================

:: ffmpeg / qaac の確認
if not exist "%FFMPEG%" (
    echo ffmpeg パスを確認。
    pause
    exit /b
)
if not exist "%QAAC%" (
    echo qaac パスを確認。
    pause
    exit /b
)

:: フォルダ内の .mkv を順番に処理
for %%A in (*.mkv) do call :ProcessFile "%%A"

echo ============================================
echo 完了
echo ============================================
pause
exit /b

:ProcessFile
set "input=%~1"
set "name=%~n1"
set "wav=%name%_jpn.wav"
set "m4a=%name%_jpn.m4a"
set "out=%name%.m4v"

echo --------------------------------------------
echo 処理中: %input%
echo --------------------------------------------

:: 1. 日本語音声抽出(最初の日本語トラックのみ)
"%FFMPEG%" -y -i "%input%" -map 0:a:m:language:jpn -vn -acodec pcm_s16le -ar 44100 -ac 2 "%wav%"
if not exist "%wav%" (
    echo 日本語トラックないのでスキップ。
    goto :eof
)

:: 2. WAV → M4A (qaac --tvbr 55)
"%QAAC%" "%wav%" --tvbr 55 -o "%m4a%"
if not exist "%m4a%" (
    echo M4A 作成失敗
    del "%wav%" >nul 2>nul
    goto :eof
)

:: 3. MKV+M4A-M4V for iPod Classic
"%FFMPEG%" -y -i "%input%" -i "%m4a%" -map 0:v:0 -map 1:a:0 ^
-c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p ^
-vf "scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2" -r 30 ^
-c:a copy "%out%"

:: 4. WAV削除
del "%wav%" >nul 2>nul

echo 完了: %out%
echo.
goto :eof

映像のサイズを変更したい場合は”scale=”の数字をいじってください。

一応、自動でエンコードしてくれるようになりました。しかしアスペクト比に関しては若干気になるところがあります。おそらく、iPod classicの上下に挿入される黒帯のせいかなと思います。

コメント