From c7e48fd13a87a5e7bc33a6e6e1086149775c004d Mon Sep 17 00:00:00 2001 From: Sylvain Herlédan Date: Thu, 16 Jul 2026 22:55:28 +0200 Subject: Add script for converting AVI file to MKV, while fixing potential audio issues. --- avi2mkv.sh | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100755 avi2mkv.sh (limited to 'avi2mkv.sh') diff --git a/avi2mkv.sh b/avi2mkv.sh new file mode 100755 index 0000000..3de6c62 --- /dev/null +++ b/avi2mkv.sh @@ -0,0 +1,55 @@ +#!/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 -- cgit v1.3.1