FFmpeg: Как получить кадры, уменьшающиеся в размере - PullRequest
0 голосов
/ 16 января 2019

Я кодирую кадры, используя следующую конфигурацию кодера:

codecContext = avcodec_alloc_context3(encoderH264);
codecContext->width = width;
codecContext->height = height;
codecContext->pix_fmt = AV_PIX_FMT_YUV420P;
codecContext->time_base.num = 1;
codecContext->time_base.den = 1;
codecContext->has_b_frames = false;
av_opt_set(codecContext->priv_data, "preset", "medium", 0);
av_opt_set(codecContext->priv_data, "tune", "zerolatency", 0);
av_opt_set(codecContext->priv_data, "crf", "30", 0);  

Создает правильный кодер, который работает. Что меня беспокоит, так это то, что размер последовательных кадров не всегда уменьшается. Я хотел бы иметь кодировщик FFmpeg, который в первом кадре выдает изображение, скажем, 0,5 МБ, затем 0,05 МБ, затем кадры, имеющие 0,01 МБ. Мой аппаратный кодировщик NVIDIA делает именно это. Но приведенный выше конфиг FFmpeg дает мне такие кадры в начале:

1556

200

225

238

238

238

238

828745

216

352

714

1129

Размеры меняются немного позже, пока все не установятся в 242 байта. Есть ли способ сделать кодировщик примерно таким:

100000

20000

1000

50

50

50

...

1 Ответ

0 голосов
/ 16 января 2019

Размер кадра во многом определяется типом кадра и сложностью кадра. Например, I-кадры почти всегда будут больше, чем B / P-кадры, которые следуют, потому что I-кадры кодируют полное изображение, в то время как другие кадры только кодируют изменения в этом изображении. Большинство кодеков периодически вставляют I-кадры, так что вы можете искать в файле без необходимости загружать и / или декодировать все это. Во-вторых, существует понятие плотности информации (читайте о теории информации), согласно которому данные и информация не совпадают. Например, данные «aaaaaaaaaa» содержат «ax10». Я могу написать это более компактно. но «hebphwhcqo» сложно представить короче. Следовательно, кадр с небольшим количеством информации (весь черный) будет меньше, чем кадр с большим количеством информации, например, изображение фейерверка.

И чтобы ответить на ваш вопрос: то, что вы просите, не вещь. Если вы кодируете неподвижное изображение, оно МОЖЕТ работать таким образом, если вы отключите обнаружение смены сцены и периодические I-кадры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...