LINUX.ORG.RU

Какие ключи передавать ffmpeg чтобы тот брал ВСЕ параметры аудио/видео из источника?

 , , , ,


0

3

Про -c copy знаю, но иногда оно не принимает, когда нужно сделать какие-то преобразования.

Проблема в том, что ffmpeg, если ему не указывать обратное, всегда портит какие-нибудь параметры качества при перекодировании. Чтобы гарантировать что он ничего не испортит, нужно передавать ему ВСЕ ключи, которые отвечают за ВСЕ возможные параметры качества (битрейт, разрядность, частота дискретизации, и все остальные для видео, всех даже не знаю).

Какие существуют параметры качества? Хочу знать все.
Какие ключи передавать для каждого параметра, указывающие ему брать этот параметр из источника?

★★★★★

Последнее исправление: teod0r (всего исправлений: 1)

Про -c copy знаю, но иногда оно не принимает, когда нужно сделать какие-то преобразования.

Карась дуреет с этой прикормки.

ALiEN175
()

Какие существуют параметры качества? Хочу знать все.

Способы регулирования качества сильно зависят от кодека, используемого при кодировании. Полный набор параметров можно узнать так:

ffmpeg -h encoder=<codec>

где может быть libx264, libx265,mjpeg и т.д.

Конкретно для H.264 и H.265 обычно используют preset и crf. См. подробнее в https://trac.ffmpeg.org/wiki/Encode/H.264

Восстановить опции кодирования из имеющегося видеопотока невозможно. Ну только если битрейт, но с фиксированным битрейтом кодируют только в очень специфических случаях (реал-тайм передача видео на узком канале). Вместо битрейта обычно используют какие-то метрики качества, а битрейт в таком случае будет меняться в зависимости от данных.

Сама по себе постановка вопроса наводит на мысль о непонимании простой вещи. Когда видео перекодириуется с потерями, то оно в любом случае будет терять в качестве. И параметры должны зависеть не от того, что было в источнике, а от имеющихся ресурсов и требований к размеру файла. Если то и другое не ограничено, то можно сделать если не лосслесс то почти лосслесс, и качество не потеряется по сравнению с источником.

annulen ★★★★★
()

Про -c copy знаю, но иногда оно не принимает, когда нужно сделать какие-то преобразования.

-c copy означает, что ты делаешь не перекодирование, а демуксинг: достаешь поток как есть из контейнера источника и перекладываешь в контейнер на выходе. Никаких преобразований, кроме изменения типа контейнера, тут быть не может.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Восстановить опции кодирования из имеющегося видеопотока невозможно.

жаль.

Когда видео перекодириуется с потерями, то оно в любом случае будет терять в качестве.

перекодировать видео без потерь невозможно? не задав -c copy?
думал есть стандартный набор ключей для задания всех параметров, всё оказалось хуже.

Если то и другое не ограничено, то можно сделать если не лосслесс то почти лосслесс

как? как сделать чтоб ffmpeg ничего не портил?

teod0r ★★★★★
() автор топика
Ответ на: комментарий от annulen

мне понадобилось сделать моно на два канала, взяв один из каналов. -c copy не сработало.
проверил, как себя поведёт, если просто задать -c flac (исходник flac), а не -c copy БЕЗ преобразований, просто ffmpeg -i input.flac — output.flac: оно изменило битрейт. ну и как после этого использовать ffmpeg? нужно порсто сохранять качество без потерь (по возможности). и как? мне нужно чтоб всегда оно сохраняло, для любых форматов аудио и видео.

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

С FLAC всё просто, так как это lossless-кодек. Его можно перекодировать как угодно и PCM внутри не изменится ни на бит.

просто ffmpeg -i input.flac — output.flac: оно изменило битрейт

Если уменьшило, то радоваться надо. Это всё равно, что перепаковать zip-архив и получить выигрыш по размеру.

для любых форматов аудио и видео

А тут уже нет универсальных ответов. Особенно с видео, где lossless-кодеки никому не интересны. Lossless-аудио можно конверитить как угодно и гонять между кодеками, вообще ни о чём не думая.

annulen ★★★★★
()
Ответ на: комментарий от annulen

А тут уже нет универсальных ответов. Особенно с видео, где lossless-кодеки никому не интересны.

почему всё так сложно и печально? захочу перекодировать видео без потерь, и фиг получится? какие есть lossless видео кодеки?

teod0r ★★★★★
() автор топика

Про -c copy знаю, но иногда оно не принимает, когда нужно сделать какие-то преобразования

Так все из источника, или нужны «какие-то преобразования»? Взаимоисключающие требования.

CrX ★★★★★
()
Ответ на: комментарий от teod0r

почему всё так сложно и печально? захочу перекодировать видео без потерь, и фиг получится?

Потому что люди любят, чтобы фильм в FullHD весил десяток-другой гигов вместо терабайта, гораздо сильнее, чем они любят перекодировать туда-сюда. Это важно например для того, чтобы на целый фильм помещался на один стандартный блюрей.

А добиться этого можно только использованием сложных (и в чём-то, наверное, печальных) lossy-кодеков.

какие есть lossless видео кодеки?

Ну huffyuv, например.

Оно тебе точно надо? Места есть столько?

Объём будет в несколько десятков, возможно сотен раз больше, чем в например x264.

Я сам иногда использую — записываю, например, геймплей с экрана в лосслесс, но исключительно чтобы затем сжать во что-то стандартное не в реалтайме, то есть с более высоким качеством и низким битрейтом за счёт большего затраченного процессорного времени. Но если тебе не для чего-то подобного (сохранение «мастера» для последующего кодирования), то вряд ли оно тебе надо.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 6)
Ответ на: комментарий от teod0r

Без потерь можно конвертировать только в lossless. Целесообразно — из lossless в lossless. Из lossy в lossless возможно, но глупо — уже потерянное не вернётся, а объём раздуется. То есть да, из flac в flac ты без потерь переконвертировать сможешь, как и из flac в wavpack какой-нибудь или вообще в сырой PCM и обратно. А вот с lossy-кодеками так не выйдет.

Можно задать copy только для видео или только для аудио: -c:v copy -c:a copy. Например, если хочется видео оставить без потерь, а звук пожать, то можно сделать c:v copy -c:a aac, ну и так далее.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от teod0r

мне понадобилось сделать моно на два канала, взяв один из каналов. -c copy не сработало.

Что касается операций с каналами аудио, то я думаю, что это можно сделать без потерь даже с лосси-кодеками с помощью чего-то в стиле https://askubuntu.com/questions/539098/whats-the-fastest-way-to-extract-just-one-channel-left-or-right-from-an-audio/771233#771233

Просто для ffmpeg каналы внутри аудио — это уже на уровень глубже, чем дорожки внутри контейнера, и он туда не лазит, перепоручая такие вещи кодекам.

annulen ★★★★★
()
Ответ на: комментарий от annulen

С FLAC всё просто, так как это lossless-кодек. Его можно перекодировать как угодно и PCM внутри не изменится ни на бит.

В целом да, но могут быть нюансы. И в данном случая, мне кажется, имеет смысл их оговорить, потому что человек явно не очень понимает, как что работает.

Потерь не будет, если перекодировать без изменения частоты дискретизации и разрядности. Если переводить из 24 бит в 16 бит, или там из 44.1 кГц в 48 — это уже деструктивные преобразования и потери данных.

Это важно осознавать. То есть, без потерь ты можешь между лосслесс-кодеками хоть обперекодироваться во все стороны, если ты не делаешь преобразований: не изменяешь разрядность, частоту дискретизации, не микшируешь каналы, скажем, из стерео в моно. И да, на всякий случай: искажения будут даже если, например, целевая частота дискретизации намного выше исходной, то есть, скажем, если ты сделаешь из 44.1 кГц зачем-то 192 кГц, то обратно исходный PCM ты тоже уже не получишь — произведены необратимые преобразования/искажения.

CrX ★★★★★
()
Ответ на: комментарий от CrX

Так все из источника, или нужны «какие-то преобразования»? Взаимоисключающие требования.

если нужно просто обрезать рамку, изменить соотношение сторон или что-то ещё по мелочи, максимально сохранив качество.

Потерь не будет, если перекодировать без изменения частоты дискретизации и разрядности. Если переводить из 24 бит в 16 бит, или там из 44.1 кГц в 48 — это уже деструктивные преобразования и потери данных.

КЭП, ffmpeg сам занижает эти параметры, если не указывать ему это не делать. Какими ключами задать ему ВСЕГДА использовать максимальные настройки качества?

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

если нужно просто обрезать рамку, изменить соотношение сторон или что-то ещё по мелочи

Это уже считай раскодировать и по-новой закодировать. Без потери качества это сделать нельзя (за исключением лосслесс-кодеков, но для видео ты вряд ли их используешь или хочешь использовать).

КЭП, ffmpeg сам занижает эти параметры, если не указывать ему это не делать.

Если требуется зачем-то переделывать эти параметры у flac, то лучше это сделать всё же эксплицитно. А если не требуется, то -c copy.

Если надо скопировать один из каналов в другой — это уже достаточно сложное редактирование — перемикширование. Если хочется делать это именно при помощи ffmpeg, то проще наверное просто вручную задать ту же частоту и битность. «Перекодирование» как бы будет, но оно будет без потерь.

Какими ключами задать ему ВСЕГДА использовать максимальные настройки качества?

Это будет неправильно. Зачем тебе, например, конвертировать 44.1 кГц в 192? Формально более высокое «какчество», а по факту — с потерями.


Любое перекодирования из лосси в лосси — потеря качества.

Любое изменение картинки, такое как обрезание рамки и изменение соотношения сторон — это перекодирование.

Без перекодирования можно обрезать по времени, то есть отрезать начало или конец, разбить на куски, и т.д. и т.п. И то не на любой милисекунде, а по ключевым кадрам. Практически любое другое редактирование видеоряда (а не просто объединение и разделение дорожек) влечёт за собой перекодирование.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от CrX

изменение соотношения сторон — это перекодирование

не все плееры учтут, но соотношение может задаваться в контейнерах - матрёшка, vob dvd

yandrey ★★
()
Последнее исправление: yandrey (всего исправлений: 1)
Ответ на: комментарий от yandrey

Если оно «растянуто» неправильно, то да, конечно. Но я так понял по контексту, что изменить хочется именно с обрезанием не то рамки не то части изображения.

CrX ★★★★★
()
Ответ на: комментарий от annulen

Что касается операций с каналами аудио, то я думаю, что это можно сделать без потерь даже с лосси-кодеками

В mp3 это как правило joint-stereo, то есть не два канала и даже не mid/side разница.

kott ★★★★★
()
Ответ на: комментарий от annulen

Восстановить опции кодирования из имеющегося видеопотока невозможно.

нуууу, это не совсем так.

Некоторые опции - да, восстановить невозможно, потому что они влияют на качество потока, а не на его инструментально измеряемые характеристики.

Но какой-нибудь bframes вполне можно восстановить.

max_lapshin ★★★★★
()