Showing posts with label stream. Show all posts
Showing posts with label stream. Show all posts

Thursday, May 19, 2016

Compress Your Home Videos Without Noticeable Quality Loss

While working on a project to allow video uploads from family members to my home server, I realized that my home videos were obnoxiously large. I took a three-minute video of my son acting crazy and it weighted in at 250MB. 15 years ago, I remember watching reasonable-looking, 2-hour long, movies that only took up 700MB. BluRay full-resolution (1080p) backups often look pretty good encoded to sizes between 1 and 2 gigabytes -- something is very wrong here!

I decided to perform a little research and conduct some tests to try and get my file sizes under control. I'd used Handbrake and ffmpeg in the past successfully, so decided to stick with those for this experiment.

The Short Version

Using the High Profile setting on Handbrake, setting Constant Quality (this is NOT the same as Constant Bit-Rate [CBR] and is actually a type of Variable Bit-Rate) to 22 and other default settings, I was able to encode a sample set of videos from multiple different recording devices ranging from low-light, flash-lit smartphone videos to sunlit family moments at a zoo taken on consumer recording devices to a much smaller file size! After deciding on h.264/AVC and trying a few constant quality settings, I settled on cq22 which reduced the size of the collection of files from 496MB to 132MB with no resolution change (resizing) and minimal visual quality loss (obviously, this is subjective). Success!

The Long Version

I can't help myself -- I have to research things to make sure I'm doing them the best possible way...especially if lossy encoding/compression is in the picture. As fast as technology changes, this must be done every few years and the best practice often heavily depends on the intended use.

Before you start...

Storage is cheap. If you have the room, you may want to just keep the original files (to negate the risk of losing data). If you have streaming needs such as myself, a second version for streaming may be a good idea to save your server and users some bandwidth at minimal quality cost. Also, for full disclosure, employing lossy compression (such as the method described here) does cost you "data." The thing to consider is whether the data lost is consequential, can be perceived, and could be valuable in the future. Additionally, is potential storage space gained is worth your time.

This can take a while! Especially if you want to perform some tests yourself to ensure my recommendations work for your video or that your eyes aren't more or less discerning than mine. Hopefully, you can figure out how to batch this process and put your computer to work at night or during long periods of, otherwise, non use. Using the Normal Handbrake profile will probably speed up the process notably, though I'm not sure what the resulting file size or quality trade-off will be.

My findings

I've compared the various containers and codecs in the past and, though I like free and open (vp8/ogg in a Matroska container) codecs and containers, I decided to go with tried and true for this test as I was interested in streaming home videos. My understanding is that using h.264/AVC and aac codecs in a mp4 (m4v) container is the most trouble-free way to prepare files for streaming using modern methods (html5) without the need for flash or multiple file encodes.

At first, I thought 2-pass encoding was supposed to be the best option based on some research I'd done in the past. That turned out to be a misunderstanding on my part. 2-pass is helpful when a specified file size is targeted (when your encoded movie has to fit on a CD/DVD, etc.), but not especially useful otherwise. For this project, Constant Quality (CQ - a type of Variable Bit-Rate[VBR]) encoding was employed as I was only interested in maintaining original subjective quality at reduced file sizes. Handbrake's High Profile and a Constant Quality of 22 produced great results for my batch of videos.

While I can discern (very) minor differences in some of the screen shot comparisons, they aren't noticeable in the video for me (mostly slight artifacting and pixelation, color variation, edge smoothing, etc.). If I planned on trying to use stills for pictures or something, I may use higher quality or, again, start with uncompressed video. Using 720 or 1080 stills as anything higher than a 3"x5" printed photo would likely look bad anyway.

How does it work?

Well, here is some speculation on my part...but since all my source files contained various types of AVC encoding performed by lower powered devices*, albeit with dedicated encoding hardware, they just don't have the power to encode optimally "on the fly." Either that or they use more of a CBR type of encoding...either way, there is room for improvement, even if it means re-encoding an already lossy encoded file to reduce storage space. The only alternative would be to try and configure any recording device to record uncompressed video and then encode it properly later, on a computer. This would avoid double lossy compression, but uncompressed video is remarkably large and would require tons of available space and very fast storage media. Likely, many consumer grade recording devices won't offer those options even if they were viable.

I can't stop myself...

...from encouraging people to back up their data. Presumably, you already back up your data. If not, you should start. $50/year will let you back up all your files with Carbonite...and it is really easy to use. There are likely other paid solutions that are easy to use and cost a similar amount per year.

I use a mix of various cloud storage solutions, network storage, and a usb-hdd. Google backs up all pictures I take (at lower resolution) and all videos (up to 1080) from all my devices and even makes fun little animations out of them that I enjoy. They also back up my music, I think. Most of my documents, code projects, etc, end up on my web server or cloud storage. I've written on backups before, so won't rehash...just make sure your data exists in no less than two locations to reduce the chance of data loss.

Recording Devices

  • Canon(?) DV Camcorder (Sent to computer using DV Capture)
  • Kodak Zi-8
  • Motorola Droid (OG)
  • Motorola Droid 3
  • Motorola Droid X2
  • Moto G (1st Gen)
  • Moto G (4G LTE)
  • Moto G (2nd Gen)
  • Nikon D3100

Screenshots for Comparison

I pulled screenshots with ffmpeg and the frames are off by 1 in half the comparisons...I know that makes it unfair. Sorry. I assure you this was accidental and not maliciously as to mislead.


This is the original still. Hover/tap to show encoded still. (sorry, mobile users, this doesn't toggle for you on second tap)


This is the original still. Hover/tap to show encoded still. (sorry, mobile users, this doesn't toggle for you on second tap)


This is the original still. Hover/tap to show encoded still. (sorry, mobile users, this doesn't toggle for you on second tap)


This is the original still. Hover/tap to show encoded still. (sorry, mobile users, this doesn't toggle for you on second tap)


This is the original still. Hover/tap to show encoded still. (sorry, mobile users, this doesn't toggle for you on second tap)


This is the original still. Hover/tap to show encoded still. (sorry, mobile users, this doesn't toggle for you on second tap)


This is the original still. Hover/tap to show encoded still. (sorry, mobile users, this doesn't toggle for you on second tap)

My take is that there are (mostly, minor color) changes such as shirt color, bright spots, etc., but they are more akin to contrast adjustments, white balance settings, or saturation levels and have no meaningful impact on the viewing experience (especially video) as far as I'm concerned.

Land the Plane!

My wife'd not be happy if I posted the source videos here, but with the stills for comparison, and the very little variance there, you can imagine that the videos look even less changed after the encoding. I'll be re-visiting all my old home videos one folder at a time (starting each batch before bed), and spot checking them the next day for quality control. Hopefully this post will help if you are interested in compressing those home videos to more reasonable sizes!

Sunday, December 22, 2013

Site Streamer // Sometimes, you just want to stream!

Site Streamer

Sometimes...you just want to stream

The other day, I wanted to listen to the songs available for download from a band's site but downloading them, then adding to my media player seemed like to much work. Strange, because I usually prefer to download -- eventually the tracks end up on my phone and I listen to them in my car. Today, I wanted to listen to them now and the process of downloading each, naming appropriately, then listening to all seemed daunting.

I should develop a website to do this for me!

Instead of spending a few minutes to work this out myself, I decided the more time-effective solution was to spend hours developing a website to do it for me. Of course!

Luckily, I already had the building blocks: 1) [bandcamp downloader] a site that parsed bandcamp pages and made the songs available for download, naming them appropriately and 2) [jPlaylister] a site that creates jPlayer playlists from a local folder's contents.

It wasn't that bad, but spending the time to polish up the site enough for public use added another month of wait due to my busy schedule and recently rekindled gaming habit (a night or two a week for a couple of hours -- nothing serious).

Hello, World!

Meet Site Streamer. A site you can use to stream content from a place which normally just allows standard linked downloads.

You visit the site, paste in a website which has plainly linked downloadable (mp3, currently) audio content, and enjoy the stream. Hope this is convenient for someone!