title: How to convert mkv movies to mp4 for streaming to XBox 360
body: <p>I recently purchased a Synology Diskstation DS412+, and I have a number of .mkv movies which I would like to convert/transcode to mp4 files, so that I can stream them directly to my XBox 360.  I use Handbrake on my laptop, but I would rather have this happen directly on my NAS.</p>
  
  <p>I'm very rusty on Linux and new to transcoding, but the script I currently have is the following:</p>
  
  <pre><code>#!/bin/bash
  for dir in *; do
    if test -d "$dir"; then
      #echo $dir
      for file in "$dir"/*.mkv; do
        noextension=${file%.*}.mp4
        ffmpeg -y -i "$file" -vcodec copy -acodec copy "$noextension"
      done
    fi
  done
  </code></pre>
  
  <p>Which, as I understand it, simply copies the audio and video components within the mkv container, and inserts them into a new mp4 container.  This has worked for several of my files, but there are a number for which this does not work.</p>
  
  <p>The following is an example of the output for a failed run:</p>
  
  <pre><code>ffmpeg version UNKNOWN, Copyright (c) 2000-2011 the FFmpeg developers
    built on Sep 16 2013 00:45:02 with gcc 4.2.1
    configuration: --prefix=/usr/syno --arch=i686 --target-os=linux --cross-prefix=/usr/local/i686-linux-gnu/bin/i686-linux-gnu- --enable-cross-compile --enable-optimizations --disable-yasm --disable-altivec --enable-pic --enable-shared --disable-static --disable-swscale-alpha --disable-ffserver --disable-ffplay --enable-libmp3lame --enable-libfaac --enable-nonfree --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-indev=alsa --disable-outdev=alsa --disable-encoder=dca --disable-encoder=ac3 --disable-encoder=ac3_fixed --disable-encoder=ac3_float --disable-encoder=eac3 --disable-decoder=dca --disable-decoder=eac3 --disable-decoder=truehd --cc=/usr/local/i686-linux-gnu/bin/i686-linux-gnu-ccache-gcc
    libavutil    50. 40. 1 / 50. 40. 1
    libavcodec   52.120. 0 / 52.120. 0
    libavformat  52.108. 0 / 52.108. 0
    libavdevice  52.  4. 0 / 52.  4. 0
    libavfilter   1. 77. 0 /  1. 77. 0
    libswscale    0. 14. 0 /  0. 14. 0
  [matroska,webm @ 0x80726c0] Estimating duration from bitrate, this may be inaccurate
  
  Seems stream 1 codec frame rate differs from container frame rate: 47.95 (5994/125) -&gt; 23.98 (24000/1001)
  </code></pre>
  
  <p>...and then a list of input chapter start and end times and then...</p>
  
  <pre><code> Stream #0.0(eng): Audio: aac, 48000 Hz, stereo, s16 (default)
   Stream #0.1(eng): Video: h264 (High), yuv420p, 1280x692 [PAR 1:1 DAR 320:173], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
  </code></pre>
  
  <p>...and then a list of output chapter start and end times and then...</p>
  
  <pre><code>Stream #0.0(eng): Video: ![0][0][0] / 0x0021, yuv420p, 1280x692 [PAR 1:1 DAR 320:173], q=2-31, 2997 tbn, 23.98 tbc (default)
  Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo (default)
  Stream mapping:
    Stream #0.1 -&gt; #0.0
    Stream #0.0 -&gt; #0.1
  Press [q] to stop encoding
  [mp4 @ 0x808a020] pts &lt; dts in stream 0
  av_interleaved_write_frame(): Invalid data found when processing input
  </code></pre>
  
  <p>The XBox support website gives details on supported file types, with mp4 included in the H.264 standard: <a href="http://support.xbox.com/ar-SA/xbox-360/system/audio-video-playback" rel="nofollow">http://support.xbox.com/ar-SA/xbox-360/system/audio-video-playback</a></p>
  
  <p>I'm at a bit of a loss.  I've read through <a href="http://www.ffmpeg.org/ffmpeg.html" rel="nofollow">http://www.ffmpeg.org/ffmpeg.html</a> but the error message from ffmpeg doesn't seem very helpful, and resources are sparse at best when it comes to running this stuff on a Synology Box.</p>
  
  <p>I have tried a few permutations of my script, such as:</p>
  
  <pre><code>ffmpeg -i "$file" "$noextension"
  </code></pre>
  
  <p>and</p>
  
  <pre><code>ffmpeg -y -i "$file" -vcodec mpeg4 -acodec libfaac "$noextension"
  </code></pre>
  
  <p>But those both give me the following error:</p>
  
  <pre><code>Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height
  </code></pre>
  
  <p>I assume that I'll need to specify input and output codecs specifically, along with things like bitrate, or aspect ratio but this is where I come unstuck.</p>
  
  <p>Any help would be much appreciated!</p>