<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zencoder Cloud Encoding Blog</title>
	<atom:link href="http://blog.zencoder.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zencoder.com</link>
	<description>Video and Audio Encoding</description>
	<lastBuildDate>Fri, 17 May 2013 18:32:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>Introducing the Official Zencoder Module for Node.js</title>
		<link>http://blog.zencoder.com/2013/05/17/introducing-the-official-zencoder-module-for-node-js/</link>
		<comments>http://blog.zencoder.com/2013/05/17/introducing-the-official-zencoder-module-for-node-js/#comments</comments>
		<pubDate>Fri, 17 May 2013 18:22:51 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1637</guid>
		<description><![CDATA[We&#8217;re proud to announce the release of an officially supported Zencoder integration library for Node.js. If you have used Zencoder with Node.js before, there&#8217;s a good chance you&#8217;ve used Ryan Faerman&#8217;s integration library, which was listed on our website as our recommended third-party Node package. Not only did he make and support the original Node [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.zencoder.com/wp-content/uploads/2013/05/nodejs-light.png"><img class="alignleft size-full wp-image-1640" title="Nodejs" src="http://blog.zencoder.com/wp-content/uploads/2013/05/nodejs-light.png" alt="" width="300" height="81" /></a>We&#8217;re proud to announce the release of an officially supported Zencoder integration library for <a title="Node.js" href="http://nodejs.org/">Node.js</a>. If you have used Zencoder with Node.js before, there&#8217;s a good chance you&#8217;ve used <a href="http://www.ryanfaerman.com/">Ryan Faerman&#8217;s</a> integration library, which was listed on our website as our recommended third-party Node package. Not only did he make and support the original Node library for a year, he was kind enough to transfer ownership of the NPM module to us when we decided to release our own.</p>
<h3>Getting Started</h3>
<p>First you&#8217;ll need to install the <a title="NPM" href="https://npmjs.org/">NPM</a> module.</p>
<pre><code>npm install zencoder
</code></pre>
<p>This will install the package in the directory <code>node_modules</code>. You can then require the package in your application.</p>
<pre><code>var Zencoder = require('zencoder');
</code></pre>
<p>Now instantiate a new client.</p>
<pre><code>var client = new Zencoder('abcdefg1234qwert9302sdfjki30kfi9');
</code></pre>
<p>This will create a new client using the API key <code>abcdefg1234qwert9302sdfjki30kfi9</code>. If no API key is set, then the library will check for a <code>ZENCODER_API_KEY</code> environment variable. By default, the library uses v2 of the Zencoder API, but you can pass in a different base url when creating a client if need be.</p>
<pre><code>var client = new Zencoder('abcdefg1234qwert9302sdfjki30kfi9', 'https://app.zencoder.com/api/v1')
</code></pre>
<p>Now you&#8217;re ready to start interacting with the API! The library follows RESTful conventions as closely as possible, so if you&#8217;re familiar with our API already you can hit the ground running.</p>
<p>Let&#8217;s create a basic application that will submit a job for us, then return the job ID if successful. Start by creating a new app called <code>zentest.js</code> and set up a new client as we detailed above, then use that client to submit a job.</p>
<pre><code>var Zencoder = require('zencoder');

var client = new Zencoder('abcdefg1234qwert9302sdfjki30kfi9');

client.Job.create({
  input: 'http://s3.amazonaws.com/zencodertesting/test.mov',
  outputs: [{
    url: 's3://zen-tests/awesome-movie.mp4'
  }]
}, function(err, data){
  if (err) { console.log("OH NO! There was an error"); return err; }
  console.log('Job created!\nJob ID: ' + data.id);
});
</code></pre>
<p>Save the file and run it using <code>$ node zentest.js</code>. You should see output like this:</p>
<pre><code>$ node zentest.js
Job created!
Job ID: 1234567
</code></pre>
<p>Now instead of just logging the creation, let&#8217;s change our app to poll for progress after a successful request so we can get progress updates. We&#8217;ll use a poll function and timeouts to query the API for progress every 5 seconds until the job is finished.</p>
<pre><code>var Zencoder = require('./')
  , readline = require('readline');

var client = new Zencoder('abcdefg1234qwert9302sdfjki30kfi9');

// We'll use readline to update progress so we don't get have to see a bajillion console.logs
var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

client.Job.create({
  input: 'http://s3.amazonaws.com/zencodertesting/test.mov',
  outputs: [{
    url: 's3://zen-tests/awesome-movie.mp4'
  }]
}, function(err, data){
  if (err) { console.log("OH NO! There was an error"); return err; }
  console.log('Job created!\nJob ID: ' + data.id);
  poll(data.id); // start polling... polling will continue to call itself until finished.
});

function poll(id) {
  setTimeout(function(){
    client.Job.progress(id, function(err, data) {
      if (err) { console.log("OH NO! There was an error"); return err; } // blargh!
      if (data.state == 'waiting') {
        if (!this.status || this.status != 'waiting') {
          rl.write('Waiting'); // display waiting
          this.status = 'waiting'; // set status to waiting so we can start adding dots.
        } else {
          rl.write('.'); // keep adding '.' until we start processing
        }
        poll(id);
      } else if (data.state == 'processing') {
        var progress = Math.round(data.progress * 100) / 100; // round to nearest decimal places.
        rl.write(null, {ctrl: true, name: 'u'}); // clear the current status so we can update progress
        rl.write('Processing: ' + progress + '%');
        this.status = 'processing'; // not important, but makes sure we don't display waiting again
        poll(id);
      } else if (data.state == 'finished') {
        rl.write(null, {ctrl: true, name: 'u'}); // clear the current status
        console.log('Job finished!'); // finished!
        process.exit(0); // exit
      }
    }, 5000);
  })
}
</code></pre>
<p>Now run <code>$ node zentest.js</code> again. You should see a notice that the job was created, followed by an updated percentage until the job is complete. In a web application, you would most likely query for progress in the client, and handle job completion with a notification on the server. We&#8217;ll go into more detail on using notifications in a series on building applications around Zencoder with Node.</p>
<p>The <a title="Zencoder-Node" href="https://github.com/zencoder/zencoder-node" target="_blank">GitHub repository</a> includes a comprehensive <a title="TEST ALL THE THINGS!" href="https://github.com/zencoder/zencoder-node/tree/master/test" target="_blank">test suite</a>, so if you&#8217;d like to see more usage examples that&#8217;s a great place to start. If you have any other questions or comments, feel free to reach out! <a href="https://twitter.com/matt_mcclure">@matt_mcclure</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2013/05/17/introducing-the-official-zencoder-module-for-node-js/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://s3.amazonaws.com/zencodertesting/test.mov" length="922620" type="video/quicktime" />
		</item>
		<item>
		<title>Zencoder at Google I/O</title>
		<link>http://blog.zencoder.com/2013/05/14/zencoder-at-google-io/</link>
		<comments>http://blog.zencoder.com/2013/05/14/zencoder-at-google-io/#comments</comments>
		<pubDate>Tue, 14 May 2013 00:18:35 +0000</pubDate>
		<dc:creator>John Riske</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1646</guid>
		<description><![CDATA[The Brightcove team is excited to show off the Zencoder cloud transcoding service at Google&#8217;s annual developer conference, Google I/O.  We&#8217;ll be in the Developer Sandbox, demoing Live and File transcoding proofs-of-concept running on Google Compute Engine (GCE), which is Google&#8217;s response to EC2. We wrote some preliminary thoughts about GCE a year ago when it launched [...]]]></description>
			<content:encoded><![CDATA[<p>The Brightcove team is excited to show off the Zencoder cloud transcoding service at Google&#8217;s annual developer conference, <a href="https://developers.google.com/events/io/">Google I/O</a>.  We&#8217;ll be in the <a href="https://developers.google.com/events/io/developer-sandbox#t-google-cloud-platform">Developer Sandbox</a>, demoing Live and File transcoding proofs-of-concept running on Google Compute Engine (GCE), which is Google&#8217;s response to EC2.</p>
<p>We <a title="Cloud Encoding Comparison Amazon and Google" href="http://blog.zencoder.com/2012/07/23/first-look-at-google-compute-engine-for-video-transcoding/" target="_blank">wrote some preliminary thoughts about GCE</a> a year ago when it launched at I/O.  In the interim we&#8217;ve found that the GCE team has continued to execute on some features that really distinguish it from competitors– especially disk I/O, boot times and machine consistency, and global network performance.  We&#8217;re excited to talk about how these attributes further bolster a high-performance service like Zencoder and deliver tangible benefits to end users.</p>
<p>If you&#8217;re going to be at the conference, hit us up on Twitter @zencoderinc, or just stop by the Sandbox to say hello!</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2013/05/14/zencoder-at-google-io/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Video.js 4.0 Released</title>
		<link>http://blog.zencoder.com/2013/05/09/video-js-4-0-released/</link>
		<comments>http://blog.zencoder.com/2013/05/09/video-js-4-0-released/#comments</comments>
		<pubDate>Thu, 09 May 2013 23:00:56 +0000</pubDate>
		<dc:creator>John Riske</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1632</guid>
		<description><![CDATA[High fives are in order for Video.js creator  Steve Heffernan, and the Brightcove player team for the release of Video.js 4.0.  Since Brightcove acquired Zencoder, they&#8217;ve invested heavily in Video.js, and according to Steve, it&#8217;s &#8220;the most solid, lightweight, and I dare say prettiest version&#8221; of the player yet. You can read the entire blog [...]]]></description>
			<content:encoded><![CDATA[<p>High fives are in order for Video.js creator  Steve Heffernan, and the Brightcove player team for the release of Video.js 4.0.  Since Brightcove acquired Zencoder, they&#8217;ve invested heavily in Video.js, and according to Steve, it&#8217;s &#8220;the most solid, lightweight, and I dare say prettiest version&#8221; of the player yet.</p>
<p>You can read the entire blog post <a title="Video.js 4.0 leading Open Source HTML5 video player" href="http://bit.ly/ZSnlEX">here</a>.</p>
<h3>4.0 Major Feature Summary:</h3>
<p>Improved performance through an 18% size reduction using Google Closure Compiler in advanced mode</p>
<ul>
<li>Greater stability through an automated cross-browser/device test suite using TravisCI, Bunyip, and Browserstack.</li>
<li>New plugin interface and plugin listing for extending Video.js</li>
<li>New default skin design that uses font icons for greater customization</li>
<li>Responsive design and retina display support</li>
<li>Improved accessibility through better ARIA support</li>
<li>Moved to Apache 2.0 license</li>
<li>100% JavaScript development tool set including Grunt</li>
</ul>
<h4><span id="more-1632"></span></h4>
<h4>Improved Performance</h4>
<p>With version 4.0, performance was our top priority, and a major factor of performance is the time it takes to load the library. What would seem to be minor size reductions can have a big impact, especially when a library will be loaded millions of times a month all over the world. We chose to use Google’s <a href="https://developers.google.com/closure/compiler/" target="_blank">Closure Compiler</a> because its “advanced mode” currently provides the most aggressive options for code minification, and so far we’ve seen an 18% reduction in code size, with the potential for more.</p>
<p>Closure Compiler also claims to rewrite code for better runtime performance, though we haven’t had a chance to benchmark this yet.</p>
<p>Some preliminary load-time benchmarking* shows:</p>
<ul>
<li>Player load times in under 50 milliseconds</li>
<li>Playback start times in under 150 milliseconds</li>
<li>Actual video playback seen in under 0.5 seconds (using a CDN hosted MP4)</li>
</ul>
<p>*Initial tests used Chrome with an empty cache on a modern MacBook Pro with a Wi-Fi connection. More formal testing to follow.</p>
<h4>Greater Stability</h4>
<p>Automated cross-browser, cross-device testing is the Holy Grail of testing for a JavaScript library. While building version 4.0, we’ve been able to reach that goal through the use of a number of tools, including:</p>
<ul>
<li><a href="https://travis-ci.org/" target="_blank">TravisCI</a> &#8211; Automatically runs unit tests through <a href="http://phantomjs.org/" target="_blank">PhantomJS</a> on every pull request made to the Video.js source code</li>
<li><a href="http://ryanseddon.github.io/bunyip/" target="_blank">Bunyip</a> + <a href="http://www.browserstack.com/" target="_blank">Browserstack</a> &#8211; Allows us to run tests in cloud-hosted instances of any browser from IE6 to the latest Chrome, and also a wide range of iOS and Android devices.</li>
</ul>
<p>This ability to easily run tests across environments before any new release will give us more protection against regressions, and can allow for a faster feature release cycle.</p>
<h4>New Plugin Interface</h4>
<p>The new <a href="https://github.com/videojs/video.js/blob/master/docs/plugins.md" target="_blank">plugins API</a> allows developers to more easily add custom features to Video.js. The API works similarly to the jQuery plugin interface, giving developers access to add to or overwrite any piece of Video.js. Once a plugin has been created, it can be shared on the <a href="https://github.com/videojs/video.js/wiki/Plugins" target="_blank">Video.js plugin list</a> page on the wiki.</p>
<h4>New Default Skin</h4>
<p>With help from the Brightcove UX team, we’ve created a new default skin that’s simpler, more polished, and more customizable. One of the most interesting features is that we’ve moved from using images for icons to font icons. The use of font icons allows you to change the color and size of the icons simply by changing a CSS value. You can see an example of this on the <a href="http://videojs.com/" target="_blank">Video.js homepage</a>.</p>
<h4>Improved Accessibility</h4>
<p>Greg Kraus, a Video.js community member from <a href="http://www.ncsu.edu/" target="_blank">NCSU.edu</a>, did some great work testing and improving Video.js accessibility through better use of <a href="http://www.w3.org/WAI/intro/aria" target="_blank">ARIA</a> roles. The changes make it so keyboard-only users, screen reader users, and voice-interface users will be able to interact with the video player.</p>
<h4>Moved to Apache 2.0 License</h4>
<p>Earlier versions of Video.js were released under the LGPLv3 license. LGPL often gets confused with its stricter sibling, GPL, which requires that all code the software touches must also be open source. Video.js is meant to be open and free to use in all contexts, and we want that to be clear, so version 4.0 is now released under Apache 2.0, the same license Twitter Bootstrap is released under.</p>
<h4>100% JavaScript Tool Set</h4>
<p>Previously Video.js used Ruby for development tools, including Rake for deployment tasks, and zenflow–an internal Zencoder tool that builds on <a href="https://github.com/nvie/gitflow" target="_blank">gitflow</a> for development process workflow. With 4.0 we’ve moved to <a href="http://gruntjs.com/" target="_blank">Grunt</a> for tasks and we’re building out a tool similar to zenflow in Node.js.</p>
<h4>Videojs.com Now Open Source</h4>
<p>As part of this release we’ve also made the Videojs.com website open source. So if you see something that should be added or fixed, <a href="https://github.com/videojs/videojs.com" target="_blank">fork it</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2013/05/09/video-js-4-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TVnext Hack</title>
		<link>http://blog.zencoder.com/2013/05/02/tvnext-hack/</link>
		<comments>http://blog.zencoder.com/2013/05/02/tvnext-hack/#comments</comments>
		<pubDate>Thu, 02 May 2013 19:34:39 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1598</guid>
		<description><![CDATA[TVnext Hack came to an end last weekend after two awesome days of work by everyone involved. Hill Holliday was gracious enough to let us work in their offices, which have astonishing views of the Boston skyline from every window. One of the big winners of the day, taking home prizes from more than 3 categories, was [...]]]></description>
			<content:encoded><![CDATA[<p><a title="TVnext Hack" href="http://www.tvnexthack.com" target="_blank">TVnext Hack</a> came to an end last weekend after two awesome days of work by everyone involved. <a title="Hill Holliday" href="http://www.hhcc.com/" target="_blank">Hill Holliday</a> was gracious enough to let us work in their offices, which have astonishing views of the Boston skyline from every window.</p>
<p><a href="http://blog.zencoder.com/wp-content/uploads/2013/05/skyview.png"><img class="aligncenter size-full wp-image-1626" title="View from the window" src="http://blog.zencoder.com/wp-content/uploads/2013/05/skyview.png" alt="" width="800" height="471" /></a></p>
<p>One of the big winners of the day, taking home prizes from more than 3 categories, was TV Time, an app that allows children to earn the right to watch certain TV shows and movies by answering educational questions. The top prize of Best in Show went to 17 year old <a href="https://twitter.com/jenniee_l">Jen Lamere</a> for her application built around the Klout API that allows users to hide tweets that can be potential spoilers, then play them back after they&#8217;ve watched the show or event.</p>
<p>The winner of the Zencoder prize, along with &#8220;Best Use of Multiple APIs&#8221;, was Who Am I, which allows people to record an impersonation of a TV or movie character, then get their friends to guess who. Other cool hacks included a betting application that allows friends to place bets on things happening in television shows and engage with others watching the same thing and a sports knowledge application that allows viewers to get real time information on events that they don&#8217;t necessarily engage in regularly.</p>
<p><a href="http://blog.zencoder.com/wp-content/uploads/2013/04/group.jpg"><img class="aligncenter size-large wp-image-1605" title="Group Photo" src="http://blog.zencoder.com/wp-content/uploads/2013/04/group-1024x680.jpg" alt="All the sponsors and prize winners" width="1024" height="680" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2013/05/02/tvnext-hack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TVnext Hack and RailsConf</title>
		<link>http://blog.zencoder.com/2013/04/25/tvnext-hack-and-railsconf/</link>
		<comments>http://blog.zencoder.com/2013/04/25/tvnext-hack-and-railsconf/#comments</comments>
		<pubDate>Thu, 25 Apr 2013 20:07:31 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1580</guid>
		<description><![CDATA[It&#8217;s going to be an exciting few days for the Zencoder team! TVnext Hack, a hackathon focused on the television industry, starts Saturday and is being held in Boston. We&#8217;re teaming up with WatchWith to provide hackers with great television content from Psych and the Mindy Project.  They&#8217;ll have transcoding from Zencoder and a great platform [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s going to be an exciting few days for the Zencoder team! <a title="TVnext Hack" href="http://www.tvnexthack.com/">TVnext Hack</a>, a hackathon focused on the television industry, starts Saturday and is being held in Boston. We&#8217;re teaming up with <a title="WatchWith" href="http://www.watchwith.com/">WatchWith</a> to provide hackers with great television content from Psych and the Mindy Project.  They&#8217;ll have transcoding from Zencoder and a great platform from WatchWith, which they can use to build second-screen experiences. We can&#8217;t wait to see what new Internet TV xperiences people come up with.</p>
<p><a href="http://blog.zencoder.com/wp-content/uploads/2013/04/railsconf.png"><img class="aligncenter size-full wp-image-1584" title="railsconf" src="http://blog.zencoder.com/wp-content/uploads/2013/04/railsconf.png" alt="" width="700" height="200" /></a></p>
<p>If you&#8217;re going to be at <a href="http://railsconf.com/">RailsConf</a>, we&#8217;re hosting a party with <a href="http://www.sendgrid.com">SendGrid</a> at <a href="http://groundkontrol.com">Ground Kontrol</a> from 7:30 &#8211; 9:30 on Monday night (4/29). If we&#8217;re not enough of a reason to come, all of the games will be free-play and we&#8217;ll have a tab, so we&#8217;d love to see you there. Please RSVP on <a href="http://www.eventbrite.com/event/6375243525">Eventbrite</a>, but keep in mind that even if you RSVP, entry is first-come, first-serve if we reach capacity.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2013/04/25/tvnext-hack-and-railsconf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manifest Destiny &#8211; The Dynamic Generation of Playlists</title>
		<link>http://blog.zencoder.com/2013/04/02/manifest-destiny-the-dynamic-generation-of-playlists/</link>
		<comments>http://blog.zencoder.com/2013/04/02/manifest-destiny-the-dynamic-generation-of-playlists/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 00:00:38 +0000</pubDate>
		<dc:creator>John Riske</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1522</guid>
		<description><![CDATA[The last two posts (Part 1, Part 2) by your intrepid compressionist were focused on dynamic concatenation and sensible rendition selection. This post continues to dive deeper towards the core of building a flexible video platform designed for growth. A Quick Recap For years, there were two basic models of Internet streaming: server-based proprietary technology [...]]]></description>
			<content:encoded><![CDATA[<p>The last two posts (<a title="HLS Manifest Concatenation" href="http://blog.zencoder.com/2013/01/18/concatenation-hls-to-the-rescue/" target="_blank">Part 1</a>, <a title="Structuring Encoding Renditions" href="http://blog.zencoder.com/2013/02/21/structuring-renditions-for-simplicity/" target="_blank">Part 2</a>) by your intrepid compressionist were focused on dynamic concatenation and sensible rendition selection. This post continues to dive deeper towards the core of building a flexible video platform designed for growth.</p>
<p><strong>A Quick Recap</strong></p>
<p>For years, there were two basic models of Internet streaming: server-based proprietary technology such as RTMP or progressive download.  Server-based streaming allows the delivery of multi-bitrate streams that can be switched on demand, but it requires licensing expensive software. Progressive download can be done over Apache, but switching bitrates requires playback to stop.</p>
<p>The advent of HTTP-based streaming protocols such as HLS and Smooth Streaming meant that streaming delivery was possible over standard HTTP connections using commodity server technology such as Apache; seamless bitrate switching became commonplace and delivery over CDNs was simple as it was fundamentally the same as delivering any file over HTTP. HTTP streaming has resulted in nothing short of a revolution in the delivery of streaming media, vastly reducing the cost and complexity of high-quality streaming.</p>
<p>When designing a video platform there are countless things to consider; however, one of the most important and oft-overlooked decisions is how to treat HTTP-based manifest files.</p>
<p><span id="more-1522"></span></p>
<p><strong>A Static Manifest File</strong></p>
<p>In the physical world, when you purchase a video, you look at the packaging, grab the box, head to the checkout stand, pay the cashier, go home and insert it into your player.</p>
<p>Most video platforms are structured pretty similarly; fundamentally, a group of metadata (the box) is associated with a playable media item (the video). Most video platforms start with the concept of a single URL that connects the metadata to a single mp4 video. As a video platform becomes more complex, there may be multiple URLs connected to the metadata representing multiple bitrates, resolutions, or perhaps other media associated with the main item such as previews or special features.</p>
<p>Things become more complicated when trying to extend the physical model to an online streaming world that includes HTTP-based streaming protocols such as HLS. HLS is based on many fragments of a video file linked together by a text file called a manifest. When implementing HLS, the most straightforward method is to simply add a URL that links to the manifest, or m3u8 file. This has the benefit of being extremely easy, basically fitting into the existing model.</p>
<p>The drawbacks are that HLS is not really like a static media item. For example, an MP4 is very much like a video track on a DVD; it’s a single video at a single resolution and bitrate.  The HLS manifest consists, most likely, of multiple bitrates, resolutions, and thousands of fragmented pieces of video. HLS has the capacity to do so much more than an MP4, so why treat it the same?</p>
<p><strong>The HLS Playlist</strong></p>
<p>An HLS playlist includes some metadata that describes basic elements of the stream, and an ordered set of links to fragments of the video.  By downloading each fragment, or segment of the video and playing them back in sequence, the user is able to watch what appears to be a single continuous video.</p>
<p><code>EXTM3U<br />
#EXT-X-PLAYLIST-TYPE:VOD<br />
#EXT-X-TARGETDURATION:10<br />
#EXTINF:10,<br />
file-0001.ts<br />
#EXTINF:10,<br />
file-0002.ts<br />
&gt;#EXTINF:10,<br />
file-0003.ts<br />
#EXTINF:10,<br />
file-0003.ts<br />
#EXT-X-ENDLIST</code></p>
<p>Above is a basic m3u8 playlist. It links to four video segments. To generate this data programmatically, all that is needed is the filename of the first item, the target duration of the segments (in this case, 10), and the total number of segments.</p>
<p><strong>The HLS Manifest</strong></p>
<p>An HLS manifest is an unordered series of links to playlists. There are two reasons for having multiple playlists: to provide various bitrates and to provide for backup playlists.  Here is a typical playlist where each of the .m3u8’s is a relative link to another HLS playlist:</p>
<p><code>#EXTM3U<br />
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2040000<br />
file-2040k.m3u8<br />
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1540000<br />
file-1540k.m3u8<br />
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1040000<br />
file-1040k.m3u8<br />
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=640000<br />
file-640k.m3u8<br />
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=440000<br />
file-440k.m3u8<br />
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=240000<br />
file-240k.m3u8<br />
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=64000<br />
file-64k.m3u8</code></p>
<p>The playlists are of varying bitrates and resolutions in order to provide smooth playback regardless of the network conditions. All that is needed to generate a manifest are the bitrates of each playlist and their relative paths.</p>
<p><strong>Filling in the Blanks</strong></p>
<p>There are many other important pieces of information that an online video platform should be capturing for each encoded video asset: video codec, audio codec, container, and total bitrate are just a few. The data stored for a single video item should be meaningful to the viewer (description, rating, cast), meaningful to the platform (duration, views, engagement), and meaningful for applications (format, resolution, bitrate). With this data, you enable a viewer to decide what to watch, the system to decide how to program, and the application to decide how to playback.</p>
<p>By capturing the data necessary to programmatically generate a playlist, a manifest and the codec information for each of the playlists, it becomes possible to have a system where manifests and playlists are generated per request.</p>
<p><strong>Example &#8211; The First Playlist</strong></p>
<p>The HLS specification determines that whichever playlist comes first in the manifest will be the first chosen to playback. In the previous section’s example, the first item in the list was also the highest quality track. That is fine for users with a fast, stable Internet connection, but for people with slower connections it will take some time for playback to start.</p>
<p>It would be better to determine whether the device appeared to have a good Internet connection then customize the playlist accordingly. Luckily, with dynamic manifest generation, that is exactly what the system is set up to accomplish.</p>
<p>For the purposes of this exercise, assume a request for a manifest is made with an ordered array of bitrates. For example, the request [2040,1540,1040,640,440,240,64] would return a playlist identical to the one in the previous section. On iOS, it’s possible to determine if the user is on WiFi or a cellular connection. Since data has been captured about each playlist including bitrate, resolution, and other such parameters, an app can intelligently decide how to order the manifest.</p>
<p>For example, it may be determined that it’s best to start between 800-1200kbps if the user is on WiFi and between 200-600kbps if the user is on a cellular connection.  If the user were on WiFi, the app would request an array that looks something like:  [1040,2040,1540,640,440,240,64]. If the app detected only a cellular connection, it would request [440,2040,1540,1040,640,240,64].</p>
<p><strong>Example &#8211; The Legacy Device</strong></p>
<p>On Android, video support is a bit of a black box. For years, the official Android documentation only supported the use of 640&#215;480 baseline h264 mp4 video, even though certain models were able to handle 1080p. In the case of HLS, support is even more fragmented and difficult to understand.</p>
<p>Luckily, Android is dominated by a handful of marquee devices. With dynamic manifests, the app can target not only which is the best playlist to start with, but can exclude playlists that are determined to be incompatible.</p>
<p>Since our media items are also capturing data such as resolution and codec information, support can be targeted at specific devices. An app could decide to send all of the renditions:  [2040,1540,1040,640,440,240,64]. Or, an older device that only supports up to 720p could remove the highest rendition:  [1540,1040,640,440,240,64]. Furthermore, beyond the world of mobile devices, if the app is a connected TV, it could remove the lowest quality renditions: [2040,1540,1040,640].</p>
<p><strong>Dynamic or Static?</strong></p>
<p>Your favorite compressionist’s post on concatenation was focused on a single benefit of dynamic manifest generation; the ability to generate different combinations of clips to create an almost limitless number of videos. This post has been focused on the other benefits: targeted delivery to devices, optimized start times, and wider support for devices.</p>
<p>Choosing a static manifest model is perfectly fine. Some flexibility is lost, but there is nothing wrong with simplicity. Many use cases, especially in the user-generated content world, do not require the amount of complexity dynamic generation involves; however, dynamic manifest generation opens a lot of doors for those willing to take the plunge.</p>
<p>How manifests are treated will have a significant impact on the long-term flexibility of a video platform, and it is something that should be discussed with your resident compressionist.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2013/04/02/manifest-destiny-the-dynamic-generation-of-playlists/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Announcing Cloud Transcoding for Live Video</title>
		<link>http://blog.zencoder.com/2013/03/27/announcing-cloud-transcoding-for-live-video/</link>
		<comments>http://blog.zencoder.com/2013/03/27/announcing-cloud-transcoding-for-live-video/#comments</comments>
		<pubDate>Wed, 27 Mar 2013 17:12:29 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1529</guid>
		<description><![CDATA[Yesterday we announced the general availability of our newest product, Live Cloud Transcoding, a cloud-based API for transcoding live video. Streaming high-quality, live video over the web is a difficult problem that generally requires expensive hardware and considerable skill to set up and operate. Recent years have shown an increase in the number of streaming [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday we announced the general availability of our newest product, Live Cloud Transcoding, a cloud-based API for transcoding live video.</p>
<p>Streaming high-quality, live video over the web is a difficult problem that generally requires expensive hardware and considerable skill to set up and operate. Recent years have shown an increase in the number of streaming formats available combined with an explosion in internet connected consumer devices, making the job of content providers even harder.</p>
<p>Over the last three years, Zencoder has offered the fastest, most scalable, and highest quality file transcoding in the cloud. We&#8217;re bringing the same approach to live video, with a focus on performance, features, and API usability. Our initial release is simple, straightforward, and powerful.</p>
<p><span id="more-1529"></span></p>
<p>The web service will accept RTMP input streams, and transcode to RTMP and HLS in multiple bitrates for adaptive bitrate playback.  Thanks in no small part to all of the great participants in the beta, we&#8217;re proud to present a product that we think will change the world of live event streaming online.</p>
<p>Cloud-based VOD transcoding has enabled a lot of really cool products – certainly more than we could dream up.  The costs and complexity of live video can discourage experimentation, so we’re now putting powerful live transcoding at every developer’s fingertips.  We can’t wait to see the results.</p>
<p>Cloud transcoding for live video offers some major efficiencies:</p>
<p><strong>Eliminate outbound bandwidth bottlenecks. </strong>Outbound bandwidth can be a major bottleneck for distributing live video.  Encoding on-premise limits the number and bitrates of streams to the outbound throughput, leading to tough decisions between device support and providing the best user experience with technologies like adaptive bitrate playback.  With Live Cloud Transcoding, content providers publish just one RTMP stream, and transcode to other formats and bitrates.</p>
<p><strong>Use inexpensive (or free) encoders at the event. </strong>Simply use an off-the-shelf laptop and a software encoder like Flash Media Live Encoder, XSplit, OBS or Wirecast, and you&#8217;re ready to rock.  Of course, you can still use a hardware encoder such as Elemental and achieve bandwidth efficiences.</p>
<p><strong>Transparently scales to handle any number of input streams. </strong>Broadcasting multiple camera angles or several simultaneous events is simple and minimizes upfront investments in expensive hardware or software.</p>
<p><strong>Scale to handle numerous output streams. </strong>Output streams can be gated not only by bandwidth, but also by processing power.  The cloud provides instant access to powerful computing resources and in the initial launch, we’ll allow up to 20 output streams per live input stream.</p>
<p><strong>Simplify Live -&gt; File workflow. </strong>Event streams are easily archived and immediately made available as a file.</p>
<p><strong>Usage-based pricing. </strong>Users pay only for what they use, and never over provision..</p>
<p>Ready to give it a try?</p>
<ul>
<li>Everyone that <a title="Zencoder Account Signup" href="https://app.zencoder.com/signup/" target="_blank">signs up</a> and activates a PAYG account will get access to 120 minutes of Live transcoding.</li>
<li>Check out our <a title="Live Transcoding Guide and Recommendations" href="https://app.zencoder.com/docs/guides/encoding-settings/using-live-streaming">Live transcoding guide and recommendations</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2013/03/27/announcing-cloud-transcoding-for-live-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Look ma, no backend &#8211; Uploading and encoding using Filepicker.io and Zencoder</title>
		<link>http://blog.zencoder.com/2013/03/20/look-ma-no-backend-uploading-and-encoding-using-filepicker-io-and-zencoder/</link>
		<comments>http://blog.zencoder.com/2013/03/20/look-ma-no-backend-uploading-and-encoding-using-filepicker-io-and-zencoder/#comments</comments>
		<pubDate>Wed, 20 Mar 2013 23:51:59 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1501</guid>
		<description><![CDATA[How to go about uploading videos is one of the most common questions we get from new customers at Zencoder. As a developer, implementing file uploads is something you&#8217;ve probably done a few times, but it&#8217;s always a pain. Enter Filepicker.io Filepicker.io makes file upload easy. Like, really easy. You&#8217;re not just limited to just [...]]]></description>
			<content:encoded><![CDATA[<p>How to go about uploading videos is one of the most common questions we get from new customers at Zencoder. As a developer, implementing file uploads is something you&#8217;ve probably done a few times, but it&#8217;s always a pain.</p>
<h2>Enter Filepicker.io</h2>
<p><a href="http://www.filepicker.io">Filepicker.io</a> makes file upload easy. Like, really easy. You&#8217;re not just limited to just local files either; they support a wide range of sources, from Dropbox and Google to even recording a video directly from your webcam. The best part is, you can do all of this without ever leaving the front-end.</p>
<p>Before we do anything else, you&#8217;ll need to <a href="https://developers.filepicker.io/register/">sign up</a> for a Filepicker.io account. Once you&#8217;ve done so, create a new App in your dashboard if one doesn&#8217;t exist. Take note of the API key you see, we&#8217;ll be using that later. Filepicker.io is nice enough to provide an S3 bucket for getting started, but take a second to <a href="https://developers.filepicker.io/page/s3/">set up a destination S3 bucket</a> for your uploads.</p>
<p><span id="more-1501"></span></p>
<p>Let&#8217;s start on the same page with a basic HTML5 template. We&#8217;re going to use jQuery to make things simple, so we&#8217;ll include that with our boilerplate along with the Filepicker.io library.</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"&gt;
&lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt;
    &lt;title&gt;Zencoder Dropzone&lt;/title&gt;

    &lt;!-- jQuery Include --&gt;
    &lt;script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"&gt;&lt;/script&gt;

    &lt;!-- Filepicker.io Include --&gt;
    &lt;script type="text/javascript" src="//api.filepicker.io/v1/filepicker.js"&gt;&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id="content"&gt;
        &lt;h1&gt;Upload all the things!&lt;/h1&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>Now we can use the Filepicker.io JavaScript API to allow our users to select a file and save it to our S3 bucket. We&#8217;ll also need to associate this with a link in the body so the user has something to click. Add this below the Filepicker.io JavaScript include.</p>
<p>First let&#8217;s add the upload link. Since we already have a big, prominent <code>h1</code> tag, let&#8217;s just add the link to that.</p>
<pre><code>&lt;h1&gt;&lt;a href="#" id="upload-link"&gt;Upload all the things!&lt;/a&gt;&lt;/h1&gt;
</code></pre>
<p>Now we want to use that link to trigger <a href="https://developers.filepicker.io/docs/web/#pickAndStore"><code>filepicker.pickAndStore</code></a> when clicked. This is where we&#8217;ll use the API key you made note of earlier. Place this snippet below the Filepicker.io JavaScript include in the head of the page.</p>
<pre><code>&lt;script type="text/javascript"&gt;
    $(function() {
      filepicker.setKey('The_Key_From_Your_Dashboard');

      $('a').click(function(e) {
        e.preventDefault(); // This keeps the normal link behavior from happening

        filepicker.pickAndStore({},{location: 's3'},function(fpfiles){
            console.log(JSON.stringify(fpfiles));
        });
      });
    });
&lt;/script&gt;
</code></pre>
<p>You&#8217;ll need to use some sort of web server to serve up the HTML or else you won&#8217;t be able to load the external JavaScript files. You can use something like <a href="http://blog.nodejitsu.com/http-server">http-server</a>, but there&#8217;s a basic Node application that will serve static files in the <a href="https://github.com/zencoder/filepicker-zencoder">GitHub repository</a>. Your page should look pretty unimpressive at this point. You should just see a big link and a lot of white space.</p>
<p><img src="http://f.cl.ly/items/1S0u0S0g0J2S1M2E2M1H/Screen%20Shot%202013-03-15%20at%203.27.55%20PM.png" alt="Just the link" /></p>
<p>If you click the link, though…</p>
<p><img src="http://f.cl.ly/items/2F3W0Y3M2V0T2M031D44/Screen%20Shot%202013-03-15%20at%203.29.14%20PM.png" alt="Tadaa!" /></p>
<p>Choose any file (might want to pick something relatively small) and upload it. Right now, a successful upload just logs the <code>fpfiles</code> object to the console, so after you upload a file take a look at the console. If everything went according to plan, you should have an object with some information about your newly uploaded file.</p>
<p><img src="http://f.cl.ly/items/0k0f0Y3w1J0G2M2C1I1p/Screen%20Shot%202013-03-15%20at%203.31.43%20PM.png" alt="fpfiles object" /></p>
<p>Congratulations! You just uploaded a file from your computer with just 27 <em>total</em> lines of code, including simple HTML markup. Just uploading files and leaving them there isn&#8217;t useful though, so let&#8217;s make it so users can upload videos and encode them.</p>
<h2>Adding some Zencoder to the mix</h2>
<p>First, let&#8217;s alter our uploader to only accept video files. Filepicker allows us to restrict by mimetype, so if you&#8217;re like me you may be tempted to try <code>{mimetype: 'video/*'}</code>. This will work just fine in Chrome, but your Safari users will see a much smaller subset of files that they can upload. For video, it&#8217;s much more reliable to restrict by extension, so let&#8217;s take that route.</p>
<pre><code>$('a').click(function(e) {
  e.preventDefault(); // This keeps the normal link behavior from happening
  var acceptedExtensions = ['3g2','3gp','3gp2','3gpp','3gpp2','aac','ac3','eac3','ec3','f4a','f4b','f4v','flv','highwinds','m4a','m4b','m4r','m4v','mkv','mov','mp3','mp4','oga','ogg','ogv','ogx','ts','webm','wma','wmv'];
  filepicker.pickAndStore({extensions: acceptedExtensions},{location: 's3'},function(fpfiles){
      console.log(JSON.stringify(fpfiles));
  });
});
</code></pre>
<p>You can restrict this set of accepted files or add more, but I took the easy way out and just used the list of valid output formats from the Zencoder <a href="https://app.zencoder.com/docs/api/encoding/format-and-codecs/format">format</a> documentation. This includes some audio files, but since Zencoder supports audio-only encoding we can leave them in there.</p>
<p>Now if you click the link and browse your local files, you should notice that you can only select files with an extension on the list. If you try to drag and drop an unnacceptable file, you&#8217;ll get an error.</p>
<p><img src="http://f.cl.ly/items/2N3B1Q0V3q1J0y142u2a/Screen%20Shot%202013-03-15%20at%203.55.42%20PM.png" alt="Unacceptable file error" /></p>
<p>Great! Now that we know we&#8217;ll only be uploading files Zencoder can support, let&#8217;s make it so a successful upload sends that file to Zencoder for encoding. Before we can do that, we&#8217;ll need to set our <a href="https://app.zencoder.com/api">Zencoder API key</a>. You can just include this right below your Filepicker key.</p>
<pre><code>filepicker.setKey('The_Key_From_Your_Dashboard');
var zenKey = 'Zencoder_API_Key';
</code></pre>
<p>Now we&#8217;ll use jQuery&#8217;s <code>$.ajax</code> to send our API request to Zencoder upon successful upload.</p>
<pre><code>filepicker.pickAndStore({extensions: acceptedExtensions},{location: 's3'},function(fpfiles){
  // This is the simplest Zencoder API call you can make. This will output an h.264 mp4 with AAC audio and
  // save it to Zencoder's temporary storage on S3.
  var request = {
    "input": fpfiles[0].url
  }
  // Let's use $.ajax instead of $.post so we can specify custom headers.
  $.ajax({
      url: 'https://app.zencoder.com/api/v2/jobs',
      type: 'POST',
      data: JSON.stringify(request),
      headers: { "Zencoder-Api-Key": zenKey },
      dataType: 'json',
      success: function(data) {
        $('body').append('Job created! &lt;a href="https://app.zencoder.com/jobs/'+ data.id +'"&gt;View Job&lt;/a&gt;')
      },
      error: function(data) {
        console.log(data);
      }
  });
});
</code></pre>
<p>Now refresh your page and upload a video. If everything has gone according to plan you should see a success message with a link to your newly created job.</p>
<p><img src="http://f.cl.ly/items/3p2f163R3G0G132T3o1R/Screen%20Shot%202013-03-15%20at%204.26.11%20PM.png" alt="job created" /></p>
<p>There you go! 47 lines of code later you have a web page that will allow you to upload a video and send it off for encoding.</p>
<h2>Notes and warnings</h2>
<p>It is a <strong>BAD IDEA</strong> to put your Zencoder API key in plain text inside of JavaScript. Just to repeat that one more time, <strong>do <em>not</em> use this in code that other people could possibly access</strong>.</p>
<h3>Nothing would stop people from taking your API key and encoding all the video they wanted.</h3>
<p>A much better idea would be to use Filepicker.io as described, but actually make the Zencoder API call in your back end where your API key is safe from prying eyes.</p>
<h2>Just to take things a step further…</h2>
<p><img src="http://f.cl.ly/items/343v433z2i2E1w3h151f/Screen%20Shot%202013-03-15%20at%204.37.29%20PM.png" alt="drop zone" /></p>
<p>I think drag and drop is really cool, so I wanted to make a whole page that uses Filepicker.io&#8217;s <a href="https://developers.filepicker.io/docs/web/#widgets-droppane"><code>makeDropPane</code></a>. Users have to put their API key in before doing anything and it&#8217;s not stored in the code, so the <a href="http://zenpicker.s3-website-us-east-1.amazonaws.com/dropzone.html">demo</a> is safe to put online.</p>
<h2>Aaand even further…</h2>
<p><img src="http://f.cl.ly/items/1s453Z3B2h392L2W0a2w/Screen%20Shot%202013-03-19%20at%205.38.44%20PM.png" alt="drop zone with history" /></p>
<p>Just to officially take the demo too far, <a href="http://zenpicker.s3-website-us-east-1.amazonaws.com/dropzone_history.html">this version</a> validates the API key, includes a history of your recent Zencoder jobs and allows you to modify the request template. All of these settings are saved in your browser&#8217;s localStorage so you don&#8217;t lose everything on a refresh. I tried to over-comment, so feel free to take a look through the <a href="https://github.com/zencoder/filepicker-zencoder/blob/master/dropzone_history.html" target="_blank">source</a>!</p>
<p>I would love to hear what you think! You can find me on Twitter as <a href="http://www.twitter.com/matt_mcclure">@matt_mcclure</a> if you have any questions or comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2013/03/20/look-ma-no-backend-uploading-and-encoding-using-filepicker-io-and-zencoder/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Customer Q&amp;A with Sibme</title>
		<link>http://blog.zencoder.com/2013/03/07/customer-qa-with-sibme/</link>
		<comments>http://blog.zencoder.com/2013/03/07/customer-qa-with-sibme/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 22:54:14 +0000</pubDate>
		<dc:creator>John Riske</dc:creator>
				<category><![CDATA[Case Study]]></category>
		<category><![CDATA[Customers]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1494</guid>
		<description><![CDATA[Congratulations to Zencoder customer Sibme on their launch.  Internet video is a major component of the rapid evolution that is underway in education.  While other Zencoder customers such as Khan Academy use video as an instructional tool for students, Sibme was founded by three former educators as a web-based professional development tool built to empower teachers, administrators, [...]]]></description>
			<content:encoded><![CDATA[<p>Congratulations to Zencoder customer <a title="Sibme:  Video collaboration for instructional staff." href="http://sibme.com/" target="_blank">Sibme</a> on their launch.  Internet video is a major component of the rapid evolution that is underway in education.  While other Zencoder customers such as <a href="http://blog.zencoder.com/2012/03/14/khan-academy-and-support-for-non-profits/" target="_blank">Khan Academy</a> use video as an instructional tool for students, Sibme was founded by three former educators as a web-based professional development tool built to empower teachers, administrators, and instructional coaches.</p>
<p>The following is a quick Q&amp;A with Sibme co-founder <a title="About Sibme - video collaboration for instructors." href="http://sibme.com/about.html" target="_blank">Dave Wakefield</a> on how they use video, and how they use Zencoder.</p>
<p><strong>Tell us about more about the work that you do at Sibme.</strong></p>
<p>Sibme is a private video collaboration and professional development platform for teachers, instructors, and instructional support staff. Video is a powerful way to train and provide instructional feedback to educators.  The problem has always been that it has never been that easy or efficient to implement in schools and institutions. While athletes like Peyton Manning spend a lot of time reviewing game tape to improve their performance, teachers rarely have enough time in the day to think about professional development.  There are no reason teachers or instructors should not be doing the same.  Sibme allows for more meaningful and frequent observation in schools in a private and secure environment. Many teachers are willing to use video to collaborate with their peers and improve their craft if they trust and respect the reviewer’s opinion.</p>
<p><span id="more-1494"></span></p>
<p><strong>How do the needs of your customers and their consumers affect how you use video?</strong></p>
<p>Our video tools have also been designed specifically for educators.   For example, if your instructional coach notices that you missed an opportunity to compliment a student’s answer at time 5:34 in the video, she can flag that exact moment and add a comment.  Or you can upload a document with the lesson plan you were following, so your coach can follow along as you go.  Our intention as educators was to design a product that had all the necessary features but remained simple, flexible and customizable to suit the needs of a small department, large school, or even a large institution.</p>
<p><strong>What challenges did you face with video, and how did Zencoder help?  Why did you choose Zencoder over other methods of encoding?</strong></p>
<p>When we first imagined our service we thought about using public video services such as YouTube and Vimeo. However, most schools and districts do not want sensitive and private information like classroom video on public sites like YouTube and Vimeo, even when using their privacy settings.</p>
<p>Once we decided that we weren&#8217;t going to use one of the video services available on the web, we knew that we needed to encode videos ourselves. We explored the idea of creating an encoding server on a LAMP stack using FFMPEG, the leading open source video encoding solution. What we found was that the knowledge and resources required to build the encoding server and keep it up and running reliably was well beyond what we could achieve with our limited resources.  It just wasn’t worth the time or effort, since our focus is on improving teaching and learning.</p>
<p><strong>Zencoder is an API-based service.  How did you integrate with us?</strong></p>
<p>Our application uses a Java based uploader that uploads files directly to Zencoder. Once encoded, the video is uploaded to S3 and appears in the account that it was uploaded from.  We have also developed an iPhone app that allows for more efficient uploading to supplement the java uploader.</p>
<p><strong>What&#8217;s your favorite thing about Zencoder?</strong></p>
<p>Our favorite thing about Zencoder is how reliable it is.  We’ve tried out some competitors but their encoding times and failure rates were not as good as Zencoders.  Educators don’t have enough time in the day to deal with encoding failures. We love its reliability, compression speed and the fact that we can seamlessly integrate the encoding process with our application.</p>
<p><strong>What excites you most about the future of online video?</strong></p>
<p>Online video can be used in a variety of ways, not solely for entertainment or advertisements.  We&#8217;re very excited to see how video is transforming the web in a variety of industries, and we think it is going to transform the way we currently do things, especially when it comes to professional development in education.  Zencoder will play a big role in making this process even more efficient.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2013/03/07/customer-qa-with-sibme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Structuring Renditions for Simplicity</title>
		<link>http://blog.zencoder.com/2013/02/21/structuring-renditions-for-simplicity/</link>
		<comments>http://blog.zencoder.com/2013/02/21/structuring-renditions-for-simplicity/#comments</comments>
		<pubDate>Thu, 21 Feb 2013 22:02:09 +0000</pubDate>
		<dc:creator>Casey Wilms</dc:creator>
				<category><![CDATA[Codecs]]></category>
		<category><![CDATA[Guides]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1465</guid>
		<description><![CDATA[In a multi-device world, navigating the murky waters of video support can be tricky, especially when you’re trying to keep costs down and quality high. Renditions and The Modern World In its most basic form, online video consists of transcoding a single source file into a single output file that will play over the Web. [...]]]></description>
			<content:encoded><![CDATA[<p>In a multi-device world, navigating the murky waters of video support can be tricky, especially when you’re trying to keep costs down and quality high.</p>
<p><strong>Renditions and The Modern World</strong></p>
<p>In its most basic form, online video consists of transcoding a single source file into a single output file that will play over the Web. Each of these video files is called a rendition, and an array of renditions defines how video will be delivered to end-users.</p>
<p>When YouTube launched in 2005, it delivered a single output rendition through a basic player. Fast forward to 2013 and the world of online video is defined by HTML5/Flash players, ad-insertion, recommendation engines, paywalls, and anywhere from a handful to a boatload of renditions at different bitrates and in various formats.</p>
<p>It may sound like a confusing mess, and it can be, but there are strategies that can simplify your approach to delivering video, shrink costs, and improve the viewer’s experience. It all starts with renditions.</p>
<p><span id="more-1465"></span></p>
<p><strong>Climb the Ladder</strong></p>
<p>Imagine the world of devices as a wall. At the bottom of the wall are the least capable, most painful-to-use feature-phones with 3G connections and a tiny screen. At the top of the wall, we have a brand new, HDTV with a fast Internet connection. Between the bottom and the top of the wall is a range of devices, each having different processors, GPUs, network connections and screen sizes.</p>
<p>The height of the wall is determined by average content duration; the longer the duration, the higher the wall. Renditions are like ladders that help us start anywhere along the wall and climb up or down smoothly. If the wall is high, there needs to be more rungs on the ladder to ensure users can smoothly climb up and down. If the wall is short, we can get away with only a couple rungs and still provide a good experience</p>
<p style="text-align: center;"><a href="http://blog.zencoder.com/wp-content/uploads/2013/02/climbing-the-ladder1.jpg"><img class="aligncenter" title="climbing-the-ladder" src="http://blog.zencoder.com/wp-content/uploads/2013/02/climbing-the-ladder1.jpg" alt="" width="648" height="576" /></a></p>
<p><a href="http://blog.zencoder.com/wp-content/uploads/2013/02/climbing-the-ladder1.jpg"></a><strong>Step 1:  The First Ladder</strong></p>
<p>The first step is to decide on a base format. The base format should be playable on a wide range of devices. It might not always be the best choice on every device, but it should always be playable. The goal of online video is to get in front of everybody.</p>
<p>Zencoder supports a wide swath of the most important output formats for Web, mobile and connected TVs. Valid use cases exist for each of these formats; but, for the vast majority, MP4 is the best option due to its ubiquity across the widest range of devices.  The first ladder we build will be based on the MP4 format.</p>
<p><a href="http://blog.zencoder.com/wp-content/uploads/2013/02/climbing-the-ladder-step2.jpg"></a></p>
<p><strong>Step 2:  Bitrates &#8211; Creating the Ladder’s Rungs</strong></p>
<p>Now that we have decided which ladder to create first, we can begin constructing the rungs.</p>
<div>
<p>First, decide where on the wall the service should start and end. For example, consider a user-generated content site where the average video duration is one minute. The maximum size of each video is small, so there is no need to worry about buffering or stream disruptions; the player should be able to download the whole stream in a few seconds, which means only a couple of renditions are needed, for example, one HD and one SD.</p>
<p style="text-align: left;"><img class="aligncenter" title="climbing-the-ladder-step2" src="http://blog.zencoder.com/wp-content/uploads/2013/02/climbing-the-ladder-step2.jpg" alt="" width="648" height="576" />On the other hand, consider a movie service with an average video length of 120 minutes. The files are large, which means the user’s device won’t be able to download the entire stream. In addition, users generally have higher expectations for the quality of feature films. We need to create a number of renditions so users will be able to watch high-quality videos when they have a strong network connection.</p>
<p>If the connection is poor, we still want them to be able to watch a video, and then improve the experience as soon as more bandwidth is available by providing intermediate renditions &#8212; stepping up the ladder.The longer the content and the higher the quality, the more renditions are needed to provide a consistent viewing experience.</p>
<p><strong>Step 3:  Defining the Rungs</strong></p>
<p><strong> </strong>We’ve created a nice, smooth ladder, but there is room for improvement. Aside from bitrate and resolution, H.264 has two other features that are used to target renditions at subsets of devices: profile and level.</p>
</div>
<div>
<p>Profile defines the complexity of the encoding algorithm required to decode a given rendition ranging from low to high complexity. The three most important profiles are baseline, main and high. Level defines a maximum amount of pixels and bitrate that a certain rendition is guaranteed not to exceed. The three most important levels are 3.0 (SD/legacy mobile), 3.1 (720p/mobile), and 4.1 (1080p/modern devices).</p>
<p>At the bottom rung, we want to provide the widest array of support so that we can always deliver a playable video regardless of the device. That means we should choose either baseline 3.0 or main 3.1, and we should choose a resolution that is fairly modest, most likely between mobile or 640&#215;360. As we move up the ladder, we can gradually increment these values until we reach the top, where we can maximize our video quality with 1080p high 4.1 videos.</p>
<p style="text-align: center;"><a href="http://blog.zencoder.com/wp-content/uploads/2013/02/climbing-the-ladder-step3.jpg"><img class="aligncenter" title="climbing-the-ladder-step3" src="http://blog.zencoder.com/wp-content/uploads/2013/02/climbing-the-ladder-step3.jpg" alt="" width="648" height="576" /></a></p>
<p><a href="http://blog.zencoder.com/wp-content/uploads/2013/02/climbing-the-ladder-step3.jpg"></a><strong>Step 4:  Formats &#8211; Duplicating Ladders</strong></p>
<p>Now that our MP4s have been created, we have a stable base format and customers can watch video on a variety of devices; we created a ladder to scale the wall. While MP4 is a strong baseline format, other formats can improve the user’s experience.  For example, HLS allows a user’s device to automatically and seamlessly jump up and down the ladder.</p>
<p>Since we’ve already created MP4s, and because MP4 is a standard format, we can easily repackage it into other formats. In fact, this is such an easy task that Zencoder charges only 25% of a normal job to perform this duplication, or transmuxing, and it can be done nearly instantly alongside a group of MP4 encodings by using “source”, “copy_video”, and “copy_audio.”</p>
<p>The “source” command tells Zencoder to reuse the file created under a given output “label.” So, if we create a file with “label:”:= “MP4_250,” all we need to do is use “source:” “MP4_250” to tell Zencoder to reuse this rendition. “Copy_video” and “copy audio” will then extract the elemental audio and video tracks, and repackage them into an HLS formatted file.</p>
<p style="text-align: left;"><a href="http://blog.zencoder.com/wp-content/uploads/2013/02/duplicating-ladders.jpg"><img class="aligncenter" title="duplicating-ladders" src="http://blog.zencoder.com/wp-content/uploads/2013/02/duplicating-ladders.jpg" alt="" width="648" height="576" /></a>We can do the same thing for smooth streaming as well. And almost instantly, at a fraction of the cost, we’ve created two new ladders that let virtually anybody watch great quality video.</p>
<p><strong>Step 5:  Refine</strong></p>
<p>The most important thing a video service can do is commit itself to constantly improving, revisiting, and refining its renditions.</p>
<p>With the pace of online video accelerating by the day, what seems terrific today might only be sufficient next year. In a couple of years, it will be downright obsolete.  Zencoder helps solve these issues by being a driving force behind the bleeding edge of video encoding technology. We are constantly updating and building our tools to make the encoding platform faster and more stable with higher quality.</p>
<p>The next step is up to you &#8212; constantly testing new variations to find the best set of renditions for your users will result in a more stable and optimized delivery infrastructure and a more engaged user base.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2013/02/21/structuring-renditions-for-simplicity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
