How to fully automate video conversion to mp4, iTunes friendly format?

I am looking to implement a fully automated solution that will pick video files from an incoming directory, process them and put the result to iTunes special "Automatically Add to iTunes" directory.

Before starting to propose different products do read the requirements:

  • Command line interface, so we can use it with a cron
  • Do Pass Thru for video and audio streams if the source is already compatible with target format
  • Download subtitles from an external service (optional)
  • Embedding existing SRT files into the output video
  • Fixing metadata from an external service (optional)

Initially I would say that Handbrake should be able to do this, but I discovered that handbrake will never do Pass Thru for video (that's a statement that I got from the author).


Solution 1:

z264

z264 will look at every file, but will only touch avi, flv, mpg, mpeg, wmv, vob, mkv and mp4 video files, copying video and audio streams and rewrapping if possible, transcoding just the audio if necessary, and transcoding only what video is necessary, and leave you with iTunes friendly, atom optimized mp4 files, leaving the originals in your Trash. It makes reasonably intelligent decisions for you about how to transcode files based on how you set its HandBrake variables (set at lines 312-333).

check file for AVC encoding and flv, wmv, or mkv wrapper and rewrap in mp4 container otherwise, if not already am mp4, transcode to AVC mp4

z264 has several dependencies (mediainfo, rmtrash, ffmpeg, SublerCLI, and HandBrakeCLI)

  • copy and paste binary install section into a new bash script and use it to download and install the dependencies into /usr/local/bin/ (create /usr/local and /usr/local/bin/ if not there already)

  • create 2GB ramdisk called 'Two' using command in ramdisk section

    diskutil quiet erasevolume HFS+ 'Two' `hdiutil attach -nomount ram://4194304`
    
  • double-check command definitions (locations of dependencies), and correct locations (to "/usr/local/bin/")

    change line 231 to read:  mediainfo="/usr/local/bin/mediainfo"
    change line 236 to read:  rmtrash="/usr/local/bin/rmtrash"
    change line 238 to read:  ffmpeg="/usr/local/bin/ffmpeg"
    change line 239 to read:  SublerCLI="/usr/local/bin/SublerCLI"
    change line 262 to read:  mediainfo="/usr/local/bin/mediainfo"
    change line 263 to read:  rmtrash="/usr/local/bin/rmtrash"
    change line 265 to read:  HandBrakeCLI="/usr/local/bin/HandBrakeCLI"
    
  • save as z264 in /usr/local/bin/

  • make executable

    sudo chmod +x /usr/local/bin/z264

  • use Terminal to call z264 on single file, directory of files, or call it from a cron to crawl entire file systems periodically

    z264 directory.full.of.mixed.video.filetypes/*
    

minor issues: user needs to be able to read, debug, and use bash. z264 does not yet count how many background_transcoder processes it spawns, meaning if there are a lot of transcodes, it will take awhile for them to complete, but they will complete. You also need a lot of memory (8GB is ok). Snow Leopard users will need to install purge command from xcode developer tools.

Solution 2:

Currently I use Subler to convert MKVs to MP4s and embed subtitles in the process, without transcoding either video or audio. If I need to transcode DTS so that Apple TV will play it, I use MP4Tools. However, both of these are GUIs, and I have no idea if they can be called from the command-line. I suppose your best bet would be MKVToolNix (assuming you just want to change the format) and ffmpeg (which includes transcoding options for when they're needed).

Solution 3:

I'm using HandBrake as suggested in the Question above if the download isn't in MP4 format available. (I think I cannot name the service I'm using as downloading isn't legal in every country, but searching for Keyword "YIFY" might help to find MP4 rips) Next to that I'm using Subler to add an SRT without having to convert the MP4 all over again.

And afterwards to get the meta-data and the copy to iTunes I'm using iFlicks which can be downloaded from the App Store.