"frontend" Category


Why HTML5 audio/video on iOS is virtually unusable


vrijdag, november 4, 2011

Apple’s Safari on iOS is pretty cool. It has pretty good support for HTML5 audio and video. Unfortunately there’s one big quirk that makes it almost impossible to do anything useful with it. Why? They disabled autoplay. According to the docs this is because:

(…) the user may be on a cellular network and be charged per data unit, preload and autoplay are disabled. No data is loaded until the user initiates it.

In theory, this sounds great. Who doesn’t detest autoplaying advertisements on sites? Unfortunately this ‘feature’ has a few side-effects that cripple the general use of HTML5 audio/video. The autoplay property isn’t the only thing that’s disabled. Playing a HTML5 media element is not possible at all without an user action.

What does this mean in practice? Consider a piece of HTML like this:


<script>
function play() {
var a = new Audio();
a.src = 'http://example.com/audio.mp3';
a.play();
}
</script>

<button onclick="play()">play</button>

This works on iOS because the play() function is initiated from a user action (the click on the button). Now, consider something like this:


<script>
function play() {
var a = new Audio();
a.src = 'http://example.com/audio.mp3';
a.play();
}

setTimeout(play, 3000);
</script>

This doesn’t work on iOS. The play() method is called, but nothing happens because the function is not called from an user action.

Now, you might say, why would you ever want to play a video from a timeout? This example is very simplistic, but consider you’re writing a cross-browser media player that falls back on Flash on Internet Explorer, automatically plays the next track in a playlist, etcetera. You want to write clean code, so everything is modulairized, maybe using a tool like RequireJS and a MVC framework.

This means you’re getting lots of asynchronous callbacks, events, AJAX calls and dozens of functions you’re working with. Your original ‘click’ is lost and your cross-browser player doesn’t work on iOS. Bummer.

Or consider a game with sound effects. Every time you hit an enemy you want to play a sound. I suppose you don’t want to let your user click a button when she wants to hear a sound effect.

Of course, if you just want a simple video player for a blogpost you don’t run into this problem. But for virtually all advanced applications you’re going to run into the autoplay bug sooner or later.

Native iOS apps don’t have this problem, and you can actually disable the autoplay ‘feature’ by putting your web app in a native app (using UIWebView) and disabling the UIWebView.mediaPlaybackRequiresUserAction flag.

On Android this isn’t a problem at all. The code above works fine (tested on 2.3.3).

I think Apple has three possible solutions to ‘fix’ this problem:

  1. Prompt the user to enable autoplay, just like with geolocation
  2. Disable the ‘mediaPlaybackRequiresUserAction’ flag when the device is on WIFI
  3. Remove the ‘feature’ completely

If you’re having this problem as well, you might have some luck submitting a bug report.

CSS Prism - snel een overzicht van alle gebruikte kleuren in je CSS


maandag, juni 27, 2011

Weer zo’n handig online tooltje: cssprism.com Scant een CSS bestand op aanwezige kleuren en biedt je meteen een editor om ze aan te passen en het resultaat op te slaan. (Visual) search & replace was nog nooit zo makkelijk.

De VPRO HTML Media speler


vrijdag, april 8, 2011

htmlplayer1

Veel websites die we bij VPRO Digitaal maken hebben audio en video als belangrijkste onderdeel. Essentieel voor deze sites is dus dat de media goed te bekijken en te beluisteren valt. We bieden daarom graag onze bezoekers een consistente en prettig bruikbare mediaspeler.

In de praktijk blijkt het echter behoorlijk moeilijk te zijn om één speler aan te bieden. Er is natuurlijk de speler van Uitzending Gemist, maar die is alleen bruikbaar voor media die ook daar te zien is, en dat is lang niet alles wat we aan media hebben. Veel sites hebben een mix van media die wel en niet op Uitzending Gemist staat, dus dan zijn twee spelers al noodzakelijk. Verder past de Uitzending Gemist speler niet altijd in de vormgeving van de sites. Twee spelers betekent twee verschillende vormgevingen, en onduidelijkheid voor de bezoeker. Iets wat we niet willen.

Het afgelopen jaar hebben we daarom gewerkt aan een oplossing die én een consistente vormgeving heeft én alle benodigde formaten kan afspelen. Deze speler, die we de VPRO HTML Player hebben genoemd wordt inmiddels gebruikt op onder andere de sites van Tegenlicht, Holland Doc en Geschiedenis24. Het streven is om de speler op alle VPRO-sites te gebruiken, waaronder de vernieuwde website van 3voor12, die later dit jaar online zal gaan.

Wat maakt deze speler anders dan de bestaande spelers? Daarvoor moeten we eerst even terug naar de basis van wat we willen met een speler: het afspelen van video en audio op het web. Er is op dat gebied technisch de laatste tijd veel veranderd: een paar jaar geleden was het alleen mogelijk om met behulp van plugins als Flash en Silverlight video af te spelen. Sinds de introductie van HTML5 kan het ook ‘native’ in de webbrowsers, met de <video> en <audio> tags. Dat is uiteindelijk beter dan plugins, omdat de ondersteuning al in de browser zit ingebakken. Het voorkomt problemen tussen de plugins en de browser (plugins zijn vaak een belangrijke oorzaak van crashes in de browser), en het maakt het makkelijker voor de ontwikkelaar en dus uiteindelijk ook voor de bezoeker.

Helaas is de ondersteuning van HTML5 nog niet op een niveau dat we het cross-browser kunnen gebruiken om media af te spelen. Ook is een groot deel van ons media-archief van de publieke omroep in het Windows Media-formaat, wat alleen af te spelen valt met de Silverlight plugin. Nieuwere video is wel beschikbaar in andere formaten als H264. Op termijn zal dat wel convergeren naar andere formaten, maar we zullen zeker nog een lange tijd meerdere combinaties van formaten, plugins en browsers moeten ondersteunen.

Dat betekent echter niet dat we geen gebruik kunnen maken van delen van HTML5 om wél die consistente speler aan te bieden aan onze bezoekers.

htmlplayer3d

Het principe van onze speler is in feite heel simpel: alle controls van de speler (zoals de play en volumeknoppen) zijn gemaakt in HTML en worden bovenop de eigenlijke speler gelegd. De look and feel kan gewoon worden gestyled met CSS, net zoals de rest van de website.

De control-loze speler (die we het canvas noemen) wordt aangestuurd met Javascript. Dat gebeurt via een generieke interface, die is gebaseerd op de HTML5 specificatie voor het <video> en <audio> element.

Niet alle spelers implementeren de HTML5 <video> en <audio> API spec, maar dat maakt niet uit. Voor die spelers schrijven we een jQuery plugin die commando’s vertaalt naar de HTML5 commando’s. Als een speler bijvoorbeeld de totale tijd van een mediafragment ‘endTime’ noemt (zoals in de Uitzending Gemist-speler) in plaats van ‘duration’ (wat HTML5 gebruikt) dan vertalen we dat. Op die manier hoef je niet voor alle canvassen de controls overnieuw te schrijven. Je laat het aan de onderliggende jQuery plugin over om het te vertalen. De bovenste ‘control’ laag kan daarom helemaal toegesneden zijn op het goed verwerken van de aansturing van de gebruiker.

Op dit moment hebben we twee ‘canvassen’ gemaakt voor onze speler: de Uitzending Gemist-speler en een generieke Silverlight-speler voor alle andere media die niet in Uitzending Gemist zit. Die speler kan bijvoorbeeld ook MP3 of H264 afspelen. In de toekomst hopen we dat uit te breiden met de Flash-variant van de Uitzending Gemist speler, een generieke Flash speler en natuurlijk de HTML5 <video> en <audio> elementen.

HTML5 — Edition for Web Developers


woensdag, maart 9, 2011

HTML5 specs, voor web developers

http://developers.whatwg.org/

GoogleTV, gevestigde orde


vrijdag, december 17, 2010

Wie was nu eigenlijk de gevestigde orde? Die merkwaardige vraag kon je je stellen toen een ‘business and development’ team van Google deze week in Geneve een presentatie hield voor de Europese broadcasters. Het was een mooie clash der culturen, en er hing in de zaal een interessante geur van wederzijds respect, argwaan en nog onvervulde mogelijkheden. Wat gaat GoogleTV worden?

Eigenlijk is iedereen er inmiddels wel van overtuigd: de convergentie van internet en TV is nu echt begonnen, het wordt ‘connected TV’. Er worden geen toestellen zonder internetaansluiting meer verkocht en grote bedrijven proberen nu de standaard te zetten: AppleTV, GoogleTV of HBBTV. Wat het ook gaat worden, duidelijk is dat de komende 10 jaar televisie kijken onherkenbaar gaat veranderen.
(meer…)

RequireJS versie 0.2 is uit: “stronger, faster, prettier”


donderdag, december 16, 2010

Bij de VPRO zijn we aan het experimenteren met RequireJS, een JavaScript module (en bestand) lader gebaseerd op de CommonJS Asynchronous Module Definition API. RequireJS helpt ons onze JavaScripts gestructureerder en herbruikbaarder te ontwikkelen. Versie 0.2 is vandaag gelanceerd, “stronger, faster, and prettier”, aldus ontwikkelaar James Burke. Nog geen 1.0, dus experimenteren blijft het, maar wij zijn er voor aan het warm lopen.

Linkdump 25-11-2010


donderdag, november 25, 2010

jQuery syntax highlighter

Handige jQuery plugin voor syntax highlighting in pre / code tags.

Underscore

“Underscore is a utility-belt library for JavaScript that provides a lot of the functional programming support that you would expect in Prototype.js (orRuby), but without extending any of the built-in JavaScript objects. It’s the tie to go along with jQuery’s tux.”

YUI Test

Nieuwe versie van dit Javascript test framework.

iOS 4.2 Safari verbeteringen

De update van iOS zorgt ervoor dat je in de webbrowser nu ook de positie van de telefoon kan uitlezen en websockets kan gebruiken.

Linkdump 23-11-2010


dinsdag, november 23, 2010

Benjamin De Cock’s vCard

Mooi voorbeeld van wat er mogelijk is met CSS3. Werkt het beste in Chrome of Safari.

Processing.js 1.0 uit

Processing.js, de Javascript implementatie van de visuele programmeertaal Processing, heeft een 1.0 release gehad. Een aardige site om er mee te experimenteren is jsfiddle.net

20 things i learned about browsers & the web

Prachtig HTML5 interactief boek over hoe het internet werkt.

Bier, Parijs, en snelheid.


dinsdag, november 9, 2010

avatar

Untappd

Nieuw sociaal netwerk voor bierliefhebbers. Zoiets als Foursquare, maar nu check je in op bier in plaats van locaties. Ook leuk omdat de mobiele applicatie helemaal HTML5 is, en op een iPhone bijna net zo goed werkt als een ‘echte’ app.

Les Communes de Paris

Mooie digitale omzwerving door de straten van Parijs, waarbij je aan de hand van drieëntwintig inwoners, elk met hun eigen idee over de stad meer te weten kan komen over de stad. Je kan de interactieve documentaire doorlopen via een kaart of via de inwoners.

Google Page Speed apache module

Apache-module voor Debian/CentOS (Apache 2.2 only op het moment) met configureerbare filters voor het optimaliseren van websites en het bijhouden van latency statistieken.

HTML5 heatmap die gebruik maakt van de canvas tag

Een overzicht van echte applicaties en hoe ze schalen met veel lezenswaardige voorbeelden en tools.

Font events: Controlling the flash of unstyled text

Frontend linkjes van de dag


dinsdag, oktober 26, 2010

Stylebot
Chrome plugin om makkelijk pagina’s te stylen en dat ook gelijk op te slaan.

Selectivizr
CSS3 selectors voor Internet Explorer. Onder de motorkap is het stiekem een CSS parsing engine.

Flexie
Maakt gebruik van Selectivizr om het CSS3 flexible box model voor IE beschikbaar te maken