Использование libwebp c api для создания анимации, но кодируется только первый кадр - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь закодировать последовательность изображений, созданных в моем коде c ++, в анимированные изображения, чтобы их было проще просматривать. Я выбрал webp и следовал за некоторыми примерами кода из официального документа. Мне не нужно настраивать какие-либо параметры. Пока это анимация, это здорово. Код (https://developers.google.com/speed/webp/docs/container-api) выглядит так:

WebPAnimEncoderOptions enc_options;
WebPAnimEncoderOptionsInit(&enc_options);
// Tune 'enc_options' as needed.
WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
while(<there are more frames>) {
  WebPConfig config;
  WebPConfigInit(&config);
  // Tune 'config' as needed.
  WebPAnimEncoderAdd(enc, frame, timestamp_ms, &config);
}
WebPAnimEncoderAdd(enc, NULL, timestamp_ms, NULL);
WebPAnimEncoderAssemble(enc, webp_data);
WebPAnimEncoderDelete(enc);

Однако, хотя входные кадры перепроверены и отметка времени увеличивается, в моем выходном файле кодируется только первый кадр. Установив

enc_options.verbose = true;

Я вижу, что только при первом запуске WebPAnimEncoderAdd () кодер предупредил меня о преобразовании YUV в rgba с потерями. Я следую неправильному примеру или как?

Очень ценится.

1 Ответ

0 голосов
/ 23 апреля 2019

Вероятно, это и произошло: только впервые WebPAnimEncoderAdd () запустил преобразование из YUV в argb, так что значения rgba остаются постоянными, даже если значения YUV изменяются позже.Чтобы решить эту проблему, я установил

frame.use_argb = true;

перед

WebPPictureAlloc(&frame);

, затем скопировал байты argb для каждого кадра, и теперь он работает.

...