ffmpeg конвертировать без потери качества

Мне нужно преобразовать все видео в мой видеоплеер (на веб-сайте), если тип файла отличается от flv/mp4/webm.

Когда я использую: ffmpeg -i filename.mkv -sameq -ar 22050 filename.mp4 :

[h264 @ 0x645ee0] ошибка при декодировании MB 22 1, bytestream (8786)

Я хочу сказать, что я должен делать, когда мне нужно преобразовать тип файла: .mkv и другой (не поддерживается jwplayer) в flv/mp4 без потери качества.


person Jensej    schedule 29.08.2014    source источник
comment
Ответ stackoverflow.com/a/15052662/3102264 объясняет, как копировать без перекодирования (ffmpeg -i input.mkv - c скопировать -map 0 output.mp4)   -  person mpromonet    schedule 30.08.2014
comment
@mpromonet, если вы хотите сохранить кодек, -c copy подойдет, но чтобы преобразовать кодек и сохранить то же качество, мне пришлось использовать -qscale 0, как я читал в ответах.   -  person baptx    schedule 08.06.2019


Ответы (4)


Вместо -sameq (удалено FFMpeg) используйте -qscale 0 : размер файла увеличится, но качество сохранится.

person A. Attia    schedule 05.01.2018
comment
-qscale или, точнее, -qscale:v, следует использовать только с устаревшим семейством MPEG: mjpeg, mpeg1video, mpeg2video, mpeg4 и т. д. Он игнорируется libx264 и libx265, которые вместо этого используют -crf. - person llogan; 05.01.2018
comment
@LordNeckbeard Подождите, а что, если вы конвертируете из mpeg4 (например, mp4v) в H.264, что включает в себя оба? - person Michael; 20.01.2018
comment
@Michael Формат ввода не имеет значения: важен только кодировщик, используемый для создания вывода. Это связано с тем, что ffmpeg разложит ввод на необработанные форматы независимо от формата ввода. Затем кодировщик преобразует необработанные форматы в выходные данные. (Конечно, если вы не выполняете потоковое копирование с помощью -c copy, тогда повторного кодирования не происходит). - person llogan; 22.01.2018
comment
ffmpeg 4.2.1 выдает желтый цвет Пожалуйста, используйте -q:a или -q:v, -qscale является неоднозначным сообщением при использовании -qscale 0 - person Don Wilson; 12.09.2019

Не используйте -sameq, это не означает "такое же качество"

Эта опция была удалена из FFmpeg некоторое время назад. Это означает, что вы используете устаревшую сборку.

Вместо этого используйте параметр -crf при кодировании с помощью libx264. Это видеокодер H.264, используемый ffmepg, и, если он доступен, он является кодировщиком по умолчанию для вывода MP4. Дополнительную информацию см. в Руководстве по кодированию видео FFmpeg H.264.

Получить последние ffmpeg

Перейдите на страницу скачать FFmpeg и получите там сборку. Есть варианты для Linux, OS X и Windows. Или вы можете следовать одному из руководств по компиляции FFmpeg. Поскольку разработка FFmpeg очень активна, всегда рекомендуется использовать самую новую версию, которую вам удобно использовать.

Вам придется принять некоторую потерю качества

Вы можете создать вывод без потерь с помощью libx264, но это, вероятно, создаст абсолютно огромные файлы и может быть не декодируемым браузером и / или не поддерживаться JW Player (я никогда не пробовал).

Хорошей новостью является то, что вы можете создать видео без визуальных потерь. Опять же, файлы могут быть несколько большими, но вам нужно сделать выбор между качеством и размером файла.

С помощью -crf выберите значение от 18 до примерно 29. Выберите наибольшее число, которое по-прежнему дает приемлемое качество. Используйте это значение для своих видео.

Другие вещи

  • Добавьте -movflags +faststart. Это переместит атом moov из конца файла в начало. Это позволит начать воспроизведение видео, пока оно еще загружается. В противном случае все видео должно быть полностью загружено, прежде чем оно сможет начать воспроизведение.

  • Добавьте -pix_fmt yuv420p. Это обеспечит субдискретизацию цветности, совместимую со всеми игроками. В противном случае ffmpeg по умолчанию и в зависимости от нескольких факторов попытается свести к минимуму или избежать субдискретизации цветности, и результат часто не воспроизводится проигрывателями, не использующими FFmpeg.

person llogan    schedule 29.08.2014
comment
Было бы неплохо уточнить, что такое CRF, что он делает и как использовать этот параметр. CRF расшифровывается как коэффициент постоянной скорости. Цитата из документов ffmpeg: диапазон шкалы CRF составляет 0–51, где 0 — без потерь, 23 — значение по умолчанию, а 51 — наихудшее возможное качество. Более низкое значение обычно приводит к более высокому качеству, и субъективно разумный диапазон составляет 17–28. Считайте 17 или 18 визуально без потерь или почти так. Полезные ссылки: документация по ffmpeg, Общие сведения о режимах контроля скорости - person Alexandr; 08.11.2018
comment
@AlexanderMosov Есть ссылка на вики, которую вы цитировали в моем ответе. - person llogan; 08.11.2018

конвертировать все mkv в mp4 без потери качества (фактически это только перепаковка):

for %a in ("*.mkv") do ffmpeg.exe -i "%a" -vcodec copy -acodec copy -scodec mov_text "%~na.mp4"
person emetrue    schedule 10.01.2015
comment
Для меня простой ffmpeg -i input_file.mkv output_file.mp4 сделал свое дело. - person Thiago Negri; 21.11.2016
comment
Однако @ThiagoNegri все перекодирует; используя «копию», вы потенциально можете избежать этого - person Jan Kyu Peblik; 09.07.2018

Для меня это был лучший способ конвертировать его.

ffmpeg -i {input} -vcodec copy {output}

Я пишу скрипт на python, который добавляет несколько файлов .webm в один .mp4. Мне потребовалось от 10 до 20 секунд, чтобы преобразовать один фрагмент из 5 секунд, используя:

ffmpeg -i {input} -qscale 0 copy {output}

В некоторых папках более 500 чанков.

Теперь на каждый фрагмент уходит меньше секунды. Мне потребовалось 5 минут, чтобы преобразовать видео продолжительностью 1:20:00.

person Jon Martins    schedule 28.07.2020