Выходной файл ffmpeg меньше входного файла - PullRequest
0 голосов
/ 03 мая 2020

Я использую ffmpeg для поворота видео на 90 или 180 градусов в сценарии Python. Это прекрасно работает. Но мне любопытно, почему выходной файл будет меньше байтов, чем входной файл.

Вот команды, которые я использую:

180 градусов:

ffmpeg -i ./input.mp4 -preset veryslow -vf "transpose=2,transpose=2,format=yuv420p" -metadata:s:v rotate=0 -codec:v libx264 -codec:a copy ./output.mp4

90 градусов:

ffmpeg -i ./input.mp4 -vf "transpose=2" ./output.mp4

Например, файл GoPro Hero 3 MP4 изначально имел размер 2,0 ГБ. Полученный выходной файл был 480,9 МБ. Другой файл GoPro был 2.0, и его результирующий файл был 671,5 МБ. Возможно, это из-за того, что файлы GoPro были 2.0, но содержат пустое пространство, что-то вроде того, как некоторые файловые системы NTFS создают минимальный файл 4 КБ, даже если в нем меньше байтов?

Если это не GoPro Hero 3, как мне повернуть файлы на 90 или 180 градусов, но убедиться, что размер выходного файла такой же? Или ожидается потеря данных? Потеря данных связана с форматом?

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

У меня была одна и та же проблема с вращением ...

Я исправил ее, "сбросив" вращение вместо ...

ffmpeg ...... -metadata:s:v rotate="0" ......
0 голосов
/ 03 мая 2020

Битрейт игнорируется с самого начала

ffmpeg полностью декодирует вход в несжатое необработанное видео и аудио (кроме случаев, когда потоковое копирование - подробнее об этом ниже). Формат ввода или битрейт не имеет значения: он делает это для всех форматов. Затем кодер работает из этих необработанных, декодированных кадров. См. диаграмму .

H.264 против H.264

Ваш вход и выход оба H.264. Формат, такой как H.264, создается кодером. Любой может сделать кодировщик. Однако не все кодеры равны . При одинаковом входе выход из одного кодера H.264 может иметь то же качество, что и выход из другого кодера H.264, но битрейт может быть в несколько раз меньше.

Кодер GoPro H.264 был сделано для работы на платформе с ограниченным аппаратным обеспечением. Это означает, что битрейт (размер файла) приносится в жертву скорости и качеству. x264 - лучший кодер H.264: ничто не может сравниться с его отношением качества к битрейту.

Поворот без перекодирования

Вы можете потоковое копирование (повторно mux) и вращаться одновременно. Поворот обрабатывается метаданными / побочными данными:

ffmpeg -i input.mp4 -metadata:s:v rotate=90 -c copy output.mp4

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

...