Service Worker-Caching, Wiedergaberate und Blob-URLs für Audio und Video in Chrome für Android

Manchmal haben gute Dinge langweilige Namen.

Ein gutes Beispiel ist die Unified Media Pipeline, kurz UMP.

Das mag nach einer finsteren Richtlinie aus der Sowjetzeit klingen, ist aber tatsächlich ein wichtiger Schritt hin zu einer plattformübergreifenden Audio- und Videobereitstellung. Chrome für Android verwendet nun denselben Media-Stack wie die Desktopversion von Chrome, anstatt sich auf die zugrunde liegende Plattformimplementierung zu verlassen.

UMP bietet Ihnen viele Möglichkeiten:

  • Audio- und Videodaten werden mit Service Workern im Cache gespeichert, da die Medienbereitstellung jetzt direkt in Chrome implementiert und nicht an den Android-Medienstack übergeben wird.
  • Verwenden Sie Blob-URLs für Audio- und Videoelemente.
  • Legen Sie playbackRate für Audio und Video fest.
  • Übergib MediaStreams zwischen Web Audio und MediaRecorder.
  • Medien-Apps lassen sich einfacher auf verschiedenen Geräten entwickeln und verwalten – Medien funktionieren auf Desktop-Computern und Android-Geräten gleich.

Die Implementierung von UMP erforderte einige harte Entwicklungsarbeit:

  • Eine neue Caching-Ebene für verbesserte Leistung.
  • Aktualisierung eines neuen MediaCodec-basierten Videodecoders, der im GPU-Prozess von Chrome gehostet wird.
  • Viele Tests und Iterationen auf verschiedenen Geräten.

Hier sehen Sie eine Demo des Video-Cachings mit einem Service Worker:

Screenshot der Videowiedergabe

Das Caching der Videodatei und des Posterbildes des Videos ist so einfach wie das Hinzufügen der Pfade zur Liste der URLs für den Vorabruf:

<video controls  poster="static/poster.jpg">
    <source src="static/video.webm" type="video/webm" />
    <p>This browser does not support the video element.</p>
</video>
var urlsToPrefetch = [
    'static/video.webm', 'static/poster.jpg',
];

Es ist schon seit Langem ein Fehler, dass playbackRate unter Android nicht geändert werden kann. UMP behebt dieses Problem. Für die Demo unter simpl.info/video/playbackrate ist playbackRate auf „2“ gesetzt. Probier es gleich aus!

Screenshot der Videowiedergabe mit einer Wiedergaberate von 2.

UMP ermöglicht Blob-URLs für Medienelemente. Das bedeutet, dass Sie z. B. jetzt ein Video abspielen können, das mit der MediaRecorder API aufgenommen wurde, in einem Videoelement unter Android:

Screenshot der Wiedergabe eines Videos in Chrome auf Android, das mit der MediaRecorder API aufgenommen wurde

Hier ist der entsprechende Code:

var recordedBlobs = [];

mediaRecorder.ondataavailable = function(event) {
    if (event.data && event.data.size > 0) {
    recordedBlobs.push(event.data);
    }
};

function play() {
    var superBuffer = new Blob(recordedBlobs, {type: 'video/webm'});
    recordedVideo.src = window.URL.createObjectURL(superBuffer);
}

Für die Demo unter simpl.info/video/offline wird das Video mit den File APIs gespeichert und dann mit einer Blob-URL abgespielt:

ALT_TEXT_HERE
function writeToFile(fileEntry, blob) {
    fileEntry.createWriter(function(fileWriter) {
    fileWriter.onwriteend = function() {
        readFromFile(fileEntry.fullPath);
    };
    fileWriter.onerror = function(e) {
        log('Write failed: ' + e.toString());
    };
    fileWriter.write(blob);
    }, handleError);
}

function readFromFile(fullPath) {
    window.fileSystem.root.getFile(fullPath, {}, function(fileEntry) {
    fileEntry.file(function(file) {
        var reader = new FileReader();
        reader.onloadend = function() {
        video.src = URL.createObjectURL(new Blob([this.result]));
        };
        reader.readAsArrayBuffer(file);
    }, handleError);
    }, handleError);
}

Die Unified Media Pipeline wurde außerdem für Media Source Extensions (MSE) und Encrypted Media Extensions (EME) aktiviert.

Dies ist ein weiterer Schritt zur Vereinheitlichung von Chrome für Mobilgeräte und Computer. Sie müssen Ihren Code nicht ändern, aber es sollte jetzt einfacher sein, ein einheitliches Medienerlebnis für Desktop- und Mobilgeräte zu entwickeln, da der Media-Stack auf allen Plattformen gleich ist. Debugging mit den Chrome-Entwicklertools? Für die Mobilgeräte-Emulation wird jetzt der „echte“ Audio- und Video-Stack verwendet.

Wenn Probleme infolge der Unified Media-Pipeline auftreten, melden Sie die Probleme bitte im Implementierungsfehler oder über new.crbug.com.

Demos

Relevante Fehler

Es gibt einige Fehler, die <video>, Service Worker und die Cache Storage API betreffen:

Unterstützte Browser

  • In Chrome 52 und höher standardmäßig aktiviert.