FFmpeg Video Encoding (v6)

Revision 6 of this benchmark created on


Preparation HTML

<pre></pre>

<script type="text/worker" id="main-worker">
importScripts('http://aaronm67.com/videoconverter.js/ffmpeg_build/ffmpeg.js');

self.addEventListener('message', function(e) {
  postMessage({
    'type' : 'start'
  });

  var results = run("test.jpg", e.data,
    ["-i", "test.jpg", "-vf", "showinfo,scale=w=-1:h=-1", "-strict", "experimental", "-v", "verbose", "output.mov"]);

  postMessage({
    'type' : 'end'
  });
});

function run(filename, data, args) {
    var mod = {
      print: function (text) {
        postMessage({
          'type' : 'stdout',
          'data' : text
        });
      },
      printErr: function (text) {
        postMessage({
          'type' : 'stdout',
          'data' : text
        });
      },
      'arguments': args,
      'fileData': data,
      'fileName': filename
    };

    var result = ffmpeg_run(mod);
    var buffers = [];
    if (result && result.object && result.object.contents) {
      for (var i in result.object.contents) {
        if (result.object.contents.hasOwnProperty(i)) {
          buffers.push(new Uint8Array(result.object.contents[i].contents).buffer);
        }
      }
    }
    return buffers;
}
</script>

Setup

var data = "data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAFABQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooA//9k=";
    
    
    //http://www.briangrinstead.com/blog/load-web-workers-without-a-javascript-file
    // makeWorker is a little wrapper for generating web workers from strings
    function makeWorker(script) {
        var URL = window.URL || window.webkitURL;
        var Blob = window.Blob;
        var Worker = window.Worker;
     
        if (!URL || !Blob || !Worker || !script) {
            return null;
        }
     
        var blob = new Blob([script]);
        var worker = new Worker(URL.createObjectURL(blob));
        return worker;
    }
    
      // http://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata
      function dataURItoArrayBuffer(dataURI) {
        // convert base64 to raw binary data held in a string
        // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
        var byteString = atob(dataURI.split(',')[1]);
    
        // separate out the mime component
        var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]
    
        // write the bytes of the string to an ArrayBuffer
        var ab = new ArrayBuffer(byteString.length);
        var ia = new Uint8Array(ab);
        for (var i = 0; i < byteString.length; i++) {
          ia[i] = byteString.charCodeAt(i);
        }
        return ia;
      }
    
    var byteArray = dataURItoArrayBuffer(data);
    var worker =  makeWorker(document.getElementById('main-worker').textContent);
    var pre = document.querySelector("pre");

Test runner

Ready to run.

Testing in
TestOps/sec
Encode Image
// async test
worker.postMessage(byteArray);
worker.onmessage = function(e) {
    if (e.data.type === "end") {
        deferred.resolve();    
    }
    else {
      pre.textContent += e.data.data + "\n";
    }
}
ready
With Printing
// async test
worker.postMessage(byteArray);
worker.onmessage = function(e) {
    if (e.data.type === "end") {
        deferred.resolve();    
    }
}
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.