Ответы пользователя по тегу FFmpeg
  • Какой нужен битрейт для фильма в full hd (h265)?

    nidalee
    @nidalee
    Какой выставлять битрейт при разных разрешениях и кодеках не понимаю.
    CRF 20-22 (больше цифра - меньше файл и хуже качество)
    Влияет ли на выбор кодека наличие HDR?
    На автоматических настройках - нет. В 4К H265 эффективнее.
    Ответ написан
    8 комментариев
  • Как оптимизировать запрос при конвертации dav в mp4?

    nidalee
    @nidalee
    ffmpeg -y -i input-file.dav -codec copy output-file.mp4
    Ответ написан
    Комментировать
  • Какие аргументы ffmpeg использовать, чтобы сконвертировать ЛЮБОЙ видео-формат в mp4?

    nidalee
    @nidalee
    Мое предложение:
    ffmpeg -i файл -c:v libx264 -preset slow -crf 22 -c:a copy результат.mp4

    Можно тоже самое в bat-файл, чтобы название подхватывал:
    @echo off
    :START
    if "%~1" == "" goto END
    ffmpeg -i "%~1" -c:v libx264 -preset slow -crf 22 -c:a copy "%~1".mp4 -y
    shift
    goto START
    :END
    PAUSE
    На этот bat-файл нужное видео нужно просто перетащить. Легко переписывается под ответ Сергей Тихонов
    Вот еще ответ по теме.
    UP: Технически, ffmpeg умеет не все. Файлы r3d он, например, не переварит. Но я не думаю, что вы с ними столкнетесь.
    Ответ написан
    2 комментария
  • Как лучше сжать видео в ffmpeg?

    nidalee
    @nidalee
    Самым безопасным способом будет CRF с ограничением битрейта:
    ffmpeg -i input -c:v libx264 -preset veryslow -crf 23 -maxrate X -bufsize 2M output.mp4

    Где Х - это максимальный битрейт в мегабитах в секунду, например 6M - 6 мегабит в секунду. Теперь считаем наш предел по этим самым мегабитам:
    Битрейт в мегабитах = размер файла в гигабайтах / (количество минут * .0075)

    Для часового файла с лимитом в 1,5 гигабайт это 1,5 / (60*0.0075) = 3,3 мегабита в секунду. Не забудьте, что хотя бы 128 килобит нужно оставить на звук. Их придется вычесть из максимального битрейта для видео. Вот тут есть калькулятор.
    Тогда:
    ffmpeg -i input -c:v libx264 -preset veryslow -crf 23 -maxrate 3M -bufsize 2M -acodec aac -b:a 128k output.mp4

    Это, на самом деле, очень мало, но точно влезет в лимит. Достаточно приличным для большинства файлов битрейтом считаю что-то в районе 10 мегабит в секунду, но на самом деле все зависит от картинки, если много статики, то и 3 может хватить.. Ну и я надеюсь, что файлы у вас все же не часовые. :)

    Тоже самое, но с битрейтом вместо CRF, можно тоже попробовать, и сравнить результаты:
    ffmpeg -i input -vcodec libx264 -preset veryslow -b:v 3M -pass 1 -an -f mp4 NUL
    ffmpeg -i input -vcodec libx264 -preset veryslow -b:v 3M -pass 2 -acodec aac -b:a 128k output.mp4
    Это добро идет двумя последовательными строками в bat-файл, должно выполняться одно за другим.

    Использовать HEVC (H.265), наверное, нецелесообразно для 1080P. Но попробовать можно:
    ffmpeg -i input -c:v libx265 -preset slower -crf 23 -maxrate 3M -bufsize 2M output.mp4


    Если вдруг окажется, что у полученного файла средний битрейт получился ниже лимита, значит он был ограничен целевым качеством CRF. Тогда качество можно повысить, для этого цифру нужно понизить. Например, -crf до 21.
    Ответ написан
    3 комментария
  • FFmpeg - bкак разделить видеофайл на png картинки?

    nidalee
    @nidalee
    Слишком много лишнего указываете. Для ваших целей достаточно
    ffmpeg -i <input> cut_1_images\images%%05d.png
    -f вам не нужен, png - всегда png native.
    -r тоже, потому что ffmpeg сам прекрасно опознает фреймрейт видео.
    Возможно, стоит указать полный путь до папки, с буквы диска. Также хорошо избежать пробелов в этом пути.
    Также не понял, зачем вы опознаете и делаете cd в папку, из который запускаете bat-ник, он и так работает из своей папки, просто не запускайте его от админа, ему это и не нужно.

    Лучше уж тогда сделайте так:
    @echo off
    SETLOCAL
    :hugly
    if "%~1" EQU "" goto mugly
    md images
    ffmpeg -i "%~1" images\images%%05d.png
    shift
    goto hugly
    :mugly
    pause

    Потом просто перетаскиваете на сам bat-ник свой AVI файл, он создаст для кадров папку "images" и в нее их извлечет. Если я нигде в коде не опечатался, конечно. Только не забудьте, что папка всегда одна и та же, переименовывайте ее после извлечения кадров.

    UP: Переписал оба примера под Windows, решением было добавить к % еще один.
    Ответ написан
    4 комментария
  • Можно ли на лету собирать видео из кадров?

    nidalee
    @nidalee
    Для решения такой задачи я использовал бы ramdisk, если объемы памяти позволяют.
    Или вам нужно с одной машины на другую?
    Ответ написан
    Комментировать
  • Как исправить ошибку ffmpeg Permission denied?

    nidalee
    @nidalee
    Ввожу команду

    D:\Program Files\FFmpeg\bin\ffmpeg -i Output video.avi

    Ну тут все просто: вы не разобрались с синтаксисом.
    После -i должен быть указан источник, то есть изображения, в вашем случае указан некий "output" и программа ищет его, файл "output" без расширения, которого в папке нет и в помине.
    После -i вам нужно указать маску имени файла. Для последовательности изображений вида "frame_000.png, frame_001.png, ..." используется маска "frame_%%03d.png". Если не хотите изучать, как корректно собрать маску под ваши файлы, просто переименуйте их под мою. Например, с помощью Advanced Renamer.
    После этого нужно также определиться с частотой кадров видео. Пусть будет 24. Указывается дважды: с помощью -r в конце и -framerate в начале.
    Таким образом, чтобы получить из последовательности изображений mp4 файл в кодеке h264 с частотой кадров 24FPS, нужна следующая команда:
    ffmpeg -framerate 24 -i frame_%%03d.png -c:v libx264 -pix_fmt yuv420p -crf 21 -r 24 video.mp4
    И вызываться она будет из папки output с изображениями. Рядом еще желательно положить сам ffmpeg.exe
    Можете почитать еще это, например.

    Никаких "проблем" с разрешениями или кодом у ffmpeg нет, просто "output" файлом не является и открыт быть не может. В качестве источника ffmpeg принимает только файлы. Не папки.
    Ответ написан
    Комментировать
  • Почему конвертация двух похожих файлов из mp4 в webm дает очень разные результаты?

    nidalee
    @nidalee
    Во-первых, если ваш энкодер умеет CRF, CQP и прочие адаптивные битрейты \ стратегии энкодера, нужно использовать их. О стратегиях энкодера (Encoder Strategy \ Rate Control \ и прочее названия одного и того же) можно почитать здесь.
    Вы не можете знать, какой битрейт нужен каждому отдельному кадру видео, поэтому ваши попытки указать битрейт вручную практически обречены на провал:
    1) Если указанный вами битрейт ниже реально необходимого, вы получите ухудшение качества картинки и артефакты сжатия.
    2) Если указанный вами битрейт выше реально необходимого, то качество видео останется неизменным, но файл будет "весить" больше, чем мог бы.
    Более того, вы указываете битрейт на все видео, в то время как переменный битрейт может быть больше в начале файла (например, где много движения, и требуется больше битрейт), а в конце файла могут быть длинные статичные планы - там битрейт нужен сильно меньше.

    Таким образом, поскольку вы используете VP9 (WEBM), вам следует использовать CRF (Constant Quality):
    To trigger this mode, you must use a combination of -crf and -b:v 0. Note that -b:v MUST be 0. Setting it to anything higher or omitting it entirely will instead invoke the Constrained Quality mode.

    ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 output.webm

    The CRF value can be from 0–63. Lower values mean better quality. Recommended values range from 15–35, with 31 being recommended for 1080p HD video.

    Поэтому все -b:v без CRF сразу выкидывайте.

    Поскольку в задаче не было указано, какой вам нужен размер файла, это самый адекватный подход. Если же вы хотите сжать файл и готовы смириться с потерями качества, нужно использовать Constrained Quality - работает примерно так же, но дополнительно ограничен сверху указанным вами битрейтом:
    ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 2000k output.webm

    The quality is determined by the -crf, and the bitrate limit by the -b:v where the bitrate MUST be non-zero.

    У вас, кроме того, достаточно нескромный для VP9 CRF - 20 - это для 4К без видимых потерь качества. Уверены, что вам нужно такое? Посмотрите гайд от гугла по VP9 - для 1080P они предлагают устанавливать CRF в 31.
    Второй файл с CRF 30 без ограничения битрейтом почти не увеличился. Что по качеству? Просело?

    Я не знаю, какой именно кодек используется в вашем MP4 исходнике, но если это HEVC\H.265, то там можно наколдовать более эффективное и качественное сжатие, особенно если есть много лишнего времени на медленные пресеты или ручной их тюнинг. Такой файл после конвертации в VP9 раздует наверняка.
    Если исходник H264, то он практически всегда должен сжимать хуже VP9, и значит проблема в ваших настройках.

    В общем и целом, при прочих равных, файлы с минимальными изменениями в кадре сжимаются лучше, чем экшн-сцены. То есть если у вас 20 минут абстрактного видео, 2\3 которого - статичное изображение, он будет легче, чем 5 минут абстрактной экшн-сцены.
    Опишите или покажите оба видео, и тогда картина наверняка прояснится.
    Ответ написан
    7 комментариев
  • Как сжимать файл mkv, чтобы передать через сеть?

    nidalee
    @nidalee
    У вас фильм размером 2.7 гигабайт в контейнере mkv. Видео в контейнере, особенно mkv, может быть сжато чуть ли не десятком способов, но главное здесь не это, а то, что для двухчасового фильма 2.7 гигабайт даже мало. Меньше по объему уже идут рипы 720р с сильным сжатием - для телефонов. Может быть вам проще найти их уже сжатыми в таком виде.
    Вам сжимать файлы придется долго, каким-нибудь HEVC с fine tuning, на кодирование которого у вас уйдет больше 10 часов для 2-ух часового фильма, и это без учета времени на эксперименты и определение оптимальных настроек, плюс не факт, что телефон такое потянет. В любом случае, я думаю, что вы пытаетесь сделать уже сделанную кем-то работу - просто поищите рипы небольших размеров и выберите тот, качество в котором вас устраивает.
    Ответ написан
    Комментировать