Я заполняю Frame
с изображением BGR для кодирования, и я получаю утечку памяти. Я думаю, что я попал в источник проблемы, но, похоже, это проблема с библиотекой. Поскольку FFmpeg - такая зрелая библиотека, я думаю, что я неправильно ее использую, и мне хотелось бы получить инструкции о том, как это сделать правильно.Правильно распределить и заполнить рамку в FFmpeg
Я отведение Frame
с помощью:
AVFrame *bgrFrame = av_frame_alloc();
А потом я выделяю изображение в Frame
с помощью:
av_image_alloc(bgrFrame->data, bgrFrame->linesize, bgrFrame->width, bgrFrame->height, AV_PIX_FMT_BGR24, 32);
Затем я заполняю изображение выделено с помощью:
av_image_fill_pointers(bgrFrame->data, AV_PIX_FMT_BGR24, bgrFrame->height, originalBGRImage.data, bgrFrame->linesize);
Где originalBGRImage
является OpenCV Mat
.
У этого есть утечка памяти, по-видимому, av_image_alloc()
выделяет память, а av_image_fill_pointers()
также выделяет память на тех же указателях (я вижу bgrFrame->data[0]
, меняя между вызовами).
Если я называю
av_freep(&bgrFrame->data[0]);
После av_image_alloc()
, это нормально, но если я называю это после того, как av_image_fill_pointers()
, происходит сбой программы, даже если bgrFrame->data[0]
не NULL
, который я нахожу очень любопытным.
Looking FFmpeg, av_image_alloc()
source code, я вижу, что вызывает av_image_fill_pointers()
дважды внутри него после того, как выделение буфера buff
.... а потом в av_image_fill_pointers()
source code, data[0]
заменяется указателем изображения, который (я думаю) источник утечка памяти, поскольку data[0]
держал buf
с предыдущего вызова av_image_alloc()
.
Итак, это задает последний вопрос: Каков правильный способ заполнения рамки изображением?.
Поскольку данные уже есть, вы можете использовать 'avpicture_fill', который не выделяется. В любом случае вам следует выделить только один кадр и повторно использовать его. Кроме того, посмотрите, действительно ли вам нужны 'av_freep' или' av_free'. – SpamBot
Но насколько я знаю, мне нужно предоставить кадр для кодирования, как я конвертирую AVPicture в AVFrame? – mFeinstein