Найти в Дзене
Константин Кулаков

Как быстро и бесплатно перекодировать видео в mp4 на компьютере с видеокартой GeForce

Важно! Статья рассчитана на опытных пользователей Windows, которые самостоятельно смогут установить себе FFmpeg и vlc, изменить программу по умолчанию, задать переменную окружения, отредактировать в определённой кодировке и запустить пакетный файл, а также впоследствии изменить некоторые параметры кодирования в соответствии со своими предпочтениями. Ещё следует обратить внимание на то, для каких целей и при каких условиях разрешается такая обработка видео правообладателем. В любом случае, наверняка, нельзя видео, если оно не принадлежит вам, передавать кому-либо или распространять в интернете, а после просмотра на Smart TV, который, например, не может самостоятельно его воспроизвести, следует сразу же удалить с компьютера. Зачем это бывает нужно и при каких условиях видео кодируется быстро Лет пять назад, когда на сайтах наших федеральных телеканалов выкладывались ещё не все записи передач, записывал по расписанию IP TV передачи некоторых каналов, которые наш интернет провайдер в тесто
Оглавление

Важно! Статья рассчитана на опытных пользователей Windows, которые самостоятельно смогут установить себе FFmpeg и vlc, изменить программу по умолчанию, задать переменную окружения, отредактировать в определённой кодировке и запустить пакетный файл, а также впоследствии изменить некоторые параметры кодирования в соответствии со своими предпочтениями. Ещё следует обратить внимание на то, для каких целей и при каких условиях разрешается такая обработка видео правообладателем. В любом случае, наверняка, нельзя видео, если оно не принадлежит вам, передавать кому-либо или распространять в интернете, а после просмотра на Smart TV, который, например, не может самостоятельно его воспроизвести, следует сразу же удалить с компьютера.

Зачем это бывает нужно и при каких условиях видео кодируется быстро

Лет пять назад, когда на сайтах наших федеральных телеканалов выкладывались ещё не все записи передач, записывал по расписанию IP TV передачи некоторых каналов, которые наш интернет провайдер в тестовом режиме и тогда и сейчас бесплатно транслировал и разрешал к просмотру на компьютере (пользователям IP адрес и порт трансляции нужного канала предоставлен в плейлисте для vlc на сайте этого местного интернет провайдера). Сейчас я купил телевизионную приставку, докупил у провайдера ещё платные каналы и возможность отложенного просмотра в течение трёх дней. Пользуюсь приставкой для обычного просмотра телепередач теперь и если не получается получить на компьютер запись интересной передачи (не выкладывают или когда сталкиваюсь с неустранимыми сбоями при скачивании). А раньше единственной возможностью у меня (кроме захвата видео кабельного телевидения тюнером) была запись IP TV при помощи бесплатного медиаплеера vlc (кстати, он воспроизводит практически всё) с ПК или миникомпьютера Raspberry Pi с последующей обработкой. Если записывал на компьютере с Windows, то примерно так (для просмотра этого пакетного файла не требуется регистрация или вход в аккаунт облачного сервиса DropBox, не нашёл как здесь иначе показать cmd файл без переносов строк и с подсветкой синтаксиса). Практически всегда после записи обрабатывал видео при помощи купленного тогда TS-Doctor, чтобы сбои трансляции не вызывали потом остановок воспроизведения. Но когда купил не так давно новый компьютер с неплохой видеокартой GeForce, необходимость в платном обновлении TS-Doctor до новой версии отпала, поскольку теперь похожую обработку можно делать быстро и бесплатно при помощи этой видеокарты. Если кодировать видео только процессором, это может занять очень много времени, кодирование же видеокартой даёт значительный прирост скорости. Ещё перекодирование в mp4 может быть полезным, если у вас есть архив старых домашних видеозаписей, которые планируете просматривать в будущем и хранить их достаточно долго. В настоящее время mp4 - самый распространённый формат и, возможно, старые видео имеет смысл перекодировать в него. Не исключено, что при этом размер видео даже уменьшится, особенно, если при кодировании применить перспективный кодек h.265, а не наиболее популярный сейчас h.264. Но не стоит сильно рассчитывать на сокращение размера видео, если оно, например, получено с видеокассеты и содержит шумы.

Использование FFmpeg для кодирования видео

Сначала простая задача по выделению не просмотренного остатка видео

Для кодирования видео, если нужно задействовать при этом все возможности установленной видеокарты GeForce (а даже и Intel, только у меня настройки для неё в скрипте не приведены, но они без особых проблем находятся в интернете), можно использовать бесплатный FFmpeg, для чего следует распаковать скачанный с указанной страницы архив в некоторую доступную для записи папку на жёстком диске компьютера. Приведу здесь вариант моего пакетного файла encode.cmd, который запускает FFmpeg с определёнными параметрами. Рассмотрим этот cmd файл подробнее. В данном случае он предназначен для быстрого и точного нахождения стартового ключевого кадра, с которого будет начинаться оставшаяся часть видео. Предполагается, что примерно один час записи мы уже посмотрели, перематывать видео на телевизоре с пульта неудобно (именно это, как раз, довольно протяжённое по времени), а в дальнейшем мы хотим видеть только не просмотренную его часть. После завершения работы скрипта запустим полученный видеофайл (имя которого заданно в переменной output) для просмотра плеером vlc (если нужно, установим его как программу по умолчанию для такого типа файлов) и подкорректируем немного (в несколько итераций) момент начала получившейся записи в последней строке пакетного файла, заданное параметром -ss, например до "59:58" или, например "1:00:10", как вам кажется более естественным для сюжета.

Когда точное значение параметра -ss будет подобрано, можно будет убрать параметр -t 0:30, который определяет, что длительность результирующего видео равна 30 секундам, чтобы получить желаемый остаток видео от стартового кадра до самого конца записи. Как видно на скриншоте, видео обрабатывалось в 462 раза быстрее обычной скорости его воспроизведения. Для такого варианта работы (без перекодирования) это обычный по скорости результат. Обращаю внимание, что в последней строке этого моего пакетного файла файл на самом деле не перекодируется (задана соответствующая группа параметров через значение переменной %copystreams%). Также важно, что параметры -ss и -t в этой строке расположены непосредственно перед параметром -i, чтобы они влияли именно на входной файл. Иногда важно при обработке записанного IP TV применение параметра -fflags +genpts. Я использую этот параметр всегда. Подробности его применения найдите самостоятельно, если интересно. На что ещё можно обратить внимание в этой строке пакетного файла, так это на способ вызова ffmpeg.exe из папки, которая не находится у меня в пути поиска, а задана переменной окружения %FFmpegPath%. Я так сделал потому, что периодически обновляю FFmpeg, просто распаковывая в подпапку с содержащимся в архиве названием, которое от версии к версии меняется. Можно было бы не использовать такую переменную окружения, но у меня FFmpeg вызывается из нескольких пакетных файлов и подобный вариант достаточно для этого удобен. Впрочем, вы можете придумать на замену какой-нибудь свой вариант вызова и использовать его в вашем пакетном файле. Ну и ещё отмечу, что в переменной output расширение выходного файла установлено как .ts, поскольку файл предназначен для отправки на Smart TV. Это же расширение (и соответствующий контейнер) применяется также и в первом приведённом здесь скрипте (предназначенном для записи IP TV из интернета в сети моего провайдера). Контейнер MPEG-TS обычно и используется для потокового видео.

Задача чуть посложнее: разбиение видео на части и слияние аналогичных по параметрам частей

Разбиение видео на части почти не отличается от варианта, рассмотренного выше. Только вместо параметра -t используется параметр -to, в котором указывается момент времени, до которого длится в исходном видео требующаяся нам в качестве выходного файла часть.

Слияние видео достаточно просто и интуитивно понятно. Привожу здесь пакетный файл и настройки к нему. Оба файла должны быть согласованы, находиться в одной папке и иметь заданные здесь кодировки текста, причём разные для каждого из файлов, чтобы можно было без проблем использовать названия видеофайлов на русском языке. Этот вариант слияния подходит нам только тогда, когда параметры кодирования (используемые кодеки и их настройки) всех файлов одинаковы. Это бывает, как в этом случае, когда файлы взяты из одного источника и являются частями разбитого на части большого исходного файла. Посмотреть параметры кодирования файла (используемый контейнер, видео- и аудио- кодек, а также ряд других параметров подробнее) можно при помощи MediaInfo. Также без проблем склеиваются видео, перекодированные с применением одних и тех же параметров в рассмотренном здесь моём пакетном файле encode.cmd. Подробности найдёте в интернете.

UPD: заметил недавно, что слияние видео описанным мной методом перестало работать. Такое бывает с FFmpeg - иногда что-то меняется, исправляется, перестаёт работать на время или совсем. В данном случае для контейнера .ts вполне можно воспользоваться стандартной командой Windows примерно так:

copy /b "часть1.ts"+"часть2.ts"+"часть3.ts" "результат.ts"

Только после этого обработать ещё с параметром -fflags +genpts

И, наконец, кодирование видео

Если вы разобрались с написанным выше, то перекодирование видео не составит труда. Для этого немного изменим пакетный файл encode.cmd: в последней строке его уберём, если необходимо, параметры -ss и -t и заменим переменную %copystreams% на, например, %encode_h264_nvenc% или %encode_h264_HD_nvenc% для кодирования видео в стандартном или высоком качестве соответственно и зададим в переменной output расширение выходного файла как mp4. Вот и все настройки. Теперь запускаем пакетный файл и ждём завершения процесса кодирования. В зависимости от класса видеокарты GeForce процесс кодирования может занять больше или меньше времени, но всё равно это должно быть намного быстрее, чем с применением только процессора компьютера (при использовании параметров из переменной %encode% вместо %copystreams%). Так же кодируется видео в h265, соответствующие настройки есть в переменных этого пакетного файла. Для начала можно кодировать с заданными мной параметрами, а затем при необходимости поменять на более пригодные именно для вас. Все параметры кодирования с помощью видеокарты можно посмотреть, чтобы затем подобрать подходящие настройки, выполнив команду:

ffmpeg.exe -h encoder=h264_nvenc

Важно, что во время кодирования с применением видеокарты, она не должна заснуть, а быть постоянно в рабочем состоянии, то есть если обычно на компьютере задано время отключения экрана в параметрах управления электропитанием, то нужно установить его в "Никогда" на время перекодирования.

Надеюсь, что статья и приведённые в качестве примера файлы помогут опытному пользователю начать разбираться в кодировании при помощи установленной на его компьютере видеокарты.

UPD: Кому интересен также GUI, вот ссылка на некоторые варианты. Там обсуждение ещё есть.

UPD: если статья показалась полезной, обратите внимание ещё и на это: Немного о себе, принципах, состоянии здоровья и финансов.