990 слов
5 минуты
Конвертация пачки видео

Все скрипты выполняют одну и ту же задачу: обрабатывают видеофайлы с расширениями .mp4, .avi, .mkv, .mov, .wmv, .flv, используя FFmpeg с аппаратным ускорением CUDA для перекодирования в H.264 с ограничением размера файла до 40 МБ.

1. Batch#

@echo off setlocal enabledelayedexpansion chcp 65001 > nul echo ======================================== echo Скрипт сжатия видео с CUDA-ускорением echo ======================================== :: Проверяем наличие ffmpeg where ffmpeg >nul 2>&1 if %errorlevel% neq 0 ( echo ОШИБКА: ffmpeg не найден в PATH! echo Убедитесь, что ffmpeg установлен и добавлен в переменную PATH. pause exit /b 1 ) :: Подсчитываем количество файлов set count=0 for %%F in (*.mp4 *.avi *.mkv *.mov *.wmv *.flv) do ( set /a count+=1 ) if %count% equ 0 ( echo Видеофайлы не найдены в текущей папке. echo Поддерживаемые форматы: mp4, avi, mkv, mov, wmv, flv pause exit /b 0 ) echo Найдено видеофайлов: %count% echo. :: Обрабатываем файлы set processed=0 set errors=0 for %%F in (*.mp4 *.avi *.mkv *.mov *.wmv *.flv) do ( set "filename=%%~nF" set "extension=%%~xF" set "outputfile=output!filename!.mp4" :: Проверяем, не существует ли уже выходной файл if exist "!outputfile!" ( echo [ПРОПУСК] Файл "!outputfile!" уже существует set /a processed+=1 ) else ( echo [%processed%/%count%] Обработка файла: "%%F" :: Запускаем ffmpeg с перенаправлением ошибок ffmpeg -hwaccel cuda -threads 8 -i "%%F" -c:v h264_nvenc -fs 40M "!outputfile!" -y -loglevel error :: Проверяем результат if !errorlevel! equ 0 ( if exist "!outputfile!" ( echo [УСПЕХ] Создан файл: "!outputfile!" ) else ( echo [ОШИБКА] Выходной файл не создан: "!outputfile!" set /a errors+=1 ) ) else ( echo [ОШИБКА] Ошибка при обработке файла: "%%F" set /a errors+=1 ) set /a processed+=1 echo. ) ) echo ======================================== echo Обработка завершена! echo Всего файлов: %count% echo Обработано: %processed% echo Ошибок: %errors% echo ======================================== if %errors% gtr 0 ( echo ВНИМАНИЕ: Возникли ошибки при обработке %errors% файлов. echo Проверьте, что: echo - CUDA драйверы установлены echo - Видеокарта поддерживает NVENC echo - Достаточно места на диске ) pause

2. PowerShell#

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 Write-Host "========================================" Write-Host "Скрипт сжатия видео с CUDA-ускорением" Write-Host "========================================" # Проверяем наличие ffmpeg $ffmpegExists = $null -ne (Get-Command ffmpeg -ErrorAction SilentlyContinue) if (-not $ffmpegExists) { Write-Host "ОШИБКА: ffmpeg не найден в PATH!" -ForegroundColor Red Write-Host "Убедитесь, что ffmpeg установлен и добавлен в переменную PATH." -ForegroundColor Red Read-Host "Нажмите Enter для выхода" exit 1 } # Получаем все видеофайлы с указанными расширениями $videoFiles = Get-ChildItem -Path . -File | Where-Object { $_.Extension -in @(".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv") } if ($videoFiles.Count -eq 0) { Write-Host "Видеофайлы не найдены в текущей папке." Write-Host "Поддерживаемые форматы: mp4, avi, mkv, mov, wmv, flv" Read-Host "Нажмите Enter для выхода" exit 0 } Write-Host "Найдено видеофайлов: $($videoFiles.Count)" Write-Host "" # Счетчики для статистики $processed = 0 $errors = 0 foreach ($file in $videoFiles) { $filename = $file.BaseName $outputFile = "output$filename.mp4" # Проверяем, не существует ли уже выходной файл if (Test-Path $outputFile) { Write-Host "[ПРОПУСК] Файл `"$outputFile`" уже существует" -ForegroundColor Yellow $processed++ continue } Write-Host "[$processed/$($videoFiles.Count)] Обработка файла: `"$($file.Name)`"" # Параметры для ffmpeg (экранируем пути в кавычки) $ffmpegArgs = @( "-hwaccel", "cuda", "-threads", "8", "-i", "`"$($file.FullName)`"", "-c:v", "h264_nvenc", "-fs", "40M", "`"$outputFile`"", "-y", "-loglevel", "error" ) try { # Формируем команду для cmd (более надежный способ) $cmdArgs = "ffmpeg -hwaccel cuda -threads 8 -i `"$($file.FullName)`" -c:v h264_nvenc -fs 40M `"$outputFile`" -y -loglevel error" # Запускаем через cmd $process = Start-Process -FilePath "cmd" -ArgumentList "/c", $cmdArgs -Wait -NoNewWindow -PassThru if ($process.ExitCode -eq 0) { if (Test-Path $outputFile) { Write-Host "[УСПЕХ] Создан файл: `"$outputFile`"" -ForegroundColor Green } else { Write-Host "[ОШИБКА] Выходной файл не создан: `"$outputFile`"" -ForegroundColor Red $errors++ } } else { Write-Host "[ОШИБКА] Ошибка при обработке файла: `"$($file.Name)`"" -ForegroundColor Red $errors++ } } catch { Write-Host "[ОШИБКА] Не удалось запустить ffmpeg для файла: `"$($file.Name)`"" -ForegroundColor Red Write-Host "Ошибка: $($_.Exception.Message)" -ForegroundColor Red $errors++ } $processed++ Write-Host "" } Write-Host "========================================" Write-Host "Обработка завершена!" Write-Host "Всего файлов: $($videoFiles.Count)" Write-Host "Обработано: $processed" Write-Host "Ошибок: $errors" Write-Host "========================================" if ($errors -gt 0) { Write-Host "ВНИМАНИЕ: Возникли ошибки при обработке $errors файлов." -ForegroundColor Yellow Write-Host "Проверьте, что:" -ForegroundColor Yellow Write-Host "- CUDA драйверы установлены" -ForegroundColor Yellow Write-Host "- Видеокарта поддерживает NVENC" -ForegroundColor Yellow Write-Host "- Достаточно места на диске" -ForegroundColor Yellow } Read-Host "Нажмите Enter для выхода"

3. Zsh#

#!/bin/zsh # Цветовые коды для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' echo "========================================" echo "Скрипт сжатия видео с CUDA-ускорением" echo "========================================" # Проверяем наличие ffmpeg if ! command -v ffmpeg &> /dev/null; then echo -e "${RED}ОШИБКА: ffmpeg не найден в PATH!${NC}" echo -e "${RED}Убедитесь, что ffmpeg установлен и добавлен в переменную PATH.${NC}" echo "Нажмите Enter для выхода..." read exit 1 fi # Находим все видеофайлы с указанными расширениями video_files=() for ext in mp4 avi mkv mov wmv flv; do for file in *.$ext; do if [[ -f "$file" ]]; then video_files+=("$file") fi done done if [[ ${#video_files[@]} -eq 0 ]]; then echo "Видеофайлы не найдены в текущей папке." echo "Поддерживаемые форматы: mp4, avi, mkv, mov, wmv, flv" echo "Нажмите Enter для выхода..." read exit 0 fi echo "Найдено видеофайлов: ${#video_files[@]}" echo "" # Счетчики для статистики processed=0 errors=0 total=${#video_files[@]} for file in "${video_files[@]}"; do # Получаем имя файла без расширения filename="${file%.*}" output_file="output${filename}.mp4" # Проверяем, не существует ли уже выходной файл if [[ -f "$output_file" ]]; then echo -e "${YELLOW}[ПРОПУСК] Файл \"$output_file\" уже существует${NC}" ((processed++)) continue fi echo "[$processed/$total] Обработка файла: \"$file\"" # Запускаем ffmpeg с обработкой ошибок if ffmpeg -hwaccel cuda -threads 8 -i "$file" -c:v h264_nvenc -fs 40M "$output_file" -y -loglevel error 2>/dev/null; then if [[ -f "$output_file" ]]; then echo -e "${GREEN}[УСПЕХ] Создан файл: \"$output_file\"${NC}" else echo -e "${RED}[ОШИБКА] Выходной файл не создан: \"$output_file\"${NC}" ((errors++)) fi else echo -e "${RED}[ОШИБКА] Ошибка при обработке файла: \"$file\"${NC}" ((errors++)) fi ((processed++)) echo "" done echo "========================================" echo "Обработка завершена!" echo "Всего файлов: $total" echo "Обработано: $processed" echo "Ошибок: $errors" echo "========================================" if [[ $errors -gt 0 ]]; then echo -e "${YELLOW}ВНИМАНИЕ: Возникли ошибки при обработке $errors файлов.${NC}" echo -e "${YELLOW}Проверьте, что:${NC}" echo -e "${YELLOW}- CUDA драйверы установлены${NC}" echo -e "${YELLOW}- Видеокарта поддерживает NVENC${NC}" echo -e "${YELLOW}- Достаточно места на диске${NC}" fi echo "Нажмите Enter для выхода..." read
Конвертация пачки видео
https://guilliman.ru/posts/ffmpeg-batch/
Автор
Guilliman
Опубликовано
2025-07-06
Лицензия
CC BY-NC-SA 4.0