ffmpeg - Як скопіювати | витягти параметри кодування з існуючого медіа-файлу?


19

Я хотів би зараз зробити це кілька разів, тому прошу.

Якщо у мене є існуючий відео- чи аудіофайл ffmpeg, mplayerта інші медіаплеєри можуть виявити хоча б деякі його "властивості", такі як контейнер, кодек та бітрейт, що, можливо, різної якості та кодування конкретних налаштувань тощо.

Як я можу витягнути ці налаштування з існуючого файлу, щоб використовувати їх (безпосередньо) для кодування за допомогою ffmpeg?

Наприклад, у мене з’явилося mkvвідео, закодоване x264з деякими налаштуваннями, та іншим нестисненим aviфайлом. Я хотів би "скопіювати" параметри кодування, які використовуються для файлу x264 mkv для перекодування avi з тими ж налаштуваннями.

Примітка. Я шукаю спосіб, який не повинен включати жодну роботу людини з "перекладом" налаштувань з декодера в кодер. Добре, якщо мені потрібно спочатку витягнути налаштування і зберегти його десь, але я хотів би мати можливість просто подати параметри читання в командний рядок або попередньо встановлений | файл конфігурації для ffmpeg.


Ну, можливо, ви могли б розібратися з результатами ffprobe(особливо з параметрами -show_streamsта -show_formatваріантами) та використати цю інформацію для
скриптування

1
Часто використання тих же налаштувань, як бітрейт (спроба скопіювати точний бітрейт здається популярною серед користувачів) не призведе до оптимальної якості. Звичайно, я не маю поняття, як виглядає ваш типовий вклад, але, -crfяк правило, рекомендується використання параметра x264 . Дивіться посібник з кодування FFmpeg та x264 .
llogan

Я не можу знайти нічого про налаштування кодування у виході ffprobe :(
thelolcat

Він показує лише кількість ReFrames, але не інші параметри, як
Mediainfo

Синтаксис введення з ffmpeg відрізняється від полів метаданих. наприклад, ви можете прочитати channels:6з відеофайлу, але для його кодування вам потрібно буде використовувати комутатор -ch:6. Деякі комутатори використовують 1 букву, інші використовують два тощо.
jiggunjer

Відповіді:


10

Не існує автоматичного способу зробити це. Ви повинні подивитися на параметри вихідного файлу і застосувати їх до вихідного файлу.

У більшості випадків це:

  • Формат контейнера (MP4, MKV,…)
  • Відео- та аудіокодек (H.264, H.265,…)
  • Аудіо-особливості:
    • Кількість аудіоканалів
    • Частота дискретизації аудіо
    • Аудіо бітрейт
  • Для відео:
    • Профіль та рівень (для забезпечення сумісності дивіться тут )
    • Максимальні обмеження щодо бітрейту (наприклад, для H.264 )
    • Максимальна роздільна здатність відео, зміна через -filter:v scaleабо-s:v
    • Частота кадрів, зміна через -filter:v fps -r
    • Підсвідомість Chroma, зміна через -pix_fmt(наприклад, -pix_fmt yuv420pмає забезпечити найкращу сумісність)
    • Розмір GOP (відстань між IDR-кадрами), встановлений через -g
    • Інші конкретні параметри кодування

Але навіть якщо з цим все гаразд, деякі пристрої можуть вимагати конкретної, захищеної інформації, вбудованої в бітовий потік.


Що стосується конкретного завдання використання x264, то це не буде банальним. Мені не відомо жодного сценарію, який би вирішив ці завдання, які зазвичай виконуються вручну. Для отримання найбільш детальної інформації про налаштування кодування на Unix / Linux або OS X ви можете використовувати mediainfoдеякі хитрощі Bash.

Наприклад, для відео, закодованого x264 у файлі MP4:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

Це виведе список x264 варіантів:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

Потім ви можете вручну передати ці параметри до двійкового файлу x264.

Якщо ви проходите через FFmpeg, це трохи складніше, оскільки не всі параметри x264 можна або потрібно відображати так. Зверніть увагу , що часто просто попереднє встановлення, налаштувати і профіль специфікація буде робити , а також (як показано в x264 --fullhelpі керівництві кодування x264 ), а також з зазначенням рівня CRF досить.

І це навіть не враховуючи звук, де, на щастя, варіантів не так багато.


Так що це неможливо з ffprobe чи ffmpeg?
thelolcat

Ні, це неможливо безпосередньо зробити за допомогою ffprobe / ffmpeg. У випадку з кодованим x264 відео, я б використав mediainfoвисновок і відобразив ці параметри для ffmpeg -x264-params. (Див. Також посібник з кодування x264 ). Але якщо ви хочете отримати загальне рішення для всіх видів кодеків / кодерів або форматів контейнерів, вам знадобиться написати скрізь складний сценарій, який робить перетворення.
slhck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.