私はiPodやiPhoneを持ってないので、8年にも経って知るが、moraとiTunes Storeとで購入したのは同じAACという規格の音楽フォーマットファイルではあるが、挙動が異なる。
moraで購入したファイルがStrawberry Music Player1から認識されない
NW-ZX100でさえもiTunes Storeで購入したファイルはコピーして取り込んでも、画像が表示される。しかし、moraで購入したのは、 moraダウンローダーや、 Music Center for PCなどを使わないと表示されなかったりする。
そういったことで、何かしらiTunes Storeのm4aとは違うんだろうと思っていたが、拡張子の違いぐらいしか気にしてなかった。しかし、 AAC(m4a)をSubFireで再生できないのは、moraのファイルだけだったりする。
そして、 Strawberry Music Player(以下、Strawberry)においては、ローカルファイルとして取り込んだ場合は認識されるし、検索・再生もできるが、Subsonic経由だと何故か認識されない。
AndroidアプリであるSubsonic、 Ultrasonic、HTML5によるSubFireでも検索、再生可。
始めは拡張子のmp4ファイルを音楽ファイルとして認識させていなかったからかと思った。後でm4aに変更して、SubsonicのDBを一度から作り直したけど駄目(当然、Subsonicからはちゃんと検索、再生可)。
更にrm ~/.local/share/straberry/strawberry/strawberry.db*
してデータベースを削除して、再度取り込ませも駄目。
Strawberryに限った話だしなぁ、と諦めるか、もしくはネットワークドライブをマウントして使う方法もあるのだけど…やはりSubsonic経由で再生したい!
moraとiTunesで同じ音声フォーマットなのに挙動が異なる
moraで購入したものがiPhoneでは再生できない話は有名だったらしい。
- DRMフリー化した「mora」で楽曲購入を試す - AV Watch
- DRMフリーで320kbps! 「Mora」の曲をiPhoneで聴こう - 新・OS X ハッキング!(67) | マイナビニュース
- GitHub - gageas/MoraPostprocessor: モーラその後に
- くたさら:メディア (22) mora を iPhone で
それまで困ってなかったからだけど、9年後に知る事実。
mp4v2-utilsというツール
mp4v2-utils
を使えば、mp4ファイルの詳細な検査ができるらしいので、インストールしてみる。
mp4v2 on Ubuntu 19.10? · Issue #306 · donmelton/video_transcoding · GitHub
wget http://archive.ubuntu.com/ubuntu/pool/universe/m/mp4v2/libmp4v2-2_2.0.0~dfsg0-6_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/m/mp4v2/mp4v2-utils_2.0.0~dfsg0-6_amd64.deb
sudo apt install ./libmp4v2-2_2.0.0~dfsg0-6_amd64.deb
sudo apt install ./mp4v2-utils_2.0.0~dfsg0-6_amd64.deb
インストール成功。
いくつかコマンドを試してみる。
$ mp4info 01_One\ More\ Chance\ Is\ Enough.mp4
mp4info version -r
01_One More Chance Is Enough.mp4:
Track Type Info
1 audio MPEG-4 AAC LC, 250.450 secs, 320 kbps, 44100 Hz
Name: One More Chance Is Enough
Artist: Li-sa-X Band
Composer: Issei Ambo/ Narumi
Release Date: 2020
Album: One More Chance Is Enough / Just Be My Treasure
Track: 1 of 2
Genre: Heavy Metal
GenreType: 8192, UNDEFINED(8192)
Comments:
Cover Art pieces: 1
Album Artist: Li-sa-X Band
Short Description: JASRAC / Sony Music Entertainment (Japan) Inc.
$ mp4track --list 01_One\ More\ Chance\ Is\ Enough.mp4
track[0] id=1
type = audio
enabled = true
inMovie = true
inPreview = true
layer = 0
alternateGroup = 0
volume = 1.0000
width = 0.00000000
height = 0.00000000
language = Undetermined
handlerName =
userDataName = <absent>
moov.meta.ID32(以下ID32)というatom
2016年にmoraで購入したファイルを見ると
$ mp4file --dump 01_NO\ RETURN.m4a
・・・中略・・・
"01_NO RETURN.m4a": type meta (moov.meta)
"01_NO RETURN.m4a": version = 0 (0x00)
"01_NO RETURN.m4a": flags = 0 (0x000000)
"01_NO RETURN.m4a": type hdlr (moov.meta.hdlr)
"01_NO RETURN.m4a": version = 0 (0x00)
"01_NO RETURN.m4a": flags = 0 (0x000000)
"01_NO RETURN.m4a": reserved1 = 0 (0x00000000)
"01_NO RETURN.m4a": handlerType = <4 bytes> 49 44 33 32 |ID32|
"01_NO RETURN.m4a": reserved2 = <12 bytes> 00 00 00 00 00 00 00 00 00 00 00 00 |............|
"01_NO RETURN.m4a": name = <10 bytes> 69 64 33 76 32 2e 33 2e 30 00 |id3v2.3.0.|
"01_NO RETURN.m4a": type ID32 (moov.meta.ID32)
"01_NO RETURN.m4a": data = <124157 bytes>
"01_NO RETURN.m4a": <remaining bytes supressed>
・・・後略・・・
という風に
iTunesでCDから取り込んだ曲とMoraからダウンロードした曲を、フリーのMPEG-4分析ツール集「mp4v2」に収録のコマンドで比較したところ、「moov.meta」というatom(データブロックのこと)を発見。
moraのmp4にはmoov.meta.ID32(以下ID32)というatom(データ)が含まれています。
このatomが含まれているとiOSデバイスで再生できないことが判明しています。
で言われてるものの存在を確認できるけど、2020年のファイルを見てみたところ無くなっていた2。
$ mp4file --dump 01_One\ More\ Chance\ Is\ Enough.mp4
"01_One More Chance Is Enough.m4a": Dumping meta-information...
"01_One More Chance Is Enough.m4a": type ftyp (ftyp)
・・・後略・・・
無かった
これはAAC部分ではなく、AACを格納しているMPEG-4コンテナによる問題らしいのだけど、そこらへんがどうもキッチリ定まってないために、moraとiTunesで異なっているらしい。
それで、moraで購入したmp4ファイルを再エンコードなしでiOSデバイス(iPhone, iPod touch, iPad)で再生できるm4aに変換するツールが存在している。それが モーラその後にだ3。
実際、moov.meta.ID32というatomがないファイルを モーラその後に にかけてもファイルサイズが変わらない。そりゃそうだろ除去するatomがないのだから。
一度、MediaGoでNW-ZX100に転送したファイルだと認識する
試しにMediaGoでNW-ZX100にオーディオ変換をかけずに転送したファイルは、認識するようになることが判明。
おおーと思ったが、認識するファイルと認識しないファイルが存在する。
転送前と転送後で差分を取ると結構な違いが出た。なんと転送すると、悪名高きatom moov.meta.ID32 が付与されているのだ。やはり認識するしないは、このatomではない。
--- mp4.txt 2021-02-19 23:44:38.353701824 +0900
+++ mediago.txt 2021-02-20 00:22:34.163337907 +0900
@@ -145,19 +145,19 @@
"01_One More Chance Is Enough.mp4": <table entries suppressed>
"01_One More Chance Is Enough.mp4": type udta (moov.udta)
"01_One More Chance Is Enough.mp4": type albm (moov.udta.albm)
- "01_One More Chance Is Enough.mp4": data = <55 bytes>
+ "01_One More Chance Is Enough.mp4": data = <105 bytes>
"01_One More Chance Is Enough.mp4": type cprt (moov.udta.cprt)
- "01_One More Chance Is Enough.mp4": data = <44 bytes>
+ "01_One More Chance Is Enough.mp4": data = <84 bytes>
"01_One More Chance Is Enough.mp4": type dscp (moov.udta.dscp)
- "01_One More Chance Is Enough.mp4": data = <53 bytes>
+ "01_One More Chance Is Enough.mp4": data = <102 bytes>
"01_One More Chance Is Enough.mp4": type gnre (moov.udta.gnre)
- "01_One More Chance Is Enough.mp4": data = <8 bytes> 00 00 00 00 2a 0e 20 00 |....*. .|
+ "01_One More Chance Is Enough.mp4": data = <32 bytes>
"01_One More Chance Is Enough.mp4": type perf (moov.udta.perf)
- "01_One More Chance Is Enough.mp4": data = <19 bytes>
+ "01_One More Chance Is Enough.mp4": data = <34 bytes>
"01_One More Chance Is Enough.mp4": type titl (moov.udta.titl)
- "01_One More Chance Is Enough.mp4": data = <32 bytes>
+ "01_One More Chance Is Enough.mp4": data = <60 bytes>
"01_One More Chance Is Enough.mp4": type yrrc (moov.udta.yrrc)
- "01_One More Chance Is Enough.mp4": data = <6 bytes> 00 00 00 00 00 00 |......|
+ "01_One More Chance Is Enough.mp4": data = <6 bytes> 00 00 00 00 07 e4 |......|
"01_One More Chance Is Enough.mp4": type meta (moov.udta.meta)
"01_One More Chance Is Enough.mp4": version = 0 (0x00)
"01_One More Chance Is Enough.mp4": flags = 0 (0x000000)
@@ -176,13 +176,6 @@
"01_One More Chance Is Enough.mp4": typeCode = implicit (0x00)
"01_One More Chance Is Enough.mp4": locale = 0 (0x00000000)
"01_One More Chance Is Enough.mp4": metadata = <8 bytes> 00 00 00 01 00 02 00 00 |........|
- "01_One More Chance Is Enough.mp4": type ゥgen (moov.udta.meta.ilst.ゥgen)
- "01_One More Chance Is Enough.mp4": type data (moov.udta.meta.ilst.ゥgen.data)
- "01_One More Chance Is Enough.mp4": typeReserved = 0 (0x0000)
- "01_One More Chance Is Enough.mp4": typeSetIdentifier = 0 (0x00)
- "01_One More Chance Is Enough.mp4": typeCode = UTF-8 (0x01)
- "01_One More Chance Is Enough.mp4": locale = 0 (0x00000000)
- "01_One More Chance Is Enough.mp4": metadata = <11 bytes> 48 65 61 76 79 20 4d 65 74 61 6c |Heavy Metal|
"01_One More Chance Is Enough.mp4": type ゥday (moov.udta.meta.ilst.ゥday)
"01_One More Chance Is Enough.mp4": type data (moov.udta.meta.ilst.ゥday.data)
"01_One More Chance Is Enough.mp4": typeReserved = 0 (0x0000)
@@ -232,14 +225,6 @@
"01_One More Chance Is Enough.mp4": typeCode = UTF-8 (0x01)
"01_One More Chance Is Enough.mp4": locale = 0 (0x00000000)
"01_One More Chance Is Enough.mp4": metadata = <47 bytes>
- "01_One More Chance Is Enough.mp4": type covr (moov.udta.meta.ilst.covr)
- "01_One More Chance Is Enough.mp4": type data (moov.udta.meta.ilst.covr.data)
- "01_One More Chance Is Enough.mp4": typeReserved = 0 (0x0000)
- "01_One More Chance Is Enough.mp4": typeSetIdentifier = 0 (0x00)
- "01_One More Chance Is Enough.mp4": typeCode = JPEG (0x0d)
- "01_One More Chance Is Enough.mp4": locale = 0 (0x00000000)
- "01_One More Chance Is Enough.mp4": metadata = <738919 bytes>
- "01_One More Chance Is Enough.mp4": <remaining bytes supressed>
"01_One More Chance Is Enough.mp4": type desc (moov.udta.meta.ilst.desc)
"01_One More Chance Is Enough.mp4": type data (moov.udta.meta.ilst.desc.data)
"01_One More Chance Is Enough.mp4": typeReserved = 0 (0x0000)
@@ -251,9 +236,9 @@
"01_One More Chance Is Enough.mp4": type data (moov.udta.meta.ilst.gnre.data)
"01_One More Chance Is Enough.mp4": typeReserved = 0 (0x0000)
"01_One More Chance Is Enough.mp4": typeSetIdentifier = 0 (0x00)
- "01_One More Chance Is Enough.mp4": typeCode = UTF-8 (0x01)
+ "01_One More Chance Is Enough.mp4": typeCode = implicit (0x00)
"01_One More Chance Is Enough.mp4": locale = 0 (0x00000000)
- "01_One More Chance Is Enough.mp4": metadata = <1 bytes> 20 | |
+ "01_One More Chance Is Enough.mp4": metadata = <2 bytes> 00 8a |..|
"01_One More Chance Is Enough.mp4": type ゥprt (moov.udta.meta.ilst.ゥprt)
"01_One More Chance Is Enough.mp4": type data (moov.udta.meta.ilst.ゥprt.data)
"01_One More Chance Is Enough.mp4": typeReserved = 0 (0x0000)
@@ -261,5 +246,40 @@
"01_One More Chance Is Enough.mp4": typeCode = UTF-8 (0x01)
"01_One More Chance Is Enough.mp4": locale = 0 (0x00000000)
"01_One More Chance Is Enough.mp4": metadata = <37 bytes>
+ "01_One More Chance Is Enough.mp4": type ゥcpy (moov.udta.meta.ilst.ゥcpy)
+ "01_One More Chance Is Enough.mp4": type data (moov.udta.meta.ilst.ゥcpy.data)
+ "01_One More Chance Is Enough.mp4": typeReserved = 0 (0x0000)
+ "01_One More Chance Is Enough.mp4": typeSetIdentifier = 0 (0x00)
+ "01_One More Chance Is Enough.mp4": typeCode = UTF-8 (0x01)
+ "01_One More Chance Is Enough.mp4": locale = 0 (0x00000000)
+ "01_One More Chance Is Enough.mp4": metadata = <37 bytes>
+ "01_One More Chance Is Enough.mp4": type covr (moov.udta.meta.ilst.covr)
+ "01_One More Chance Is Enough.mp4": type data (moov.udta.meta.ilst.covr.data)
+ "01_One More Chance Is Enough.mp4": typeReserved = 0 (0x0000)
+ "01_One More Chance Is Enough.mp4": typeSetIdentifier = 0 (0x00)
+ "01_One More Chance Is Enough.mp4": typeCode = JPEG (0x0d)
+ "01_One More Chance Is Enough.mp4": locale = 0 (0x00000000)
+ "01_One More Chance Is Enough.mp4": metadata = <20985 bytes>
+ "01_One More Chance Is Enough.mp4": <remaining bytes supressed>
+ "01_One More Chance Is Enough.mp4": type free (moov.udta.meta.free)
+ "01_One More Chance Is Enough.mp4": type Xtra (moov.udta.Xtra)
+ "01_One More Chance Is Enough.mp4": type free (moov.udta.free)
+ "01_One More Chance Is Enough.mp4": type meta (moov.meta)
+ "01_One More Chance Is Enough.mp4": version = 0 (0x00)
+ "01_One More Chance Is Enough.mp4": flags = 0 (0x000000)
+ "01_One More Chance Is Enough.mp4": type hdlr (moov.meta.hdlr)
+ "01_One More Chance Is Enough.mp4": version = 0 (0x00)
+ "01_One More Chance Is Enough.mp4": flags = 0 (0x000000)
+ "01_One More Chance Is Enough.mp4": reserved1 = 0 (0x00000000)
+ "01_One More Chance Is Enough.mp4": handlerType = <4 bytes> 49 44 33 32 |ID32|
+ "01_One More Chance Is Enough.mp4": reserved2 = <12 bytes> 00 00 00 00 00 00 00 00 00 00 00 00 |............|
+ "01_One More Chance Is Enough.mp4": name = <1 bytes> 00 |.|
+ "01_One More Chance Is Enough.mp4": type ID32 (moov.meta.ID32)
+ "01_One More Chance Is Enough.mp4": data = <32187 bytes>
+ "01_One More Chance Is Enough.mp4": <remaining bytes supressed>
+ "01_One More Chance Is Enough.mp4": type free (moov.meta.free)
"01_One More Chance Is Enough.mp4": type free (free)
"01_One More Chance Is Enough.mp4": type mdat (mdat)
+ "01_One More Chance Is Enough.mp4": type uuid (uuid)
+ "01_One More Chance Is Enough.mp4": data = <31980 bytes>
+ "01_One More Chance Is Enough.mp4": <remaining bytes supressed>
認識するが再生不可に
なら、MediaGoで転送したファイルを モーラその後に かけたらどうだろうか?と試す。つまりこうなる。
- MediaGoで転送
- モーラその後に にかける
すると、Strawberryでもめでたく認識されるようになったではないか!?やった人類の勝利だ!
と思ったのも束の間。なんと再生できなくなっていた。それもStrawberryどころかfoobar2000でも再生できない。これはコンテナだけでなく、AACもおかしくなったのか…
パトラッシュ ぼくは疲れたよ
なら 1. MediaGoで転送 だけで認識するファイルだけを、とか思ったが、疲れた。
foobar2000: Free Encoder Packをインストールして、更にiTunesをインストールすれば、Apple AACでエンコードできるらしい。しかし、Microsoft StoreのiTunesインストールはやはり駄目だった。
なので、公式サイトからダウンロード不可になったNero AACで再エンコードかけた。音質の劣化?大丈夫、私には検知できない。
今後は、moraで購入するのは、どうするか?でもiTunes Storeでもダウンロード販売やめるんだよね?ならAmazon mp3が一番良いのかな…