Пакетное преобразование H.265 MKV в H.264 с ffmpeg, чтобы сделать файлы совместимыми для перекодирования

У меня есть файлы с кодировкой H.265, которые настолько ресурсоемки, что не воспроизводятся хорошо, и мое программное обеспечение для преобразования (mencoder) (в настоящее время) не поддерживает формат H.265. Могу ли я преобразовать их в H.264 в командном файле командной строки, чтобы быстро преобразовать файлы для повторного сжатия, используя Devede/OGMrip? После поиска на этом сайте я не нашел его обсуждаемым, поэтому я опубликую полезный вопрос и ответ на него.

3 ответа

Решение

Да, используя ffmpeg,

Откройте терминал и направьте его в каталог, содержащий файлы в кодировке H.265, при условии, что у вас есть ffmpeg и соответствующие библиотеки установлены и при условии, что они в формате MKV, скопируйте и вставьте следующее в окно терминала.

INPUT="$1"
for i in *.mkv ; do
    ffmpeg -i "$i" -bsf:v h264_mp4toannexb -sn -map 0:0 -map 0:1 -vcodec libx264 "$i.ts"
    mv "$i.ts" "$i.mpg"
    sleep 3
done

Там у вас есть это. Это преобразует в h.264 в контейнере MPG в том же каталоге.

Объяснение команды переключателей:

  • for i in *.mkv ; do ... done

    Это устанавливает все файлы.mkv в каталоге для включения в пакетный процесс. Это может быть изменено для соответствия расширению контейнера файлов, которые вы хотите обработать.

  • ffmpeg -i "$i"Запускает программу ffmpeg и вызывает файлы для обработки.

    • -bsf:v активирует фильтр видеопотока, который будет использоваться.

    • h264_mp4toannexb - Фильтр потока битов, который активирован.

      Преобразовать поток битов H.264 из режима с префиксом длины в режим с префиксом кода (как определено в Приложении B спецификации ITU-T H.264).

      Это требуется для некоторых потоковых форматов, обычно формата транспортного потока MPEG-2 (mpegts) Обработка MKV h.264 (в настоящее время) требует этого, если он не включен, вы увидите ошибку в окне терминала, указывающую, что вы должны его использовать.

    • -sn останавливает потоковую передачу потоков субтитров (для тех, кому не нужны субтитры в их видео). Это необязательно и может быть удалено.

    • -map 0:0 -map 0:1 Сообщает ffmpeg обрабатывать только первые два потока файла (0:0 это видео поток, 0:1 это первый аудиопоток файла). Это делает две вещи, удаляет лишние аудиопотоки, обычно первый аудиопоток - английский, но не всегда. Другие потоки, такие как встроенные субтитры, удаляются, уменьшая размер файла. Это также необязательная строка. Ты можешь использовать ffprobe для просмотра доступных потоков в файле. -map не является обязательным и может быть удален из команды.

    • -vcodec libx264Это говорит ffmpeg кодировать вывод в H.264

    • "$i.ts"Сохраняет вывод в формате.ts, это полезно, чтобы не перезаписывать исходные файлы.

  • mv "$i.ts" "$i.mpg" Преобразует расширение файла в MPG в том же каталоге. Это можно настроить для отправки в любой каталог, который вам нравится.

  • sleep 3 - позволяет процессу отдыхать, давая ffmpeg время поставить в очередь следующий файл

Пакетное преобразование H.265 в H.264

Эти примеры были написаны для недавнего ffmpeg, Избавьте себя от проблем и загрузите последнюю версию. Затем положить ffmpeg двоичный в ~/bin или же /usr/local/bin (возможно, вам придется выйти из системы и войти, чтобы это заметили).

Матроска выходной

mkdir h264vids
for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -c:v libx264 -crf 23 -preset medium h264vids/"${f%.*}.mkv"; done
  • Этот пример будет выводить в каталог с именем h264vids,

  • В этом примере предполагается, что ваши входные данные .mp4, Если нет, измените .mp4 экземпляр в примере к вашему типу входного файла, или просто используйте жадный * само собой.

  • регулировать -crf за качество и -preset для скорости / эффективности кодирования. Или просто удалите эти параметры и используйте значения по умолчанию, которые являются довольно хорошими и должны быть достаточными для большинства (в примере используются значения по умолчанию для этих параметров). См. FFmpeg Wiki: H.264 для получения дополнительной информации об этих параметрах.

Выход MP4

Этот немного сложнее. Это будет выполнять условное кодирование в зависимости от того, является ли входной звук AAC или нет. Если входной аудиосигнал имеет формат AAC, тогда аудиосигнал будет скопирован в потоковом режиме (переделан заново) как есть, и ненужное перекодирование будет исключено. Если входной звук не AAC, то он будет перекодирован в AAC.

Вот простой скрипт, демонстрирующий, как это сделать, используя ffprobe а также ffmpeg, Скопируйте и сохраните его в каталог, содержащий ваши видео для конвертации, дайте ему разрешение на выполнение с chmod +x yourscriptnameзатем запустите ./yourscriptname,

#!/bin/bash

audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")

mkdir h264vids

for f in *.mkv
do
  if [ "$audioformat" = "aac" ]; then
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy -movflags +faststart h264vids/"${f%.*}.mp4"
  else
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
  fi
done
  • Этот пример будет выводить в каталог с именем h264vids,

  • В этом примере предполагается, что ваши входные данные .mkv, Если нет, измените .mkv экземпляр в примере к вашему типу входного файла, или просто используйте жадный * само собой.

  • Смотрите примечание выше относительно -crf а также -preset,

  • Вы можете приостановить кодирование с помощью Ctrl+Z и продолжить с fg,

Учитывая предыдущие ответы, я придумал следующее:

for file in *265.mkv; do nice -n19 ffmpeg -i $file -c copy -c:v libx264 ${file/%265.mkv/264.mkv}; done

Это предполагает, что файлы всегда имеют имя, оканчивающееся на 265.mkv, Это окончание будет заменено на 264.mkv,

Если ваше имя файла отличается, вам нужно соответствующим образом адаптировать команду.

Другие вопросы по тегам