I recently became the owner of an Android phone* and found that, despite it being listed as a feature of the browser, the HTML5 video
element didn’t work for almost all of the examples I tried. I’ve just done some experimentation with this and think I’ve found a solution, so this post is offered in the hope that it helps anyone who may be tearing their hair out over the same problem.
From what I can tell, there are three requirements for video
to work in Android browsers:
- You must not use the
type
attribute when calling the video - You must manually call the
play()
method using JavaScript The video must be encoded as .m4v, not .mp4Update: This is not correct (see below)
Update: This may be a specific encoding issue rather than all .mp4s; some .mp4 videos seem to play with no problems, others do not. Further update: The video type was a red herring; see my follow-up post, Encoding Video for Android, for more about this.
You can see this working in the demo attached to an older post of mine: Demo: HTML5 Video Controls With JavaScript. This works,
<video id="video" autobuffer height="240" width="360"> <source src="BigBuck.m4v"> <source src="BigBuck.webm" type="video/webm"> <source src="BigBuck.theora.ogv" type="video/ogg"> </video>
The first source
element calls the video in .m4v format, without specifying the MIME type in the type
attribute; I’ve tried both video/mp4 and video/x-m4v, and neither works. Omitting the type attribute altogether lets the video play, and seems to have no ill-effect on other browsers which play the .m4v file.
In order to play the video in Android, I also have an event listener in the JavaScript which plays the video when the element is clicked on, somewhat like this:
var video = document.getElementById('video'); video.addEventListener('click',function(){ video.play(); },false);
I tested this on my own phone and an HTC Desire, and it works just fine on both. Hope this is of help to someone.
* It’s a Samsung Galaxy S, and I’m delighted by it.