2016-02-02 3 views
1

Я следую примеру FFmpeg для видеозахвата here, но он создает некоторые манекены YUV420P, и у меня есть изображение BGR, уже захваченное с камеры.Заполните данные кадра BGR в FFMPEG

Я не уверен, как использовать frame->data[] и frame->linesize[] для заполнения ими своего BGR-изображения, поэтому я могу кодировать видео H264.


EDIT:

Я следующий код (он вызывается для каждой новой картины камера посылает) после ответа Рональда:

............. 
    AVFrame *bgrFrame = av_frame_alloc(); 

    bgrFrame->width = originalBGRImage.cols; 
    bgrFrame->height = originalBGRImage.rows; 

    ret = av_image_alloc(bgrFrame->data, bgrFrame->linesize, bgrFrame->width, bgrFrame->height, AV_PIX_FMT_BGR24, 32); 

    ///////////////////////////////////// 
    // This works and prevents memory leak....if I remove it, it consumes all the RAM....but I can't free this memory here, since I will use it later... 
    av_freep(&bgrFrame->data[0]); 
    av_frame_free(&bgrFrame); 
    return; 
    ///////////////////////////////////// 

    ret = av_image_fill_pointers(bgrFrame->data, AV_PIX_FMT_BGR24, bgrFrame->height, originalBGRImage.data, bgrFrame->linesize); 

    ///////////////////////////////////// 
    // Here is where I am done using the memory so I will want to free it...but this same code crashes the program. 
    av_freep(&bgrFrame->data[0]); 
    av_frame_free(&bgrFrame); 
    return; 
    ///////////////////////////////////// 

Итак, если я удалить av_freep(&bgrFrame->data[0]); в конце в коде у меня будет утечка памяти ... но оставление там там сбой ... так что это правильный способ освободить используемую память?

ответ

1

Используйте av_image_fill_linesizes() для заполнения линий (если они не набиты, в этом случае вы должны указать их вручную), а затем используйте av_image_fill_pointers() для заполнения указателей данных. Как pix_fmt, используйте AV_PIX_FMT_BGR24.

Теперь, это дает вам изображение BGR24. Вы можете кодировать это как изображение RGB H264 с помощью кодера libx264rgb. Если вы хотите кодировать YUV H264, вам сначала нужно будет преобразовать изображение RGB в YUV, которое вы можете использовать с помощью libswscale. Google «пример libswscale», чтобы найти пример кода о том, как это сделать.

+0

Это просто мое впечатление или будет 'av_image_alloc()' выполнять задание 'av_image_fill_linesizes(), поэтому мне просто нужно вызвать' av_image_fill_linesizes() ', чтобы заполнить данные моей картинкой? – mFeinstein

+0

av_image_alloc сделает это за вас, да. –

+0

И будет 'av_frame_free()' free 'frame-> data []' тоже? Документация кода мне кажется, что да, но будет, но исходный код этого не сделал. Итак, у меня есть \t 'av_freep (& frame-> data [0])' на всякий случай – mFeinstein

Смежные вопросы