実現したいことは、
・LAN内でPCを立ち上げておいて、スマホからPCにアクセスして
ストリーミングで音楽を聴きたい。
・iTunesのプレイリストを認識させたい。
まず1点目ですが、
MediaPlayer というクラスを生成するときに、
パラメータで http://a.b.c/music.mp3 のようなURLを渡せば
勝手にネットからダウンロードして再生してくれるみたいだったので、
PCにWebサーバを立ち上げて、MP3が保存されている場所を
公開ディレクトリにして、URLでアクセスしちゃえばいいかな、と。
そしたら、これが動かなくて四苦八苦しました。
色々調べてても「httpでは動かない」みたいなのが多いし。
エラーコードが -1004 と表示されるんですが、何が何やら。
パケットキャプチャしても、ポート80番は何も採れないし。
ポート番号を限定せずにキャプチャして、
ようやく止まってる場所が分かりました。
なぜか、DNSの名前解決が変なIPアドレスに向かってました・・・
ホスト名のところを、IPアドレス直書きにしたら動きました。
何か設定でもあったんですかね、これ。。。
これで少し光が見えました。あとは何とかゴリ押し(?)で、
プレイリストの曲順でファイル名を順次生成して、
MediaPlayerに渡して再生すれば、行けそうです。
次に2点目(iTunesのプレイリストの認識)です。
まず、iTunesのプレイリストって、普通にXML形式で
保存されてるんですね。
でも、これがかなり大きなファイルで、
私のところでは 35MB 以上に膨れ上がってます。
Javaは経験が浅いので、データ加工するのはPC側にして、
Java側ではおいしいところだけ利用する方式にします(笑)。
JavaからPCに、HTTPのGETでリクエストし、
パラメータに応じてプレイリストのデータを返す感じに
したいと思います。
そうすれば、PC側で得意のPerlが使えますので。
プレイリストのXMLをのぞいてみると、データが大きすぎて
どんな構造になってるかイマイチ把握できない・・・
DTDも確認しましたが、当たり障りのないDTD。
これなら正直、JSONでも良くね?って感じです・・・
ざっくり言うと、ライブラリとプレイリストに分かれてて、
ライブラリは1曲1曲の情報、プレイリストはTrackIDのリスト。
プレイリストのフォルダ構造はどうなってるのかな。。
このXMLは、dict っていう要素があるんですが、
dict の子供には、key と、integer や string などの
プリミティブな型の要素がペアで並んでて
(dictの入れ子などもありますが)所謂「連想配列」みたいです。
これをそのまま XML::Simple モジュールで読み込ませると、
同じ要素が配列で纏められてしまうので、
key 要素は key 要素で配列に、プリミティブな型は
それぞれで配列になってしまい、キーと値の組の情報が
失われてしまいます・・・
なので、真面目に XML::Parser で要素を1つずつ抽出し
自分でハッシュを構築していくしかありません。
ここのロジックは、多少苦労はしましたが何とかクリア。
全てのデータを1変数に纏め、Dumperで出力すると
データ量は 22MB ぐらいに落ちました。
このデータを全て使うわけではないので、
もう少しスリムになると思いますが、
スマホ側では、これを一度に全部読み込ませる他ないかな。
結局、プレイリストのデータだけ渡しても、
その後再生するために、曲のデータ(曲名や保存場所など)は
ライブラリ側のデータを見て探さないといけないので。
アプリから「更新」の操作をすると、
このデータを取りに行って、内部のデータを更新する仕組みを
入れればOKですね。
あとは、アプリの画面からプレイリストを選択して、
その順番に曲を再生しに行くところを作ったら、
ひとまず動くものは出来そうです。
・LAN内でPCを立ち上げておいて、スマホからPCにアクセスして
ストリーミングで音楽を聴きたい。
・iTunesのプレイリストを認識させたい。
まず1点目ですが、
MediaPlayer というクラスを生成するときに、
パラメータで http://a.b.c/music.mp3 のようなURLを渡せば
勝手にネットからダウンロードして再生してくれるみたいだったので、
PCにWebサーバを立ち上げて、MP3が保存されている場所を
公開ディレクトリにして、URLでアクセスしちゃえばいいかな、と。
そしたら、これが動かなくて四苦八苦しました。
色々調べてても「httpでは動かない」みたいなのが多いし。
エラーコードが -1004 と表示されるんですが、何が何やら。
パケットキャプチャしても、ポート80番は何も採れないし。
ポート番号を限定せずにキャプチャして、
ようやく止まってる場所が分かりました。
なぜか、DNSの名前解決が変なIPアドレスに向かってました・・・
ホスト名のところを、IPアドレス直書きにしたら動きました。
何か設定でもあったんですかね、これ。。。
これで少し光が見えました。あとは何とかゴリ押し(?)で、
プレイリストの曲順でファイル名を順次生成して、
MediaPlayerに渡して再生すれば、行けそうです。
次に2点目(iTunesのプレイリストの認識)です。
まず、iTunesのプレイリストって、普通にXML形式で
保存されてるんですね。
でも、これがかなり大きなファイルで、
私のところでは 35MB 以上に膨れ上がってます。
Javaは経験が浅いので、データ加工するのはPC側にして、
Java側ではおいしいところだけ利用する方式にします(笑)。
JavaからPCに、HTTPのGETでリクエストし、
パラメータに応じてプレイリストのデータを返す感じに
したいと思います。
そうすれば、PC側で得意のPerlが使えますので。
プレイリストのXMLをのぞいてみると、データが大きすぎて
どんな構造になってるかイマイチ把握できない・・・
DTDも確認しましたが、当たり障りのないDTD。
これなら正直、JSONでも良くね?って感じです・・・
ざっくり言うと、ライブラリとプレイリストに分かれてて、
ライブラリは1曲1曲の情報、プレイリストはTrackIDのリスト。
プレイリストのフォルダ構造はどうなってるのかな。。
このXMLは、dict っていう要素があるんですが、
dict の子供には、key と、integer や string などの
プリミティブな型の要素がペアで並んでて
(dictの入れ子などもありますが)所謂「連想配列」みたいです。
これをそのまま XML::Simple モジュールで読み込ませると、
同じ要素が配列で纏められてしまうので、
key 要素は key 要素で配列に、プリミティブな型は
それぞれで配列になってしまい、キーと値の組の情報が
失われてしまいます・・・
なので、真面目に XML::Parser で要素を1つずつ抽出し
自分でハッシュを構築していくしかありません。
ここのロジックは、多少苦労はしましたが何とかクリア。
全てのデータを1変数に纏め、Dumperで出力すると
データ量は 22MB ぐらいに落ちました。
このデータを全て使うわけではないので、
もう少しスリムになると思いますが、
スマホ側では、これを一度に全部読み込ませる他ないかな。
結局、プレイリストのデータだけ渡しても、
その後再生するために、曲のデータ(曲名や保存場所など)は
ライブラリ側のデータを見て探さないといけないので。
アプリから「更新」の操作をすると、
このデータを取りに行って、内部のデータを更新する仕組みを
入れればOKですね。
あとは、アプリの画面からプレイリストを選択して、
その順番に曲を再生しに行くところを作ったら、
ひとまず動くものは出来そうです。
posted at
[2]らむてが
最強かどうかは分かりませんが、2画面ですしね!
ちなみに私はバーチャルボーイのピンボールやってみたいです。
[1]しん
DSって最強のデジタルピンボール用ハードだと思ってます。
#賛同者は圧倒的に少ないのですが…(泣)