<?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>Tue, 03 May 2016 20:40:52 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.1</generator>
	<item>
		<title>Zencoder Blog Has Moved!</title>
		<link>http://blog.zencoder.com/2016/05/03/zencoder-blog-has-moved/</link>
		<comments>http://blog.zencoder.com/2016/05/03/zencoder-blog-has-moved/#comments</comments>
		<pubDate>Tue, 03 May 2016 20:40:52 +0000</pubDate>
		<dc:creator><![CDATA[Tanya]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://blog.zencoder.com/?p=2093</guid>
		<description><![CDATA[Please visit blog.brightcove.com for the most recent content.]]></description>
				<content:encoded><![CDATA[<p>Please visit <a href="https://blog.brightcove.com/en/">blog.brightcove.com</a> for the most recent content.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2016/05/03/zencoder-blog-has-moved/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Get Started with UHD in Zencoder</title>
		<link>http://blog.zencoder.com/2016/05/03/how-to-get-started-with-uhd-in-zencoder/</link>
		<comments>http://blog.zencoder.com/2016/05/03/how-to-get-started-with-uhd-in-zencoder/#comments</comments>
		<pubDate>Tue, 03 May 2016 20:40:34 +0000</pubDate>
		<dc:creator><![CDATA[Tanya]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://blog.zencoder.com/?p=2095</guid>
		<description><![CDATA[We recently launched support for Ultra High Definition (UHD) transcoding in Zencoder. UHD is not only about higher resolutions (up to 4K), but it is also about support for new video codecs (H.265 and VP9), and enabling workflows for high dynamic range (HDR) content through support for 10-bit color processing and the BT.2020 color space. To [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>We recently launched support for Ultra High Definition (UHD) transcoding in Zencoder. UHD is not only about higher resolutions (up to 4K), but it is also about support for new video codecs (H.265 and VP9), and enabling workflows for high dynamic range (HDR) content through support for 10-bit color processing and the BT.2020 color space. To learn more about these new features and how to get started, check out <a href="https://blog.brightcove.com/en/2016/05/how-get-started-uhd-zencoder">this post</a> on Zencoder blog&#8217;s new home.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2016/05/03/how-to-get-started-with-uhd-in-zencoder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Stats Are In: Brightcove Zencoder Supports EVS to Deliver the First World Cup™ on the Second Screen</title>
		<link>http://blog.zencoder.com/2014/10/28/zencoder-supports-evs-to-deliver-the-first-world-cup/</link>
		<comments>http://blog.zencoder.com/2014/10/28/zencoder-supports-evs-to-deliver-the-first-world-cup/#comments</comments>
		<pubDate>Tue, 28 Oct 2014 19:47:06 +0000</pubDate>
		<dc:creator><![CDATA[Tanya]]></dc:creator>
				<category><![CDATA[Case Study]]></category>
		<category><![CDATA[Customers]]></category>

		<guid isPermaLink="false">https://blog.zencoder.com/?p=2080</guid>
		<description><![CDATA[This post originally appeared on the Brightcove blog. This summer, sports fans around the world hit pause on their daily lives to tune into the 2014 World Cup Brazil™. While the trip to Brazil was not possible for many, the opportunity to view at home (or the office!) and consume complementary content on the second [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>This post originally appeared on the<a href="http://blog.brightcove.com/en/2014/10/stats-are-brightcove-zencoder-supports-evs-deliver-first-world-cup%E2%84%A2-second-screen"> Brightcove blog</a>.</p>
<p>This summer, sports fans around the world hit pause on their daily lives to tune into the 2014 World Cup Brazil™. While the trip to Brazil was not possible for many, the opportunity to view at home (or the office!) and consume complementary content on the second screen was a popular choice.</p>
<p>Viewers cheering on via computers and connected devices were offered a new perspective this year by being able to review multiple camera angles as the games were being played. To provide this multi-screen action review and a wide range of other second screen content to viewers from afar, EVS, a global provider of live video production systems, leveraged Brightcove’s Zencoder cloud-based encoding service to power transcoding for its C-Cast content delivery solution.  <span style="color: rgb(0, 0, 0);">C-Cast is a multimedia distribution platform that allows broadcasters to instantly deliver complementary content to viewers on web and mobile devices during live events. Host Broadcasting Services (HBS), the main provider of broadcast and interactive services for the 2014 FIFA World Cup, managed the implementation and integration of C-Cast to deploy second-screen experiences.</span></p>
<p style="color: #717171;"><span style="color: rgb(0, 0, 0);">“We took second screen content to the next level by allowing broadcasters to deliver multi-camera action review, key highlights browsing and review, stats-related content and player, team and personality tracking,” said Nicolas Bourdon, SVP Marketing at EVS. “This completely enhanced the at-home viewing experience and judging by the stats, viewers were pleased and eager to view the World Cup this way.”</span></p>
<p style="color: #717171;"><span style="color: rgb(0, 0, 0);">Reaching the magnitude of viewers that the World Cup attracts with a high-quality viewing experience is no easy feat. With the games over and the numbers crunched, we’re happy to share some stats directly from Zencoder on the scale of video that powered the World Cup on the second screen:</span></p>
<p>&nbsp;</p>
<p><a href="https://blog.zencoder.com/wp-content/uploads/2014/10/zc-worldcup-blog-800.jpg"><img class="alignnone size-full wp-image-2082" src="https://blog.zencoder.com/wp-content/uploads/2014/10/zc-worldcup-blog-800.jpg" alt="zc-worldcup-blog-800" width="800" height="2866" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2014/10/28/zencoder-supports-evs-to-deliver-the-first-world-cup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 Video and the End of Plugins</title>
		<link>http://blog.zencoder.com/2014/07/28/html5-video-and-the-end-of-plugins-recording-uploading-and-transcoding-video-straight-from-the-browser/</link>
		<comments>http://blog.zencoder.com/2014/07/28/html5-video-and-the-end-of-plugins-recording-uploading-and-transcoding-video-straight-from-the-browser/#comments</comments>
		<pubDate>Mon, 28 Jul 2014 21:23:11 +0000</pubDate>
		<dc:creator><![CDATA[matt]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://blog.zencoder.com/?p=2057</guid>
		<description><![CDATA[Recording, uploading and transcoding video straight from the browser Video on the web continues to grow by leaps and bounds. If you want a cheap-but-good analogy, it&#8217;s about a tween: it already knows a lot, but still has substantial growth ahead. It&#8217;s becoming too cool for plugins like Flash and Silverlight, but a lot of [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2>Recording, uploading and transcoding video straight from the browser</h2>
<p>Video on the web continues to grow by leaps and bounds. If you want a cheap-but-good analogy, it&#8217;s about a tween: it already knows a lot, but still has substantial growth ahead.  It&#8217;s becoming too cool for plugins like Flash and Silverlight, but a lot of the shiny and exciting APIs on the edge of the spec still need to mature a little.</p>
<p>Last year at <a href="http://webexpo.net/">WebExpo</a> I gave a talk about the <a href="http://webexpo.net/prague2013/talk/html5-video-present-and-future/">future of video on the web</a>, as well as a brief foray into new and exciting features that were on the way. Some of the things I talked about, like <a href="https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/encrypted-media.html">Encrypted Media Extensions</a>, were, for the most part, still a pipe dream with few to no working implementations. Now, just a year later, nearly all of the things discussed in that talk have meaningful implementations in <em>most</em> modern browsers.</p>
<p>I recently gave a talk at <a href="http://www.developer-week.com/">Developer-Week</a> about how the future of video on the web has arrived. During the talk we walked through real world examples of each &#8220;future&#8221; feature and, amazingly, talked about how each of the features could be (cautiously) used in the wild today.</p>
<p>One of those features was <a href="https://webrtc.org">WebRTC</a> and using the APIs individually. We built a simple example of using <code>getUserMedia</code> to request a user&#8217;s webcam and display it in a video element. To take this a step further, let&#8217;s take that example and use it to save, then transcode content directly from the browser.</p>
<p><span id="more-2057"></span></p>
<h3>Simple Example</h3>
<p>Before we start on taking things further, let&#8217;s take a look at the initial, simpler example I showed during the presentation. All we&#8217;ll do here is request a user&#8217;s video stream, and show that in a video element on the page. We&#8217;ll be using jQuery for the more advanced example, so we&#8217;ll go ahead and start using it here.</p>
<pre class="brush: jscript; title: ;">
// Do the vendor prefix dance
navigator.getUserMedia  = navigator.getUserMedia    || navigator.webkitGetUserMedia ||
                          navigator.mozGetUserMedia || navigator.msGetUserMedia;

// Set up an error handler on the callback
var errCallback = function(e) {
  console.log('Did you just reject me?!', e);
};

// Request the user's media
function requestMedia(e) {
  e.preventDefault();

// Use the vendor prefixed getUserMedia we set up above and request just video
  navigator.getUserMedia({video: true, audio: false}, showMedia, errCallback);
}

// Actually show the media
function showMedia(stream) {
  var video = document.getElementById('user-media');
  video.src = window.URL.createObjectURL(stream);

video.onloadedmetadata = function(e) {
    console.log('Locked and loaded.');
  };
}

// Set up a click handler to kick off the process
$(function() {
  $('#get-user-media').click(requestMedia);
});
</pre>
<p>Now we just need the button and the video element and we&#8217;re ready to go.</p>
<pre class="brush: xml; title: ;">
&lt;p&gt;&lt;a id=&quot;get-user-media&quot; class=&quot;btn btn-primary&quot;&gt;Get Media!&lt;/a&gt;&lt;/p&gt;

&lt;video id=&quot;user-media&quot; autoplay height=&quot;300&quot;&gt;&lt;/video&gt;
</pre>
<p>After clicking the &#8220;Get Media!&#8221; button and allowing the browser access to your camera, the end result should look something like this:</p>
<p><img src="https://i.cloudup.com/9xMG9q0Vdt.png" alt="simple screenshot" title="" /></p>
<p>This demo should work Firefox, Chrome, or Opera. <a href="http://videobooth.herokuapp.com/simple.html">Live example</a>!</p>
<p>Now you have access to the webcam through the browser! This example is fun, but pretty useless since all we can do is show someone themselves (mirror app?).</p>
<h3>Setup</h3>
<p><strong>Note</strong> &#8211; Before we get started, I need to be clear that the example we&#8217;re building only works in Firefox. I&#8217;ll go into this more later, but the tl;dr is that Firefox is the only one that&#8217;s implemented the <code>MediaRecorder</code> API at this point. If you want to make this work in Chrome as well, there are projects such as <a href="https://www.webrtc-experiment.com/RecordRTC/">RecordRTC</a> and <a href="https://github.com/streamproc/MediaStreamRecorder">MediaStreamRecorder</a>.</p>
<p>We need a dead simple server side component for this example, but it only needs to do two things:<br />
1. Return a valid AWS policy so we can upload directly from their browser.<br />
2. Submit an encoding job to Zencoder.</p>
<p>I like to use the <a href="http://expressjs.com/">Express framework</a> for <a href="http://nodejs.org/">Node</a> for examples like this, but if you&#8217;re more comfortable using something else, like Sinatra, feel free to ignore this example and use whatever you&#8217;d like. Since we&#8217;re more concerned about the client side code, I&#8217;m not going to dig into the server side implementation, but feel free to comment if you have questions.</p>
<pre class="brush: jscript; title: ;">
var S3_BUCKET = 'YOUR-S3-BUCKET-NAME';

&lt;p&gt;var express    = require('express');
var path       = require('path');
var logger     = require('morgan');
var bodyParser = require('body-parser');
var crypto     = require('crypto');
var moment     = require('moment');
var AWS        = require('aws-sdk');
var s3         = new AWS.S3({ params: { Bucket: S3_BUCKET }});
var zencoder   = require('zencoder')();

var app = express();

app.set('port', process.env.PORT || 3000);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(express.static(path.join(__dirname, 'public')));

app.post('/process', function(req, res) {
  // Build up the S3 URL based on the specified S3 Bucket and filename included
  // in the POST request body.
  var input = 'https://'+S3_BUCKET+'.s3.amazonaws.com/'+req.body.filename;
  createJob(input, req.body.email, function(err, data) {
    if (err) { return res.send(500, err); }

    res.send(200, data);

  });
});

app.post('/upload', function(req, res) {
  var cors = createS3Policy();
  res.send(201, { url: 'https://'+S3_BUCKET+'.s3.amazonaws.com/', cors: cors });
});

function createS3Policy() {
  var policy = {
    &quot;expiration&quot;: moment().utc().add('days', 1).toISOString(),
    &quot;conditions&quot;: [
      { &quot;bucket&quot;: S3_BUCKET },
      { &quot;acl&quot;:&quot;private&quot; },
      [ &quot;starts-with&quot;, &quot;$key&quot;, &quot;&quot; ],
      [ &quot;starts-with&quot;, &quot;$Content-Type&quot;, &quot;&quot; ],
      [ &quot;content-length-range&quot;, 0, 5368709120 ]
    ]
  };

  var base64Policy = new Buffer(JSON.stringify(policy)).toString('base64');
  var signature = crypto.createHmac('sha1', AWS.config.credentials.secretAccessKey).update(base64Policy).digest('base64');

  return {
    key: AWS.config.credentials.accessKeyId,
    policy: base64Policy,
    signature: signature
  };
}

function createJob(input, email, cb) {
  var watermark = {
    url: 'https://s3.amazonaws.com/zencoder-demo/blog-posts/videobooth.png',
    x: '-0',
    y: '-0',
    width: '30%'
  };

  zencoder.Job.create({
    input: input,
    notifications: [ email ],
    outputs: [
      { format: 'mp4', watermarks: [watermark] },
      { format: 'webm', watermarks: [watermark] }
    ]
  }, cb);
}

var server = app.listen(app.get('port'), function() {
  console.log('Express server listening on port ' + server.address().port);
});
</pre>
<p>Just a note, this example should mostly work out of the box, but you&#8217;ll need to have AWS configurations already [set up](http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html), as well as a</code>ZENCODER<em>API</em>KEY` environment variable. You&#8217;ll also need to have <a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html">CORS</a> configured on the bucket you use. Here&#8217;s an example CORS configuration that will work:</p>
<pre class="brush: xml; title: ;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;CORSConfiguration xmlns=&quot;http://s3.amazonaws.com/doc/2006-03-01/&quot;&gt;
    &lt;CORSRule&gt;
        &lt;AllowedOrigin&gt;*&lt;/AllowedOrigin&gt;
        &lt;AllowedMethod&gt;POST&lt;/AllowedMethod&gt;
        &lt;AllowedHeader&gt;*&lt;/AllowedHeader&gt;
    &lt;/CORSRule&gt;
&lt;/CORSConfiguration&gt;
</pre>
<h3>Recording user media</h3>
<p>In the simple example above, we requested a user&#8217;s media using the <code>getUserMedia</code> API, so now we need a way to record that content. Luckily, there&#8217;s a shiny new API called, appropriately, <code>MediaRecorder</code>. Firefox is the only browser that currently supports it (as of version 25), but there are projects like <a href="https://github.com/antimatter15/whammy">Whammy</a> that can act as a pseudo-shim for other browsers.</p>
<p>The API is simple, we just need to take the same stream we used for playback in the simple example, and use it to create a new instance of <code>MediaRecorder</code>. Once we have our new recorder, all we have to do is call <code>start()</code> to begin recording, and <code>stop()</code> to, you guessed it, stop.</p>
<pre class="brush: jscript; title: ;">
var recorder = new MediaRecorder(this.stream);
recorder.start(); // You're now recording!
// ...A few seconds later...
recorder.stop();
</pre>
<h3>Getting the recorded media</h3>
<p>Ok great, we started and stopped a webcam recording&#8230;how do we see it?</p>
<p>You can listen for the <code>ondataavailable</code> event on the instance of <code>MediaRecorder</code> we created to record. When it&#8217;s done, it will include a new <a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob"><code>Blob</code></a> that you can play back just like you did the original user media.</p>
<pre class="brush: jscript; title: ;">
// We'll keep using the same recorder
recorder.ondataavailable = function(e) {
  var videoBlob = new Blob([e.data], { type: e.data.type });
  var player = document.getElementById('playback-video-el');
  var blobUrl = URL.createObjectURL(videoBlob);
  player.src = blobUrl;
  player.play();
}
</pre>
<p>If you&#8217;ve been following along and building out these examples, right about now you&#8217;re probably trying to replay the video and getting frustrated. Sadly, nothing you do &#8220;right&#8221; is going to work here&#8230;<code>autoplay</code> on the video element nor calling <code>play()</code> or setting <code>currentTime</code>on the <code>ended</code> event is going to do what you want.</p>
<p>This seems to simply be a Firefox issue with playing back these blobs. The ugly, but functional workaround is to simply replace the source on the ended event if you want the video to loop.</p>
<pre class="brush: jscript; title: ;">
player.onended = function() {
  video.pause();
  video.src = blobUrl;
  video.play();
}
</pre>
<p>This blob you have is a (mostly) functional WebM video! If you create an anchor tag with this blob url as the source, you can right click and save the file locally. However, even locally this file doesn&#8217;t seem behave quite right (OS X seems to think it&#8217;s an HTML file). Besides, if you wanted, say, an h264 version&#8230;</p>
<p>This is where Zencoder fits nicely into the picture. Before we can process it, we need to get the file online so Zencoder can access it. We&#8217;ll use one of the API endpoints we created earlier, <code>/upload</code> to grab a signed policy, then use that to POST the file directly to S3 (I&#8217;m using jQuery in this example).</p>
<pre class="brush: jscript; title: ;">
function uploadVideo(video) {
  $.post('/upload', { key: &quot;myawesomerecording.webm&quot; }).done(function(data) {
    // The API endpoint we created returns a URL, plus a cors object with a key, policy, and signature.
    formUpload(data.url, data.cors.key, data.cors.policy, data.cors.signature, filename, recording);
  });

  function formUpload(url, accessKey, policy, signature, filename, video) {
    var fd = new FormData();&lt;/p&gt;

    fd.append('key', filename);
    fd.append('AWSAccessKeyId', accessKey);
    fd.append('acl', 'private');
    fd.append('policy', policy);
    fd.append('signature', signature);
    fd.append('Content-Type', &quot;video/webm&quot;);
    fd.append(&quot;file&quot;,  video);

    $.ajax({
      type: 'POST',
      url: url,
      data: fd,
      processData: false,
      contentType: false
    }).done(function(data) {
      cb(null);
    }).fail(function(jqxhr, status, err) {
      cb(err);
    });
  }
}

uploadVideo(videoBlob);
</pre>
<p>Now you&#8217;ve got a video on an S3 bucket, so all we have to do is actually process it. If you noticed, we added an email to the <code>/process</code> endpoint earlier so we can get the job notification (including download links for the video) sent directly to us when it&#8217;s done.</p>
<pre class="brush: jscript; title: ;">
function process(email, filename) {
  $.post('/process', {
    filename: filename,
    email: email
  }).done(function(data) {
    console.log('All done! you should get an email soon.');
  }).fail(function(jqXHR, error, data) {
    console.log('Awww...sad...something went wrong');
  });
};

process('mmcclure@brightcove.com', &quot;myawesomerecording.webm&quot;);
</pre>
<p>A few seconds later you should get an email congratulating you for your brand new, browser-recorded videos. The links included are temporary, so make sure you download them within 24 hours or change the API endpoint we created to upload the outputs to a bucket you own.</p>
<p>I created a demo to showcase this functionality, including some minor styling and a not-so-fancy interface. I&#8217;ve called it <a href="https://github.com/zencoder/VideoBooth">VideoBooth</a>, but feel free to clone the project and run with it! You can also play with the <a href="http://videobooth.herokuapp.com">working demo</a> on Heroku.</p>
<p><img src="https://i.cloudup.com/MifqP9K3qp.png" alt="videobooth screenshot" title="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2014/07/28/html5-video-and-the-end-of-plugins-recording-uploading-and-transcoding-video-straight-from-the-browser/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Bulletproof Live Streaming</title>
		<link>http://blog.zencoder.com/2014/06/09/bullet-proof-live-streaming/</link>
		<comments>http://blog.zencoder.com/2014/06/09/bullet-proof-live-streaming/#comments</comments>
		<pubDate>Mon, 09 Jun 2014 23:29:35 +0000</pubDate>
		<dc:creator><![CDATA[matt]]></dc:creator>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[Guides]]></category>

		<guid isPermaLink="false">https://blog.zencoder.com/?p=2037</guid>
		<description><![CDATA[From a reliability perspective, one of the great things about VOD transcoding is the ability to simply try again. If anything goes wrong during the transcoding process, we can simply re-run the process from the beginning. The worst effect of a hiccup is a job takes a little longer, which is unfortunate, but the end [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>From a reliability perspective, one of the great things about VOD transcoding is the ability to simply try again. If anything goes wrong during the transcoding process, we can simply re-run the process from the beginning. The worst effect of a hiccup is a job takes a little longer, which is unfortunate, but the end result is a transcoded file is delivered to the customer and all is well.</p>
<p>During a live event, however, we don&#8217;t have the luxury of simply trying again. Since these events are transcoded in real time, we only have one chance to deliver a perfect transcode to end-users; a blip anywhere along the way can mean an interruption. No matter how reliable the system is, you never know when something like a power supply or network card is going to fail, so redundancy is crucial for high profile events.</p>
<p>To account for this, we recently announced redundant transcoding for live streams. In a nutshell, if <a href="https://app.zencoder.com/docs/api/encoding/live-streaming/redundant-transcode"><code>redundant_transcode</code></a> is enabled, and at least one <a href="https://app.zencoder.com/docs/api/encoding/general-output-settings/secondary-url"><code>secondary_url</code></a> is specified, Zencoder will transparently create a new job using any secondary URLs specified in the outputs of the original request. This job has all the same settings of the original, with the important distinction of being run in the nearest transcoding region of an entirely different cloud provider.</p>
<p><span id="more-2037"></span></p>
<p>Let&#8217;s look at an example:</p>
<pre class="brush: jscript; title: ;">
{
  &quot;redundant_transcode&quot;: true,
  &quot;live_stream&quot;: true,
  &quot;region&quot;: &quot;us-virginia&quot;,
  &quot;output&quot;: [
    {
      &quot;label&quot;: &quot;super-important-stream&quot;,
      &quot;url&quot;: &quot;rtmp://primary.example.com/live/stream&quot;,
      &quot;secondary_url&quot;: &quot;rtmp://backup.example.com/live/stream&quot;,
      &quot;live_stream&quot;: true
    },
    {
      &quot;label&quot;: &quot;not-as-important-stream&quot;,
      &quot;url&quot;: &quot;rtmp://primary.example.com/live/stream&quot;,
      &quot;live_stream&quot;: true
    }
  ]
}
</pre>
<p>This will return one stream name, but 2 stream URLs, one primary and one redundant.</p>
<pre class="brush: jscript; title: ;">
{
  &quot;stream_name&quot;: &quot;as230d982389askdfsdkjf2380ejd93d93dj&quot;,
  &quot;outputs&quot;: [
    {
      &quot;label&quot;: &quot;super-important-stream&quot;,
      &quot;url&quot;: &quot;rtmp://primary.example.com/live/stream&quot;,
      &quot;id&quot;: 260281679
    },
    {
      &quot;label&quot;: &quot;not-as-important-stream&quot;,
      &quot;url&quot;: &quot;rtmp://primary.example.com/live/stream&quot;,
      &quot;id&quot;: 260281680
    }
  ],
  &quot;stream_url&quot;: &quot;rtmp://live01.us-va.zencoder.io:1935/live&quot;,
  &quot;redundant_job_id&quot;: 12345678,
  &quot;redundant_stream_url&quot;: &quot;rtmp://backup-endpoint.zencoder.io:1935/live&quot;,
  &quot;id&quot;: 98091238
}
</pre>
<p>You can then set up your encoder to stream to both simultaneously. The example below is using <a href="http://www.adobe.com/products/flash-media-encoder.html">Flash Media Live Encoder</a>, but most encoders support a primary and backup stream url with little additional setup.</p>
<p><img src="https://i.cloudup.com/gGbC15K5w8.png" alt="Flash Media Live Encoder screenshot" /></p>
<p>With this setup, if Amazon East were to go down (which is unlikely, but <a href="http://blog.zencoder.com/2011/04/22/skynet-ec2-and-zencoder/">not impossible</a>), the backup stream would continue happily on Google Compute Engine without any problems. Assuming you&#8217;re using a CDN with proper backup urls, such as Akamai, the playback URLs would continue to work as if nothing happened.</p>
<p>For simplicity sake, we only discussed adding a backup URL to a single encoder. This would mitigate any issues downstream of the encoder (like Amazon East getting hit by a meteor), but the stream is still at risk if the encoder is unable to publish for any reason. The backup URL, however, could be set up on a separate encoder, which could be on an entirely different network to be as safe as possible.</p>
<h3>Notes</h3>
<ul>
<li>Since a stream needs to be pushed to both the primary and backup endpoint, this will double the bandwidth necessary to publish a stream.</li>
<li>The backup job is billed as a separate job at standard live rates.</li>
<li>Akamai will attempt to align the primary and backup streams before playback, so there may be a short interruption during the transition between streams.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2014/06/09/bullet-proof-live-streaming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What happened last night</title>
		<link>http://blog.zencoder.com/2014/04/17/what-happened-last-night/</link>
		<comments>http://blog.zencoder.com/2014/04/17/what-happened-last-night/#comments</comments>
		<pubDate>Thu, 17 Apr 2014 02:38:43 +0000</pubDate>
		<dc:creator><![CDATA[jon]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://blog.zencoder.com/?p=2015</guid>
		<description><![CDATA[Last night, at 6:08pm EDT, the Zencoder service went offline due to a database failure. We began working on the problem immediately, but unfortunately our primary approach to solving the problem was unsuccessful, and the secondary approach took an extended period to implement. In total, the service was unavailable for six hours and 18 minutes. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Last night, at 6:08pm EDT, the Zencoder service went offline due to a database failure. We began working on the problem immediately, but unfortunately our primary approach to solving the problem was unsuccessful, and the secondary approach took an extended period to implement. In total, the service was unavailable for six hours and 18 minutes.</p>
<p>Here is a detailed description of what happened, why, and why it will never happen again.</p>
<p><span id="more-2015"></span></p>
<h3>What happened</h3>
<p>The Zencoder stack relies on a PostgreSQL database, among other things. We believe PostgreSQL to be an excellent database &#8211; fast, reliable, scalable, and well-designed. Many services rely upon PostgreSQL, and we have run it successfully since Zencoder’s inception.</p>
<p>For reasons we are still investigating, an internal PostgreSQL database process (<a href="http://www.postgresql.org/docs/9.1/static/routine-vacuuming.html#AUTOVACUUM">autovacuum</a>) stalled while running on a single table in our database. This ultimately caused the database to stop accepting new transactions, effectively putting it in “read-only” mode. At this time, we believe the underlying problem may have been a bug in the version of PostgreSQL we were using, but we are still verifying this.</p>
<p>Within minutes, engineers were alerted to the problem and started an operation that should have unfrozen the database. This process takes time, especially on a large database, but we expected that it would finish in relatively short order. Unfortunately, this process stalled, possibly due to the same issue that caused the problem in the first place.</p>
<p>In parallel with this, we considered failing over to a standby server. We have redundant database servers (along with redundancy across the rest of our stack), and if this were a hardware failure, we could have failed to our secondary server within minutes. Unfortunately, the issue was replicated onto the secondary database as well, and so this was not an option.</p>
<p>Eventually, we determined that the operation itself was not working. We decided to take a more drastic step, and stood up a new stack. Jobs started processing again by 12:26am EDT.</p>
<h3>What we will do</h3>
<p>As a response to this incident, we have already begun multiple layers of improvements. </p>
<p>First, we have upgraded to a newer version of PostgreSQL that is not susceptible to the particular bug we identified. </p>
<p>Second, we are working on our database configuration and monitoring to ensure that the conditions that led to the problem will not happen again. </p>
<p>Beyond that, we are working on indirect improvements, including faster recovery in the face of a catastrophe and additional layers of redundancy, that will minimize the impact of future problems. </p>
<p>(Our full response to the incident is still being determined, since we are still verifying the root cause for the operation’s failure, but we are happy to share more information with customers who are interested as we make progress in the coming days.)</p>
<p>We sincerely apologize for the problem and for the impact that it caused to our customers. We pride ourselves on operating reliably at very high scale, and we will work hard to make sure this never happens again.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2014/04/17/what-happened-last-night/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OpenSSL &#8220;Heartbleed&#8221; Security Update</title>
		<link>http://blog.zencoder.com/2014/04/09/openssl-heartbleed-security-update/</link>
		<comments>http://blog.zencoder.com/2014/04/09/openssl-heartbleed-security-update/#comments</comments>
		<pubDate>Wed, 09 Apr 2014 17:50:37 +0000</pubDate>
		<dc:creator><![CDATA[Tanya]]></dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">https://blog.zencoder.com/?p=2003</guid>
		<description><![CDATA[The engineering team at Zencoder conducted a review to assess the impact to our system of the CVE-2014-0106 vulnerability, nicknamed “Heartbleed”. This serious vulnerability would allow an attacker to reveal up to 64kB of memory to a connected client or server. Even though many servers running on the internet were exposed, Zencoder public facing servers [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>The engineering team at Zencoder conducted a review to assess the impact to our system of the CVE-2014-0106 vulnerability, nicknamed “Heartbleed”. This serious vulnerability would allow an attacker to reveal up to 64kB of memory to a connected client or server.  Even though many servers running on the internet were exposed, <strong>Zencoder public facing servers were not effected</strong>.  </p>
<p>Some of our internal servers, which are not accessible by customers, were vulnerable. We fixed this vulnerability as of 8:00PM PST on Monday, Apr 7th.  </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2014/04/09/openssl-heartbleed-security-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zencoder Launches Support for Advanced Encoding Formats, Brings Broadcast and Professional Workflows to the Cloud</title>
		<link>http://blog.zencoder.com/2014/04/03/advanced-formats-launch/</link>
		<comments>http://blog.zencoder.com/2014/04/03/advanced-formats-launch/#comments</comments>
		<pubDate>Thu, 03 Apr 2014 06:00:13 +0000</pubDate>
		<dc:creator><![CDATA[Tanya]]></dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://blog.zencoder.com/?p=1981</guid>
		<description><![CDATA[Today, we are excited to unveil our support for advanced encoding formats. Zencoder will now support HEVC, MPEG-TS, JPEG 2000 and AVC-Intra, bringing the power of cloud encoding to broadcast and professional workflows. Additionally, Zencoder will also support MXF container for conformity with DPP guidelines for European broadcasters. With today’s announcement, Zencoder is applying the [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Today, we are excited to unveil our support for advanced encoding formats. Zencoder will now support HEVC, MPEG-TS, JPEG 2000 and AVC-Intra, bringing the power of cloud encoding to broadcast and professional workflows. Additionally, Zencoder will also support MXF container for conformity with DPP guidelines for European broadcasters. </p>
<p>With <a href="http://www.brightcove.com/en/company/press/brightcove-launches-support-advanced-encoding-formats-bring-broadcast-and-professional-workflows-clo">today’s announcement</a>, Zencoder is applying the elastic scalability of the cloud to solve encoding challenges for a new segment of the production workflow. Just as Zencoder empowered publishers to rapidly transcode video to support the fragmented Web and mobile ecosystem, the service is now enabling broadcasters and professional content providers to scale their media processing operations in the cloud. </p>
<p>Zencoder’s support for advanced encoding formats is critically important as the OTT and streaming landscape continues to expand. The market is disparate and demands that content providers:</p>
<ul>
<li>Create a video rendition for every streaming outlet</li>
<li>Create files for endpoints for international subsidiaries and distribution partners</li>
<li>Provide encoded libraries of content to support licensing deals</li>
</ul>
<p>All of these initiatives can be costly when relying on on-premise encoders. Cloud encoding for these workflows alleviates cost concerns and helps publishers to better plan for capacity.</p>
<p>For our customers in the broadcast realm and within other professional workflows, support for H.265 (HEVC) and MPEG-DASH is particularly important. Because H.265 promises to deliver high-quality video at lower-bitrates &#8211; ideal for 4K/Ultra HD &#8211; broadcasters are hyper-focused on related support for this standard. Additionally, MPEG-DASH will serve as an international standard that will potentially unify cross-platform workflows. We are very excited to provide premium publishers with seamless encoding solutions that will simplify incredibly complex workflows.</p>
<p>Advanced Encoding Formats are now in beta. <a href="https://zencoder.com/en/sales">Contact us</a> to learn more about participating in this beta program.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2014/04/03/advanced-formats-launch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamically generating video content using HLS</title>
		<link>http://blog.zencoder.com/2014/02/21/manifest-hacking-for-fun-and-profit/</link>
		<comments>http://blog.zencoder.com/2014/02/21/manifest-hacking-for-fun-and-profit/#comments</comments>
		<pubDate>Fri, 21 Feb 2014 22:15:23 +0000</pubDate>
		<dc:creator><![CDATA[matt]]></dc:creator>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Screencast]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1938</guid>
		<description><![CDATA[If you missed it, Casey Wilms did a three part series on the blog called Manifest Destiny. I liked it so much I started playing around with hacking together manifests programmatically and decided to do a screencast on the basics. The sceencast reiterates some of what Casey talks about, so the basics of an HLS [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>If you missed it, Casey Wilms did a three part series on the blog called <a href="/2013/04/02/manifest-destiny-the-dynamic-generation-of-playlists/" parent="_blank">Manifest Destiny</a>. I liked it so much I started playing around with hacking together manifests programmatically and decided to do a screencast on the basics. The sceencast reiterates some of what Casey talks about, so the basics of an HLS manifest, and how to go about manually editing one. We finish by writing a short script using Node.js to take in multiple manifests and concatenate them altogether before writing a new m3u8 we can watch.</p>
<p><video id="manifest-screencast" class="video-js vjs-default-skin" controls preload="auto" data-setup='{}' width="670" height="377"><source src="//s3.amazonaws.com/zencoder-blog/manifest-screencast.mp4" type='video/mp4'></source><source src="//s3.amazonaws.com/zencoder-blog/manifest-screencast.webm" type='video/webm'></source></video></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2014/02/21/manifest-hacking-for-fun-and-profit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A New Year for the SF Video Technology Meetup</title>
		<link>http://blog.zencoder.com/2014/02/07/a-new-year-for-the-sf-video-technology-meetup/</link>
		<comments>http://blog.zencoder.com/2014/02/07/a-new-year-for-the-sf-video-technology-meetup/#comments</comments>
		<pubDate>Fri, 07 Feb 2014 22:44:27 +0000</pubDate>
		<dc:creator><![CDATA[matt]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.zencoder.com/?p=1940</guid>
		<description><![CDATA[You might not believe it, but working at a company like Brightcove means you think about video quite a bit. For a service like Zencoder, for instance, we constantly need to keep in mind what formats our customers need now and down the road, along with the devices they will want to support. The world [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>You might not believe it, but working at a company like Brightcove means you think about video quite a bit. For a service like Zencoder, for instance, we constantly need to keep in mind what formats our customers need now and down the road, along with the devices they will want to support. The world of video is <em>big</em> and a lot of the work we do affects others in our space (and vice versa), making it important for those of us working in this space to communicate. Because of this, we&#8217;re supporting the <a href="http://sfvideo.org">SF Video Technology Meetup</a>, and we&#8217;d love for you to join us.</p>
<p>Last Tuesday was the 5th meeting, and Robert Scott, the platform engineering manager at <a href="http://inkling.com">Inkling</a>, spoke to us about Inkling&#8217;s platform and how they handle video. He walked us through the Inkling service itself from both an editor&#8217;s and a user&#8217;s perspective, then went into the process they went through before deciding on a transcoding service. The group is usually pretty vocal, so Inkling&#8217;s use of signed Cloud Front URLs with HTTP Live Streaming led to a great discussion on the practice.</p>
<p><img src="http://photos3.meetupstatic.com/photos/event/1/d/8/highres_328560472.jpeg" alt="January 2014 Meetup: Robert Scott presentation" /></p>
<p>Excellent presentations from last year included J Sherwani and Faraz Khan from <a href="http://screenhero.com">Screenhero</a>, who talked about H.264 vs VP8 for low-latency video streaming, and Jon Gubman from <a href="http://funnyordie.com">Funny or Die</a>, who followed up with a presentation on Funny or Die&#8217;s switch to HTML5 video from Flash and the gotchas they uncovered along the way. Robert Scott started the new year on an excellent note, so we&#8217;d like to continue the trend in the upcoming months, but the group needs your help.</p>
<p><img src="http://photos4.meetupstatic.com/photos/event/5/e/8/highres_322321512.jpeg" alt="Jon Gubman, Funny or Die" /></p>
<p>This month&#8217;s <a href="http://www.meetup.com/SF-Video-Technology/events/163283582/">meetup (February 25th)</a> is going to focus on HTTP streaming. The talks will be a bit more of a lightning talk format, with Anton Kast (Video Architect at Yahoo) giving an overview of Dash, and myself (Matt McClure) talking about dynamically generating HLS manifests. One more talk maybe added before the meetup, so keep an eye out.</p>
<p>Interested in talking? Please <a href="mailto:mmcclure@brightcove.com?subject=I%20want%20to%20talk%20at%20the%20meetup!">get in touch</a>! Anyone is welcome to the floor, it doesn&#8217;t have to be long (anywhere from 5 to 10 minutes), and can consist of anything from technical demos to presentations (or both). The general rule of thumb is that it should be interesting to engineers that work with video, but other than that we&#8217;re open to any proposals.</p>
<p>If you&#8217;re interested in coming, please join the <a href="http://sfvideo.org">Meetup</a> so we can get in touch about updates (and make sure to buy enough food and drink). Hope to see you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zencoder.com/2014/02/07/a-new-year-for-the-sf-video-technology-meetup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.247 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2016-07-10 14:05:28 -->
