Schnellstart: Streamen von Bildschirmpräsentationen mit „Wiedergeben auf“ (HTML)

[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation ]

Verwenden Sie "Wiedergeben auf", damit Benutzer auf einfache Weise Audiodaten, Videodaten oder Bilder von ihrem Computer auf Geräte in ihrem Heimnetzwerk streamen können. In diesem Thema wird erläutert, wie "Wiedergeben auf" in einer Windows Store-App verwendet werden kann, um Bilder als Bildschirmpräsentation auf ein Zielgerät zu streamen.

Ziel: Streamen Sie mit "Wiedergeben auf" Bilder als Bildschirmpräsentation auf ein Zielgerät.

Voraussetzungen

Microsoft Visual Studio

Anweisungen

1. Erstellen eines neuen Projekts und Aktivieren des Zugriffs auf Bilder

  1. Öffnen Sie Visual Studio, und wählen Sie im Menü Datei die Option Neues Projekt aus. Wählen Sie im Abschnitt JavaScript die Option Leere Anwendung aus. Geben Sie für die App den Namen PlayToSlideShow ein, und klicken Sie auf OK.
  2. Öffnen Sie die Datei Package.appxmanifest, und klicken Sie auf die Registerkarte Funktionen. Wählen Sie die Funktion Bildbibliothek aus, damit Ihre App auf den Bilderordner auf einem Computer zugreifen kann. Schließen und speichern Sie die Manifestdatei.

2. Hinzufügen einer HTML-Benutzeroberfläche

Öffnen Sie die Datei Default.html, und fügen Sie dem Abschnitt "<body>" den folgenden HTML-Code hinzu. Die UI enthält ein <div>-Element, das dazu verwendet wird, die Bilder einzublenden, und ein weiteres, das zur Anzeige von Statusmeldungen zum Einsatz kommt. Darüber hinaus enthält sie ein <div>-Element, das dem Benutzer erklärt, wie er mithilfe von "Wiedergeben auf" streamt, und eine Schaltfläche, um ihm das Trennen beim Streamen zu ermöglichen. Diese beiden Elemente sind ausgeblendet und erscheinen abhängig davon, ob die Bildschirmpräsentation gerade gestreamt wird oder nicht.

<div id="slideshowDiv" style="height:600px;display:table-cell;vertical-align:bottom;"></div>
<div id="messageDiv">Slideshow disconnected</div>
<button id="disconnectButton" style="width:600px;height:60px;display: none">
    Connected to <img id="iconImage" style="width: 30px;" /> <span id="deviceSpan" />
</button>
<div id="instructionsDiv">Swipe from the right edge of the screen, select "Devices", and select a device to stream the slide show to.</div>

3. Hinzufügen von Initialisierungscode

Der Code in diesem Schritt startet die Bildschirmpräsentation und generiert den Handler für das Klickereignis der Schaltfläche zum Trennen. Der Code weist darüber hinaus die Verknüpfungsfunktion id für einen bequemen Zugriff auf die getElementById-Funktion auf.

Öffnen Sie den Ordner js. Öffnen Sie die Datei Default.js, und fügen Sie anstelle der onactivated-Standardfunktion den folgenden Code hinzu.

app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {

        startSlideShow();

        args.setPromise(WinJS.UI.processAll());
    }
};

// Disconnect button event handler.
function disconnectButtonClick() {
    Windows.Media.PlayTo.PlayToManager.showPlayToUI();
}

// Shortcut function.
function id(tagName) {
    return document.getElementById(tagName);
}

4. Hinzufügen von Code zum Abrufen und Anzeigen der Bilder als Bildschirmpräsentation

In diesem Beispiel werden Bilder, die sich im Stammverzeichnis des Bilderordners befinden, als Bildschirmpräsentation angezeigt. Dabei wird zunächst eine Liste der Bilder aus dem Bilderordner abgerufen, und anschließend werden <image>-Objekte zum Durchlaufen der Liste erstellt.

Beim Streamen der Bilder mithilfe von "Wiedergeben auf" nutzt der Code für diese Bildschirmpräsentations-App die Möglichkeit, das nächste Medienelement mithilfe von "Wiedergeben auf" zu puffern. Dies ist optional und eignet sich für Szenarien, in denen zusätzliche Zeit zum Abrufen des nächsten zu streamenden Mediums in Anspruch genommen wird. Durch Puffern des Mediums können Sie es direkt nach Beenden des aktuellen Mediums streamen und damit Verzögerungen zwischen den Medienelementen vermeiden.

Zum Puffern des nächsten Medienelements legen wir für die Quelle "Wiedergeben auf" des nächsten Elements die next-Eigenschaft des aktuellen Elements fest. Wenn das aktuelle Element abgeschlossen ist, rufen wir die playNext-Methode des aktuellen Elements auf, um die nächste Medienquelle auf das Zielgerät zu streamen.

Falls die Bildschirmpräsentation nur lokal erfolgt, greift der Code auf ein Zeitlimit zurück, um zum nächsten Bild in der Liste zu wechseln. Wenn die Bildschirmpräsentation auf einen "Wiedergeben auf"-Empfänger gestreamt wird, greift der Code ebenfalls auf ein Zeitlimit zurück, um zum nächsten Bild zu wechseln, reagiert jedoch auch, wenn der "Wiedergeben auf"-Empfänger die Bildschirmpräsentation pausiert, zum nächsten Bild wechselt, bevor das Zeitlimit abgelaufen ist, oder getrennt wird. Dies wird mithilfe des statechanged-Ereignisses der "Wiedergeben auf"-Quelle erreicht, das von der msPlayToSource-Eigenschaft eines Bildobjekts referenziert wird. Beim statechanged-Ereignis überprüft der Code die currentState- und previousState-Eigenschaften der Argumente, die an das Ereignis weitergegeben werden. Über die verschiedenen Zustände, zusammen mit der Zahl, die den Index des Bilds identifiziert, das das statechanged-Ereignis ausgelöst hat, kann festgestellt werden, wie reagiert werden soll, wie in der folgenden Tabelle zu sehen.

currentState Auszuführende Aktion
disconnected

Wenn der Index des Bilds, das das Ereignis ausgelöst hat, derselbe Index ist wie derjenige des Bilds, das gerade angezeigt wird, wurde die "Wiedergeben auf"-Quelle getrennt, während ein Bild gerade angezeigt wurde. Das bedeutet, dass der "Wiedergeben auf"-Empfänger nicht mehr verbunden ist und wir die Bildschirmpräsentation lokal mithilfe des aktuellen Bildindex starten. Ansonsten gibt der Zustand disconnected einfach an, dass die Bildschirmpräsentation fertig mit der Einblendung des Bilds ist, das das Ereignis ausgelöst hat, und wir das Bildobjekt aufräumen können, das nicht mehr benötigt wird.

connected

Wenn der vorherige Zustand disconnected ist, wurde das Bild, das das Ereignis ausgelöst hat, eben mit dem "Wiedergeben auf"-Empfänger verbunden. An diesem Punkt erhalten wir das nächste Bild, sodass es geladen wird, während das aktuelle Bild angezeigt wird.

Wenn der vorherige Zustand rendering ist, hat der Benutzer die Bildschirmpräsentation auf dem "Wiedergeben auf"-Empfänger pausiert, und wir setzen das aktuelle Zeitlimit außer Kraft, bevor der Benutzer die Präsentation neu startet.

rendering Wenn der vorherige Zustand connected ist, hat der "Wiedergeben auf"-Empfänger die Bildschirmpräsentation fortgesetzt, und wir können die Präsentation wieder starten.

 

Fügen Sie in der Datei Default.js den folgenden Code hinter dem Code aus dem vorherigen Schritt ein.

var states = Windows.Media.PlayTo.PlayToConnectionState, // alias for PlayToConnectionState
    imageList,               // contains the list of images to show
    streaming = false,       // true when streaming using Play To; otherwise false
    cancel = 0,              // used to cancel a timeout
    timeLapse = 5,           // time between images (5 seconds)
    imageSize = "600px",     // size of current displayed image
    thumbnailSize = "200px", // size of "thumbnail" of next image
    currentImage = 0;        // index of the current image from imageList

// Get the list of images from the Pictures folder and start the slide show.

function startSlideShow() {
    Windows.Storage.KnownFolders.picturesLibrary.getFilesAsync().then(
        function (resultsLibrary) {
            imageList = resultsLibrary;
            if (imageList.length > 0) {
                var image = queueImage(0, true);
            } else {
                id("messageDiv").innerHTML = "There are no images in the Pictures library.";
            }
        });
}


// playNextImage
// Called when a new image is displayed due to a timeout.
// Removes the current image object and queues a new next image.
// Sets the next image index as the new current image, and increases the size 
// of the new current image. Then sets the timeout to display the next image.

function playNextImage(num) {
    id("slideshowDiv").removeChild(id("image" + num));
    queueImage(num + 2, false);

    currentImage = num + 1;
    id("image" + currentImage).style.width = imageSize;

    cancel = setTimeout(function () {
        playNextImage(num + 1);
    }, timeLapse * 1000);
}


// queueImage
// Called to create an image object for the displayed images.

function queueImage(num, isFirstImage) {

    // Create the image element for the specified image index and add to the
    // slide show div.

    var image = document.createElement("img");
    image.style.width = (isFirstImage ? imageSize : thumbnailSize);
    image.id = "image" + num;
    image.src = URL.createObjectURL(imageList[num % imageList.length], { oneTimeOnly: true });
    id("slideshowDiv").appendChild(image);

    // If this is the first image of the slide show, queue the next image. Do
    // not queue if streaming as images are already queued before
    // streaming using Play To.

    if (isFirstImage && !streaming) {

        queueImage(num + 1, false);

        cancel = setTimeout(function () {
            playNextImage(num);
        }, timeLapse * 1000);            
    }

    // Use the transferred event of the Play To connection for the current image object
    // to "move" to the next image in the slide show. The transferred event occurs
    // when the PlayToSource.playNext() method is called, or when the Play To
    // Receiver selects the next image.

    image.msPlayToSource.connection.addEventListener("transferred", function () {

        currentImage = num + 1;
        id("image" + currentImage).style.width = imageSize;

    }, false);


    // Use the statechanged event to determine which action to take or to respond
    // if the Play To Receiver is disconnected.
    image.msPlayToSource.connection.addEventListener("statechanged", function (e) {

        switch (e.currentState) {
            case states.disconnected:

                // If the state is disconnected and the current image index equals the 
                // num value passed to queueImage, then the image element is not connected 
                // to the Play To Receiver any more. Restart the slide show.
                // Otherwise, the current image has been discarded and the slide show
                // has moved to the next image. Clear the current image object and
                // remove it from the slide show div.

                if (currentImage == num) {
                    id("messageDiv").innerHTML = "Slideshow disconnected";

                    // Cancel any existing timeout
                    if (cancel) {
                        clearTimeout(cancel);
                    }

                    // Clear all image objects from the slide show div
                    while (id("slideshowDiv").firstChild) {
                        id("slideshowDiv").removeChild(id("slideshowDiv").firstChild);
                    }

                    // Reset the slide show objects and values to their beginning state
                    streaming = false;
                    id("disconnectButton").style.display = "none";
                    id("instructionsDiv").style.display = "block";
                    disconnectButton.removeEventListener("click", disconnectButtonClick, false);

                    // Restart the slide show from the current image index
                    queueImage(currentImage, true);
                } else {
                    image.msPlayToSource.next = null;
                    image.removeAttribute("src");

                    if (streaming) {
                        id("slideshowDiv").removeChild(image);
                    }
                }

                break;
                
            case states.connected:

                // If the state is connected and the previous state is disconnected, 
                // then the image element is newly connected. Queue up the next image so 
                // that it is loaded while the current image is being displayed.
                // If the previous state is rendering, then the user has paused the slideshow 
                // on the Play To Receiver. Clear the current timeout until the user restarts
                // the slide show.

                if (e.previousState === states.disconnected) {
                    var imageNext = queueImage(num + 1, false);
                    image.msPlayToSource.next = imageNext.msPlayToSource;
                } else if (e.previousState === states.rendering) {
                    if (cancel) {
                        clearTimeout(cancel);
                        cancel = 0;
                    }
                }

                if (currentImage == num) {
                    id("messageDiv").innerHTML = "Slideshow connected";
                }

                break;

            case states.rendering:

                // If the state is rendering and the previous state is
                // connected, then the Play To Receiver has restarted
                // the slide show.

                if (e.previousState === states.connected) {

                    // Clear any existing timeout.
                    if (cancel) {
                        clearTimeout(cancel);
                    }

                    // Restart the slide show.
                    cancel = setTimeout(function () {
                        image.msPlayToSource.playNext();
                    }, timeLapse * 1000);
                }

                if (currentImage == num) {
                    id("messageDiv").innerHTML = "Slideshow rendering";
                }

                break;
        }

    }, false);

    return image;
}

5. Hinzufügen von Code für "Wiedergeben auf"

Der Code in diesem Schritt implementiert den Vertrag für "Wiedergeben auf". Er ruft einen Verweis auf den PlayToManager für die aktuelle App ab und weist den Ereignishandler für das sourcerequested-Ereignis und das sourceselected-Ereignis zu.

Da die Bildobjekte für jedes einzelne Bild der Bildschirmpräsentation erstellt und eliminiert werden, verwenden wir ein temporäres Bildobjekt, das beim sourcerequested-Ereignis nie eliminiert wird. Das geschieht deshalb, weil wir nicht wissen, ob das Zeitlimit abläuft, bevor der Benutzer einen "Wiedergeben auf"-Empfänger auswählt. Sollte das passieren, wird das aktuelle Bild eliminiert, und wir würden einen Nullverweis an "Wiedergeben auf" weiterleiten. Stattdessen leiten wir einen Verweis zu einem Bildobjekt an "Wiedergeben auf" weiter, das nie eliminiert wird, und aktualisieren die Bildquelle auf das aktuell eingeblendete Bild, sobald der Benutzer einen "Wiedergeben auf"-Empfänger auswählt. Wir wissen, dass das passiert ist, wenn sich der Zustand des Bilds zu connected ändert.

Fügen Sie in der Datei Default.js den folgenden Code hinter dem Code aus dem vorherigen Schritt ein.

// Set up the Play To contract.

// Used to pass an image to Play To that will not be removed/destroyed
// by the slide show logic. For example, if the user opens the Devices
// charm and the sourcerequested event fires, but the image display timeout
// completes before the user selects a target device, then the image that
// was being displayed is removed and destroyed. intialImage is never 
// destroyed so Play To will always have a valid source to stream.
var initialImage = null;

var ptm = Windows.Media.PlayTo.PlayToManager.getForCurrentView();

ptm.addEventListener("sourcerequested", function (e) {
    initialImage = document.createElement("img");

    // Use the statechanged event of the image passed to Play To to determine when
    // the image is finally connected to the Play To Receiver.
    initialImage.msPlayToSource.connection.addEventListener("statechanged", function (e) {

        if (e.currentState === states.connected) {

            // Clear any existing timeout.
            if (cancel) {
                clearTimeout(cancel);
                cancel = 0;
            }

            // Clear the slide show div.
            while (id("slideshowDiv").firstChild) {
                id("slideshowDiv").removeChild(id("slideshowDiv").firstChild);
            }

            // Set the slide show objects and values to show that we are streaming.
            streaming = true;
            id("disconnectButton").style.display = "block";
            id("instructionsDiv").style.display = "none";

            // Queue and display the next image.
            var image = queueImage(currentImage, true);
            initialImage.msPlayToSource.next = image.msPlayToSource;
            initialImage.msPlayToSource.playNext();
        }
    }, false);

    // Provide Play To with the first image to stream.
    e.sourceRequest.setSource(initialImage.msPlayToSource);

}, false);

// Update the once the user has selected a device to stream to.
ptm.addEventListener("sourceselected", function (e) {
    disconnectButton.addEventListener("click", disconnectButtonClick, false);
    id("messageDiv").innerHTML = "Streaming to " + e.friendlyName + "...";
    id("deviceSpan").innerHTML = e.friendlyName + ".<br/>Click here to disconnect.";
    id("iconImage").src = URL.createObjectURL(e.icon, { oneTimeOnly: true });
}, false);

6. Erstellen eines "Wiedergeben auf"-Ziels (optional)

Zum Ausführen der Anwendung ist ein Zielgerät erforderlich, auf das mit "Wiedergeben auf" Medien gestreamt werden können. Falls Sie keinen zertifizierten Empfänger für "Wiedergeben auf" haben, nutzen Sie Windows Media Player als Zielgerät. Ihr PC muss mit einem privaten Netzwerk verbunden sein, damit Sie Windows Media Player als Zielgerät verwenden können. Windows Media Player muss auf einem anderen Computer ausgeführt werden als Ihre "Wiedergeben auf"-Quell-App.

  1. Microsoft Windows Media Player
  2. Erweitern Sie das Menü Streamen, und aktivieren Sie die Option Remotesteuerung des Players zulassen.... Lassen Sie Windows Media Player geöffnet. Der Player muss ausgeführt werden, damit er als Ziel für "Wiedergeben auf" verfügbar ist.
  3. Öffnen Sie in der Systemsteuerung Geräte und Drucker. Klicken Sie auf Geräte und Drucker hinzufügen. Suchen Sie im Assistenten zum Hinzufügen von Geräten und Druckern im Fenster Gerät oder Drucker zum Hinzufügen zu diesem PC auswählen den Digital Media-Renderer für Ihren PC. Dies ist Windows Media Player für Ihren PC. Wählen Sie ihn aus, und klicken Sie auf Weiter. Beim Abschließen des Assistenten wird die Instanz von Windows Media Player in der Liste der Multimediageräte angezeigt.

7. Ausführen der App

  • Drücken Sie in Visual Studio F5 (Debuggen), um die App auszuführen. Sie können eine beliebige Medienschaltfläche auswählen, um das erste Medienelement in den verschiedenen Medienbibliotheken wiederzugeben oder anzuzeigen. Öffnen Sie während der Medienwiedergabe den Charm "Geräte", und wählen Sie das Ziel für "Wiedergeben auf" aus, um das Medium auf das Zielgerät zu streamen.

Zusammenfassung

In dieser Schnellstartanleitung haben Sie einer App, die Bilder als Bildschirmpräsentation auf einem Zielgerät anzeigt, die Funktion "Wiedergeben auf" hinzugefügt. Mit der Funktion "Wiedergeben auf" können Benutzer Inhalt aus der App auf einen Empfänger für "Wiedergeben auf" im Netzwerk streamen.

Verwandte Themen

Streamen von Medien auf Geräte mit "Wiedergeben auf"

Beispiele

Beispiel für "Wiedergeben auf"

Beispiel für "PlayToReceiver"

Beispiel für Medienserver