Пакетное преобразование 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,
Если ваше имя файла отличается, вам нужно соответствующим образом адаптировать команду.