I am trying to serve HTML5 video in MP4 and WEBM fomats. I cannot get all browsers to work though:
Browsers which support WEBM (Chrome desktop, Firefox desktop) play the videos fine.
Browsers which use MP4 are not working (IE, Safari, Android).
WEBM is being served as video/webm
.
MP4 is being served as video/mp4
.
Minimal JSFiddle at: http://jsfiddle.net/#&togetherjs=5Ql5MmrV4j
IE11: 11.0.9600.17126 / 11.0.9 KB2957689
Error: Unsupported video type of invalid file path
Android browser and Chrome Android:
No error, video just refuses to start
Received file size: curl <video URL> | wc -c
Actual file size: stat -c %s <video file>
Server-specified file size: Content-Length
HTTP header.
MP4: http://hackology.co.uk/wp-content/uploads/2014/06/hd720-24.mp4
Content-Type: video/mp4
Does not play in Chrome / IE11 / Chrome Android / Android Browser
Does play in VLC
FFMPEG encoding parameters:
-an -vcodec libx264 -s hd720
-flags +loop+mv4
-cmp 256
-partitions +parti4x4+parti8x8+partp4x4+partp8x8
-subq 6 -trellis 0 -refs 5 -bf 0 -coder 0 -me_range 16 -g 250
-keyint_min 25 -sc_threshold 40 -i_qfactor 0.71
-qmin 10 -qmax 51 -qdiff 4
-movflags faststart
These were collected from deep searching on the best way to encode MP4 for mobile browsers.
If I use -an -vcodec libx264 -s hd720
then that video also doesn't work in browsers.
WEBM: http://hackology.co.uk/wp-content/uploads/2014/06/hd720-24.webm
Content-Type: video/webm
Plays in Chrome/Firefox
FFMPEG encoding parameters:
-an -vcodec libvpx -s hd720
<video preload="metadata" controls="controls">
<source type="video/mp4" src="http://hackology.co.uk/wp-content/uploads/2014/06/hd720-24.mp4">
<source type="video/webm" src="http://hackology.co.uk/wp-content/uploads/2014/06/hd720-24.webm">
</video>
JSFiddle at http://jsfiddle.net/#&togetherjs=5Ql5MmrV4j
No MP4-playing browsers actually seem to have full support for MP4 - especially problematic for MS and Apple's browsers which are trying to create a royalty-hell / monopoly around the format.
I got it to work by re-encoding with the following FFMPEG parameters:
-pix_fmt yuv420p
-preset slow
-profile:v baseline
Giving a full command line of:
ffmpeg
<INPUT DEFINITION> # e.g. -i <FILE>
-an # if you won't want audio, otherwise -acodec libaac -b:a 128k
-s hd720
-vcodec libx264
-b:v BITRATE # e.g. 4M
-vcodec libx264
-pix_fmt yuv420p
-preset slow
-profile:v baseline
-movflags faststart
-y <OUTPUT PATH>
The problem was ultimately yet another example of proprietary software vendors not properly supporting their own standards.