7

私は素晴らしいClingライブラリを使用して、UPnP デバイスのネットワークをスキャンしています。私の目標は、小さな DLNA ライブラリ ブラウザーをまとめて、テクノロジーを学べるようにすることです。これまでのところ、1. ネットワークをスキャンして接続された UPnP デバイスを取得する、2. 各リモート デバイスをスキャンして DLNA サービスが実行されているかどうかを判断する、3. 既知のノードの直下の子を参照することができました。要するに、これはこれらすべてを実行できる私の方法です:

    public void remoteDeviceAdded(Registry registry, RemoteDevice device) {
        logger.debug("remote device added: {}[{}]", device.getDetails().getFriendlyName(),
            device.getType().getType());

        if (device.getType().getType().equals("MediaServer")) {         
            for (RemoteService service : device.getServices()) {
                if (service.getServiceType().getType().equals("ContentDirectory")) {
//              '1' is Music, '2' is Video, '3' is Pictures
                    this.service.getControlPoint().execute(new Browse(service, "3", BrowseFlag.DIRECT_CHILDREN) {
                        @Override public void received(ActionInvocation arg0,
                                DIDLContent didl) {
                            logger.debug("found {} items.", didl.getItems().size());
                        }

                        @Override public void updateStatus(Status arg0) { };

                        @Override public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) { };
                    });
                }
            }
        }
    }

私は知っています、それはおそらくひどい混乱のように見えますが、それは機能します:) デバッガーにドロップすると、何が得られたかがわかります。ただし、こちらのガイドの指示とは異なり、実際のメディア アイテムは返されず、ブラウズ結果のストレージ ディレクトリのみが返されます。DLNA は次のように階層に編成するため、この種のことは理にかなっています。

Music
    All Music
    Artists
        Fleetwood Mac
        ...
    Albums
    ...
Video
    All Video
    Folders
...

私の質問は、これらのフォルダーを参照して階層をたどる最も簡単な方法は何ですか? 探していた UPnP DLNA サーバーに既に接続していますが、これらのルート ストレージ ディレクトリを取得するにはどうすればよいですか? 上記のブラウズ コマンドでは、"Music" や "Video" などを取得するために、インデックスの文字列表現を実際に渡す必要があります。最上位のストレージ ディレクトリを取得するにはどうすればよいですか。次に、これらのディレクトリのそれぞれを参照するにはどうすればよいですか? 私の目標は、少なくとも単純なブラウザーを構築することです。

4

1 に答える 1

8

わかりました。Cling メーリング リストの助けのおかげで、私は自分の質問に答えることができるようになりました。

どうやら、DLNA のすべての要素には、Cling で参照できる一意の ID 番号があります。をフェッチするに/は、ノード「0」をリクエストする必要があります。アクセスするに/../は(頂点より一段高い!?)、ノード「-1」をリクエストします。DLNA 仕様は存在しないため、この問題については価値がありません。これは慣例によるものです。したがって、ノード「0」を要求すると、実際には最上位のノードが取得されるはずですが、誰が知っているのでしょうか? それはあなたを赤いニシンや狂犬病のヘラジカ、あるいは世界の終わりにするかもしれません. リスクは私たちが生きているものですよね?

いずれにせよ、DLNA「ファイルシステム」の種類は次のように機能します。

/[0]
    Browse Folders/[1]
    Music/[2]
        All Music/[5]
            Heart Is Hard To Find[6]
            ...
        ...
    Pictures/[3]
    Video/[4]

したがって、ノード「5」である「すべての音楽」を順番にブラウズしたい場合は、最初に「0」を要求し、子コンテナを表示してから、ユーザーの操作でノード「2」をブラウズし、次にブラウズします。ユーザー操作でノード「5」を選択してから、探している実際のファイルであるノード「6」を選択し、それに対して何らかのアクションを実行します。

DLNA の仕組みを理解することは、これらすべてを容易にする上で重要です。すべての重要なものは HTTP 経由で提供され、ピアの検出は UPnP 経由で容易になります。まず、ネットワーク上のすべての UPnP クライアントを見つけてから、すべてのクライアントを並べ替えて、どのクライアントが DLNA を実行しているかを判断してから、ブラウジングを開始します。探しているものを見つけたら、HTTP 経由でストリーミングして再生します。勝つための理論。

于 2011-02-04T01:31:22.723 に答える