python:scripts:mp4-to-mkv

MP4 в MKV

Скрипт конвертирует MP4 в MKV без потери качества. Используется ffmpeg.

#!/usr/bin/env bash
 
# 1. Проверяем наличие ffmpeg
if ! command -v ffmpeg &> /dev/null; then
    echo "❌ Ошибка: ffmpeg не установлен."
    echo "   Ubuntu/Debian: sudo apt install ffmpeg"
    echo "   Fedora/RHEL:   sudo dnf install ffmpeg"
    exit 1
fi
 
# 2. Проверяем аргументы
if [ $# -eq 0 ]; then
    echo "📖 Использование: $0 <маска_файлов> [папка_результата]"
    echo "   Пример 1: $0 '*.mp4'"
    echo "   Пример 2: $0 '*.mp4' './converted_mkv'"
    exit 1
fi
 
input_mask="$1"
output_dir="${2:-}"
 
# 3. Подготовка папки результата (если указана)
if [ -n "$output_dir" ]; then
    # Убираем слеш в конце для единообразия
    output_dir="${output_dir%/}"
    if ! mkdir -p "$output_dir" 2>/dev/null; then
        echo "❌ Ошибка: не удалось создать или получить доступ к папке '$output_dir'"
        exit 1
    fi
fi
 
# 4. Раскрытие маски файлов
shopt -s nullglob
files=($input_mask)
shopt -u nullglob
 
if [ ${#files[@]} -eq 0 ]; then
    echo "⚠️  Файлы по маске '$input_mask' не найдены."
    exit 0
fi
 
# 5. Информация перед стартом
echo "📁 Найдено файлов: ${#files[@]}"
if [ -n "$output_dir" ]; then
    echo "📂 Папка результата: $output_dir"
else
    echo "📂 Папка результата: [та же, что и у исходных файлов]"
fi
echo "🚀 Начинаю конвертацию..."
echo "----------------------------------------"
 
success=0
fail=0
 
# 6. Основной цикл
for file in "${files[@]}"; do
    [ -f "$file" ] || continue
 
    # Извлекаем имя файла без расширения
    base_name="$(basename "$file")"
    name_no_ext="${base_name%.*}"
 
    # Формируем путь результата
    if [ -n "$output_dir" ]; then
        outfile="${output_dir}/${name_no_ext}.mkv"
    else
        outfile="${file%.*}.mkv"
    fi
 
    # Защита от перезаписи (если по какой-то причине пути совпали)
    if [ "$(realpath "$file" 2>/dev/null)" = "$(realpath "$outfile" 2>/dev/null)" ]; then
        echo "⚠️  Пропуск: $file (путь результата совпадает с исходным)"
        continue
    fi
 
    echo ">> $file -> $outfile"
 
    # Конвертация: -c copy = стрим-копирование без перекодирования
    if ffmpeg -i "$file" -c copy "$outfile" -y -loglevel error; then
        echo "   ✅ Успешно"
        ((success++))
    else
        echo "   ❌ Ошибка конвертации"
        ((fail++))
    fi
done
 
echo "----------------------------------------"
echo "🏁 Готово! Успешно: $success, Ошибок: $fail"

Скачать

Примеры:

# 1. Складывать рядом с исходными файлами (как раньше)
./mp4_to_mkv.sh "*.mp4"
 
# 2. Складывать в конкретную папку (создастся автоматически)
./mp4_to_mkv.sh "videos/*.mp4" "./mkv_output"
 
# 3. С абсолютным путём
./mp4_to_mkv.sh "/home/user/clip*.mp4" "/tmp/converted"
Важно про кавычки: Маску файлов (*.mp4) всегда передавайте в одинарных или двойных кавычках. Иначе оболочка раскроет её до запуска скрипта, и при отсутствии файлов в текущей директории скрипт получит литеральную строку *.mp4, что сломает логику поиска в других папках.
  • python/scripts/mp4-to-mkv.txt
  • Последнее изменение: 21.05.2026 20:21
  • r0wbh