XLDでFLACからApple Lossless(以下ALAC)に変換した曲がウォークマン(NW-A40)で再生すると最後の数秒間になると”再生できません。未対応の形式です。”1とエラー吐いて再生停止されるのでXLDじゃなくてffmpegでALACにエンコードしてみるかということで以下のようにコマンドを叩いたわけですが泥沼にはまりました。
Contents
環境情報
- 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で検索、で辿り着いたのがこちら(日本語のサイトは全滅でした)。
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で変換するかとも思いましたが
エンコード無理なんかい。
あと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に変換するとエラー出ないで再生できました。予想通りではあったが謎。
コメントを残す