#!/bin/bash # See https://video.stackexchange.com/a/32719 set -o nounset set -o errexit set -o pipefail readonly ARGS=( "${@}" ); main() { local _avi_path; _avi_path="${1}"; shift; local _mkv_path; _mkv_path="${1}"; shift; local avi_path; avi_path="$(readlink --canonicalize-existing "${_avi_path}")"; local mkv_path; mkv_path="$(readlink --canonicalize-missing "${_mkv_path}")"; # Check whether the mp3 header is missing in the input file local missing_count; missing_count=0; set +o errexit missing_count="$(ffprobe -hide_banner -i "${avi_path}" 2>& 1 \ | grep -i 'mp3float' \ | grep -c -i 'Header missing')"; set -o errexit if [ 0 -eq "${missing_count}" ]; then # Trivial copy ffmpeg -i "${avi_path}" -c:v copy -c:a copy "${mkv_path}" else # Extract the mp3 stream local mp3_stream; mp3_stream="$(mktemp --suffix='.mp3')"; ffmpeg -i "${avi_path}" -c:a copy "${mp3_stream}" # Combine it back into the original AVI file ffmpeg -i "${avi_path}" -i "${mp3_stream}" \ -c:v libx264 -c:a copy -map 0:v:0 -map 1:a:0 \ "${mkv_path}" rm "${mp3_stream}" fi } main "${ARGS[@]}" exit 0