How do I convert WTV (and DVR-MS) files into a smaller standard format?

Please note: When this answer was written (July 2012), ffmpeg couldn't convert WTV files without loss of audio. However testing on ffmpeg 4.0.0 has shown that it now works fine and, as a result, there is no need to use wtvconverter.exe to pre-convert the WTV file to DVR-MS. As such:

ffmpeg -i "input.wtv" -y -filter:v yadif -vcodec libx264 -crf 23 "output.mp4"

should convert your television recording.

Original answer below

After some research it turns out that:

  1. Handbrake isn't the best tool for this, you should use ffmpeg instead.
  2. When using ffmpeg, you need to use the DVR-MS format (and not the WTV format) as the source file, otherwise you'll end up with no sound.

You need to perform a couple of steps, firstly converting from WTV to DVR-MS:

%WINDIR%\ehome\wtvconverter.exe "Recorded TV Show.wtv" "Recorded TV Show.dvr-ms"

Then converting that DVR-MS file to H.264/MPEG-4 AVC. You can change -crf 23 – higher numbers mean lower quality, sane values are from 19 to 25:

ffmpeg -i "Recorded TV Show.dvr-ms" -y -filter:v yadif -vcodec libx264 -crf 23 "Recorded TV Show.mp4"

Then deleting the temporary DVR-MS file:

del /F "Recorded TV Show.dvr-ms"

Once converted, VLC will give the following details about "Recorded TV Show.mp4":

enter image description here

The file I converted is now 530MB (down from 1.59GB) for 1 hour and 50 minutes of SD content. This means it is approximately 1/3rd of the size of the original WTV file.


I was able to get ffmpeg to do the trick, but took some time to find switches that worked. Not sure these are optimum, and the conversion takes a lot longer, BUT it is clean, plays everywhere I have tried, and the audio is correct and in sync.

ffmpeg -y -threads 8 -i pbsvideofile.wtv -target pal-dvd -deinterlace -async 48000  pbsvideofile.mpg 

Based on @suken's answer, I was able to do a batch conversion. With the version of ffmpeg I used at that time, it worked directly from .wtv to .mp4.

gci 'D:\Recorded TV\*' -include('*lola*','*buzzcocks*') | % {
    $file = $_.Name
    .\ffmpeg -i $_ -vcodec copy -acodec copy -f dvd -deinterlace -map_metadata 0 "D:\Media\TV\$file.mp4"
}

In the above:

  • 'D:\Recorded TV' is the source location
  • 'D:\Media\TV' is the destination location
  • Filtering is being done to only include shows with "lola" and "buzzcocks" in the filename (you can take this out if you want)

The command tries to transfer the metadata over (e.g. show title and description) but it didn't seem to pick up in the destination file. You could try WTV-MetaRenamer first instead.