1

У меня есть настольное приложение на C #, и я использую ffmpeg как способ «заархивировать» загрузку jpegs на клиентском ПК, загрузить его на свой сервер и разархивировать.

Количество jpegs, чтобы заархивировать в любой 1 раз, изменяется. Это могут быть десятки, это могут быть сотни.

Я использую эти аргументы для сжатия:

 -f image2 -r FPS-i  + MyPath + \img%05d.jpg -crf 23  -y -r FPS + oggOutput

и эти аргументы для распаковки:

-i + MySavedPath + " -qscale 1  + SaveTpPath + \img-%05d.jpg

Варианты, с которыми я могу поэкспериментировать, - это crf и FPS.

Когда я устанавливаю fps равным 10, количество созданных байтов составляет 3630422. Если я установлю FPS на 25, число созданных байтов будет 147892.

Если я установлю FPS на 60, число байтов будет 70023, но качество JPEG очень плохое, я не могу их использовать.

Я намерен поиграть с этими двумя вариантами, чтобы увидеть, что работает для меня, но в случае наличия определенных правил «делай» и «не делай», я бы хотел получить совет.

Я использую расширение ogg для формата видеофайлов, так как это открытый патент.

1 ответ1

3

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

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

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

Относительно вопроса напрямую:
Я подозреваю, что причина, по которой FPS влияет на качество файлов, связана с настройкой битрейта. Битрейт в байтах в секунду, а не в кадре. Вы не указали его (это -b:v), поэтому он будет использовать либо битрейт по умолчанию, либо метод VBR, он кодирует 10 кадров в x байтов, ваш второй пример пытается сжать 25 кадров в то же количество байтов, и в вашем последнем примере он пытается сжать 60 кадров в одинаковое количество байтов, поэтому качество будет обязательно намного ниже.

Относительно оптимизации качества изображения для размера файла при использовании видеокодека: увеличьте битрейт в зависимости от требуемого качества и уменьшите GOP (-g) в зависимости от характера загружаемых файлов. Изменение FPS является довольно окольным способом воздействия на эти два значения, поэтому, если вы просто оставите FPS по умолчанию и настроите эти два других значения, у вас будет гораздо лучший контроль.

Не отвечаю прямо на ваш вопрос:
Вы не получите те же изображения, что и вставленные - сжатие видео не позволяет этого, независимо от того, насколько высок битрейт. Если вы хотите иметь хоть какой-то шанс, вам нужно будет использовать схему сжатия без потерь, и, учитывая, что они уже сжаты в формате JPEG, нормальное сжатие данных, вероятно, будет лучшим выбором, потому что все, что пытается воспринять эти файлы с помощью перцепции, будет пытаться закодировать все Артефакты JPEG («шум»), а также фактическое требуемое изображение. Определенно стоило бы попробовать обычный файл zip (gzip, bzip, 7zip, ...) и посмотреть, сможет ли он получить размер файла, достаточно низкий для ваших требований. Или попробуйте уменьшить качество отдельных файлов (например, Изображение Магия или подобное), а затем застегнуть их.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .