有馬総一郎のブログ

(彼氏の事情)

2021年02月20日 21:20:45 JST - 9 minute read - Audio Player

moraで購入したAAC(mp4)はStrawberry Music PlayerからSubsonic経由よる検索・再生ができない

私は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経由だと何故か認識されない。

Strawberry Music Player
ローカルファイルなら検索可
Strawberry Music Player
ローカルファイルなら再生可
Strawberry Music Player
Subsonic経由だと認識しない

AndroidアプリであるSubsonic、 Ultrasonic、HTML5によるSubFireでも検索、再生可。

Ultrasonic
ビットレートが取得できないが検索・再生可
SubFire

始めは拡張子のmp4ファイルを音楽ファイルとして認識させていなかったからかと思った。後でm4aに変更して、SubsonicのDBを一度から作り直したけど駄目(当然、Subsonicからはちゃんと検索、再生可)。

更にrm ~/.local/share/straberry/strawberry/strawberry.db*してデータベースを削除して、再度取り込ませも駄目。

Strawberryに限った話だしなぁ、と諦めるか、もしくはネットワークドライブをマウントして使う方法もあるのだけど…やはりSubsonic経由で再生したい!

moraとiTunesで同じ音声フォーマットなのに挙動が異なる

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にオーディオ変換をかけずに転送したファイルは、認識するようになることが判明。

Strawberry Music Player
MediaGoで転送したファイル

おおーと思ったが、認識するファイルと認識しないファイルが存在する。

転送前と転送後で差分を取ると結構な違いが出た。なんと転送すると、悪名高き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で転送したファイルを モーラその後に かけたらどうだろうか?と試す。つまりこうなる。

  1. MediaGoで転送
  2. モーラその後に にかける

すると、Strawberryでもめでたく認識されるようになったではないか!?やった人類の勝利だ!

Strawberry Music Player
MediaGoで転送して、モーラその後に

と思ったのも束の間。なんと再生できなくなっていた。それもStrawberryどころかfoobar2000でも再生できない。これはコンテナだけでなく、AACもおかしくなったのか…

Strawberry Music Player
MediaGoで転送して、モーラその後に

パトラッシュ ぼくは疲れたよ

なら 1. MediaGoで転送 だけで認識するファイルだけを、とか思ったが、疲れた。

foobar2000: Free Encoder Packをインストールして、更にiTunesをインストールすれば、Apple AACでエンコードできるらしい。しかし、Microsoft StoreのiTunesインストールはやはり駄目だった。

なので、公式サイトからダウンロード不可になったNero AACで再エンコードかけた。音質の劣化?大丈夫、私には検知できない。

今後は、moraで購入するのは、どうするか?でもiTunes Storeでもダウンロード販売やめるんだよね?ならAmazon mp3が一番良いのかな…


  1. Version 0.8.5 ↩︎

  2. いつから無くなったのはちゃんと確認してない。そもそも時機によるものなのか提供者によるのか。 ↩︎

  3. 何故か、E・Z・OのFire Fireというアルバム、FLATBACKERの餌 -ESA-はNGになる。山田雅樹の呪いか? ↩︎