Получение несоответствия цвета при преобразовании необработанных данных NV12 в H264 с использованием FFMPEG

Я пытаюсь преобразовать необработанные данные NV12 в H264, используя аппаратный кодировщик FFMPEG.

для передачи необработанных данных кодировщику я передаю структуру AVFrame, используя следующую логику:

    uint8_t * buf;
    buf = (uint8_t *)dequeue();
    frame->data[0] = buf;
    frame->data[1] = buf + size;
    frame->data[2] = buf + size;
    frame->pts = frameCount;
    frameCount++;

но, используя эту логику, я получаю данные H264, не соответствующие цвету,

Может кто-нибудь сказать мне, как передать буфер в данные AVFrame?

Заранее спасибо, Харшил


person Harshil Makwana    schedule 28.01.2019    source источник
comment
Обратите внимание, что я передаю правильные данные NV12 в buf   -  person Harshil Makwana    schedule 28.01.2019
comment
Догадка: должно ли frame->data[2] = buf + size быть frame->data[2] = buf + 2*size?   -  person Weather Vane    schedule 28.01.2019
comment
@WeatherVane Я не думаю, что это buf + 2 * размер, потому что плоскость v находится в положении buf + size в формате NV12.   -  person Harshil Makwana    schedule 29.01.2019
comment
@WeatherVane Я попытался с вашим предложением получить ту же проблему, пожалуйста, дайте мне другие альтернативы.   -  person Harshil Makwana    schedule 29.01.2019


Ответы (1)


Я решил проблему несоответствия цвета, передав правильный размер строки и значение данных структуры AVFrame.

Допустим, у NV12 есть плоскость YYYYUVUV для изображения 4x4, тогда в ffmpeg нам нужно передать

linesize[0] = начальное местоположение y

linesize[1] = 4, потому что расположение u начинается с 4, и нам не нужно указывать linesize[2], потому что uv упакованы.

а также в случае данных

data[0] = начальное местоположение y

данные[1] = 4

person Harshil Makwana    schedule 29.01.2019