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