DTS-HA MA and devices that don’t support

Sometimes you have a video that has DTS-HD MA as the audio codec, and you have a device that misbehaves. You could transcode it, but, well, here's a better way. It copies it through (so no loss) and adds an AAC version (in same number of channels).

#!/usr/bin/env python3
# Add an aac track alongside dts

import os, sys, json, re

input_file = sys.argv[1]
output_file = re.sub(".mkv", "-transcoded.mkv", input_file)

if (input_file == output_file):
    print("Error: input == output file", file=sys.stderr)
    sys.exit(1)

with os.popen('ffprobe -v quiet -print_format json -show_streams "%s"' % sys.argv[1]) as f:
    data = json.load(f)

try:
    data
except:
    print("Error: file <%s> does not exist or is not an mkv" % input_file)
    sys.exit(1)

idx_to_transcode = -1
max_idx = -1
max_audio_idx = -1
for stream in data['streams']:
    max_idx = max(max_idx, stream['index'])
    if stream['codec_type'] == 'audio':
        max_audio_idx = max(max_audio_idx, stream['index'])
        if stream['codec_name'] == 'dca' and stream['profile'] == 'DTS-HD MA' and ('language' not in stream or stream['language'] == 'eng'):
            idx_to_transcode = stream['index']
new_idx = max_idx + 1

# The DTS-HD MA English stream is copied, and a new AAC transcoded one if it is made
# at new_idx. All other streams are copied as-is. The new stream is made default
cmd = ("ffmpeg  -y "
       "-i '%s' "
       "-map 0:v? "
       "-map 0:a? "
       "-map 0:s? "
       "-c:a copy "
       "-c:v copy "
       "-c:s copy "
       "-map 0:%u -strict -2 -c:%u aac "
       "-metadata:s:%u language=eng "
       "-disposition:%u default "
       "-disposition:%u none "
       "'%s'") % ( input_file, idx_to_transcode, new_idx, new_idx, new_idx, idx_to_transcode, output_file)

print(cmd)
r = os.system(cmd)
if r == 0:
    print("All was good!")
    r = os.rename(output_file, input_file)
    sys.exit(r)
else:
    print("Error: input == output file", file=sys.stderr)
    sys.exit(1)

Leave a Reply

Your email address will not be published. Required fields are marked *

*