Для конвертации всех .mkv файлов в директории в .mp4 с использованием видеокарты (например, NVIDIA GPU через ffmpeg с nvenc), и последующим удалением исходников, можно использовать следующий скрипт:
🛠 Bash-скрипт с ffmpeg и NVIDIA NVENC
#!/bin/bash
# Убедитесь, что ffmpeg установлен с поддержкой nvenc
# Преобразование всех .mkv файлов в .mp4 с максимальным качеством
for file in *.mkv; do
# Получаем имя файла без расширения
base="${file%.*}"
# Конвертируем с использованием NVENC
ffmpeg -y -hwaccel cuda -i "$file" \
-c:v h264_nvenc -preset slow -cq 19 -b:v 0 \
-c:a copy \
"${base}.mp4"
# Удаляем исходный файл, если конвертация прошла успешно
if [ $? -eq 0 ]; then
rm "$file"
echo "Удалён: $file"
else
echo "Ошибка при обработке: $file"
fi
done
🔍 Пояснение параметров:
-hwaccel cuda: аппаратное ускорение через CUDA.-c:v h264_nvenc: кодек NVIDIA для H.264.-preset slow: более качественная компрессия.-cq 19: постоянное качество (чем ниже число — тем выше качество).-b:v 0: отключает битрейт, чтобы использовать только-cq.-c:a copy: аудио не перекодируется.
✅ Перед запуском:
- Убедитесь, что у вас установлен
ffmpegс поддержкойnvenc. Проверить можно командой:ffmpeg -encoders | grep nvenc - Скрипт можно сохранить как
convert.sh, затем:chmod +x convert.sh ./convert.sh
*Если происходит ошибка
Похоже, твоя видеокарта не поддерживает аппаратное кодирование 10-битного видео через h264_nvenc. Это довольно распространённая проблема на старых или ограниченных GPU. Вот как можно обойти это:
🔧 Решения:
1. Понизить битность видео до 8-бит
Если исходное видео 10-битное, можно предварительно привести его к 8-битному цвету:
ffmpeg -y -hwaccel cuda -i input.mkv \
-pix_fmt yuv420p \
-c:v h264_nvenc -preset slow -cq 19 -b:v 0 \
-c:a copy output.mp4
-pix_fmt yuv420p— это 8-битный формат, совместимый сh264_nvenc.
2. Использовать HEVC (h265_nvenc)
Если твоя видеокарта поддерживает hevc_nvenc, он может работать с 10-битным видео:
ffmpeg -y -hwaccel cuda -i input.mkv \
-c:v hevc_nvenc -preset slow -cq 19 -b:v 0 \
-c:a copy output.mp4
- HEVC часто поддерживает 10-бит, особенно на более новых GPU.
3. Проверить поддержку кодеков
Выполни команду, чтобы увидеть, какие кодеки доступны:
ffmpeg -hide_banner -encoders | grep nvenc
Если hevc_nvenc есть — используй его. Если нет — придётся перекодировать через CPU:
4. Перекодирование через CPU (если GPU не подходит)
ffmpeg -y -i input.mkv \
-c:v libx264 -preset slow -crf 18 \
-c:a copy output.mp4
libx264— программный кодек, даёт отличное качество, но медленнее.
Если не будет работать аудио, то:
Чтобы после конвертации аудио было в формате AC3, нужно заменить строку -c:a copy на явное указание кодека AC3. Вот как можно исправить скрипт:
✅ Обновлённый скрипт с поддержкой AC3
#!/bin/bash
# Убедитесь, что ffmpeg установлен с поддержкой nvenc и AC3
# Преобразование всех .mkv файлов в .mp4 с максимальным качеством и аудио AC3
for file in *.mkv; do
# Получаем имя файла без расширения
base="${file%.*}"
# Конвертируем с использованием NVENC и перекодировкой аудио в AC3
ffmpeg -y -hwaccel cuda -i "$file" \
-c:v hevc_nvenc -preset slow -cq 19 -b:v 0 \
-c:a ac3 -b:a 384k \
"${base}.mp4"
# Удаляем исходный файл, если конвертация прошла успешно
if [ $? -eq 0 ]; then
rm "$file"
echo "Удалён: $file"
else
echo "Ошибка при обработке: $file"
fi
done
🔍 Пояснение изменений
-c:a ac3— указывает FFmpeg использовать кодек AC3 для аудио.-b:a 384k— устанавливает битрейт аудио. Можно изменить на192k,256kи т.д. в зависимости от желаемого качества.
💡 Совет: если исходный аудиотрек уже в AC3, можно использовать -c:a copy только при условии, что ты предварительно проверяешь формат. В противном случае — перекодируй явно.