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

19

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

    
задан TheMegolith 08.12.2015 в 16:08
источник

2 ответа

25

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

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

INPUT=""
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 время для очереди следующего файла

ответ дан TheMegolith 08.12.2015 в 16:09
8

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

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

Выход Matroska

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 .

ответ дан LordNeckbeard 24.09.2017 в 23:20