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


31

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

Відповіді:


37

Так, використовуючи 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 до специфікації МСЕ-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 час для черги на наступний файл


3
Відмінно! Тепер ми можемо видалити коментарі під питанням. Я б сказав, що sleep 3непотрібне (але можливо корисне для завершення циклу), і INPUT=$1безглуздо, оскільки ви запускаєте це безпосередньо в інтерактивній оболонці.
муру

11
Розгляньте потокове копіювання аудіозапису -c:a copyзамість повторного кодування. Крім того, 0:0не завжди може посилатися на відео, а 0:1не завжди може посилатися на аудіо. Ви можете використовувати специфікатор потоку, щоб уникнути можливих проблем: -map 0:v -map 0:aякщо ви хочете, щоб усі потоки відео та аудіо надходили з входу 0, або -map 0:v:0 -map 0:a:0якщо ви хочете лише перші відео-та аудіо потоки з входу 0. Якщо ви хочете лише англійський аудіопотік: -map 0:m:language:eng(припускаючи це маркується).
llogan

1
@LordNeckbeard Я проголосую за те, щоб написати повну відповідь.
Fran Marzoa

1
@Fran Не помітив, що було так багато відгуків на цей коментар. Я додав відповідь, використовуючи простіші, менш схильні до помилок та ефективніші методи.
llogan

1
Я б повністю пішов просто ffmpeg -i $INPUT -vcodec h264 -acodec copy $OUTPUT. Щось я використовую щодня і насправді запам'ятовую на відміну від тієї суєти безглуздих прапорів, на яку кожна відповідь ffmpeg так ганебна.
Бен Сінклер

20

Пакетне перетворення 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

mkdir h264vids

for f in *.mkv
do
  audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
  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.


0

Розглядаючи попередні відповіді, я придумав наступне:

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.

Якщо назва ваших файлів відрізняється, вам потрібно відповідно адаптувати команду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.