[Mac]FFmpegで曲ファイルをApple Lossless(ALAC)に変換する

XLDでFLACからApple Lossless(以下ALAC)に変換した曲がウォークマン(NW-A40)で再生すると最後の数秒間になると”再生できません。未対応の形式です。”1とエラー吐いて再生停止されるのでXLDじゃなくてffmpegでALACにエンコードしてみるかということで以下のようにコマンドを叩いたわけですが泥沼にはまりました。

環境情報

  • macOS 10.15.7
  • ffmpegはHomebrewでインストール
  • Homebrew 3.0.1
  • ffmpeg version 4.3.1 Copyright © 2000-2020 the FFmpeg developers built with Apple clang version 12.0.0 (clang-1200.0.32.29)

留意事項

  • 以下コマンドはaudio.flac(FLAC)をaudio.m4a(ALAC)に変換するもの
  • FLACで上手くいかなすぎてAIFF>ALACも試したので一部コマンドは変換元が.aiffになっている
  • 冒頭のエラー出た曲ファイルはBoothからDLしたもので本ページスクリーンショットの曲とは異なる

紆余曲折とかいいんで結論はよ

  • Homebrewインストール済み
  • brew install ffmpegでffmpegをインストール済み の状態で、ffmpegで曲をApple Lossless(ALAC)に変換するには
ffmpeg -i [変換したい曲のパス] -acodec alac -vcodec copy [変換後のファイルパス]

複数やりたい場合はワイルドカード(*.flacとか)で指定する(検索すれば出てくる)。

始まり

さてここからは結論に至るまでを書いていきます。

FLACファイルをALACファイルにffmpegで変換するため、ターミナルを開いて

ffmpeg -i audio.flac -acodec alac audio.m4a

とやったわけですが

エラー吐かれて変換できない……

苦労の履歴をバッサリ切り落としたトラブルシューティング

まあここ↓は無視するとして

[ipod @ 0x7f9c28812a00] Frame rate very high for a muxer not efficiently supporting it.
Please consider specifying a lower framerate, a different muxer or -vsync 2

ここ↓をどうにかしないといけないらしい。

[ipod @ 0x7f9c28812a00] Could not find tag for codec h264 in stream #0, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:1 -- 

さてこんな時はエラーメッセージを検索エンジンに突っ込むのが作法なのでCould not find tag for codec h264 in stream #0をBingで検索、で辿り着いたのがこちら(日本語のサイトは全滅でした)。

Could not find tag for codec h264 in stream #0 (mp4)

Check the mapping of your streams. You have 3 input streams 0:0 mjpeg (probably a cover art) 0:1 mp4 0:2 aac audio

At the moment ffmpeg tries to convert 0:0 (mjpeg) to mp4

Use the following parameters to select your streams: -map 0:1 -map 0:2

要はマッピング確認しろと。恐らくこの↓部分。

 Stream #0:0: Audio: flac, 44100 Hz, stereo, s16
 Stream #0:1: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 190x190 [SAR 1:1 DAR 1:1], 90k tbr, 90k tbn, 90k tbc (attached pic)
Stream mapping:
  Stream #0:1 -> #0:0 (mjpeg (native) -> h264 (libx264))

確かにmjpegをH264に変換してますね…

Stream #0:0がflacらしいので以下のように-map 0:0を付けてみる。

ffmpeg -i audio.flac -acodec alac -map 0:0  audio.m4a

無事変換できました。

しかしこれでは1つ問題が。タイトルなどのタグはコピーされる2のだがアートワークだけコピーされない(Stream #0:1を無視しているため)。

アートワーク画像も引き継ぐには次のようにする。

ffmpeg -i audio.flac -acodec alac -vcodec copy audio.m4a

何で画像なのにvcodecなんですかね…まあとにかく目的はこれで達成。

解決までめちゃくちゃ時間がかかったので経過を供養

これでも結構削りました

その1 -acodecを-codecと書き間違える

ffmpeg -i audio.aiff -codec alac audio.m4a

再度実行する時は上矢印キー(か^P)で補完しちゃうので中々気づかない。そしてエラー氏が以下のように「ALACなんて知らねーよ」と怒るからALAC対応してないの?と勘違いしてしまう。

Invalid encoder type 'alac'

そこでffmpegのサイト見てみると  対応OK。

次にコマンドラインで確認。

ffmpeg -encoders | grep -i apple

 エンコーダーの方も問題なし。いよいよffmpeg何も分からんになる。一応brew upgradeしたり再インストールしてみたりしたが解決するわけもなく。

因みに以下のコマンド打って「ALAC無い…」となったけどformatというのはファイルタイプ(拡張子)なのでコーデックであるALACは当然出ない。

ffmpeg -formats | grep -i -e apple -e alac

その2 VLCに頼ろうとするが非対応

じゃあ仕方ないからVLCで変換するかとも思いましたが

VLC Features Formats

エンコード無理なんかい。

あとAIFFならiTunesミュージック.appでALACに変換できるのでそのルート使うかとも思いましたが、このままもやもやしたままにするわけにも行かず……

その3 今度は-iオプションをつけ忘れる

ffmpeg audio.flac -acodec alac audio.m4a

↓エラー意訳:「引数ねえよ!!」

Output file #0 does not contain any stream

何というか救いようのない馬鹿だなこいつ。

-iをつけ忘れたことに気付き、やっと始まりの項の段階に辿り着くのでした。

終わりに

本来の目的だったはずの冒頭のウォークマンエラー問題ですが、ALACファイルをXLDでFLACに一度変換し、ffmpegで再度ALACに変換するとエラー出ないで再生できました。予想通りではあったが謎。

  1. FLACのまま再生とAIFFにエンコードして再生は問題なく可能。多分FLACだとエラー訂正が効いてALACにはエラー訂正機能がないのでエラー吐いていると予想しましたが本当のところは分からない。そんでiTu…ミュージック.appやAudacityでは普通に再生できる。
  2. 一応言及しておきますが変換元がWAVEの場合はタグは無理ですよ。これを機にタグが埋め込める(語弊がある言い方)AIFFに切り替えてみては。というかFLAC,ALACでも音変わらな……んでもないです。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Proudly powered by WordPress | テーマ: Baskerville 2 by Anders Noren

ページ先頭へ ↑