Pergunta

Deixe -me começar com um clipe de código:

QByteArray ba;
ba.resize(500000);

int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer());

O que estou fazendo é codificar os dados do quadro e colocar os dados no buffer apontado para o QBYTearray. Se eu comentar a linha AVCODEC_ENCODE_VIDEO, meu vazamento de memória desaparecerá. unownedpointer () se parece com o seguinte:

 if (this->frame != NULL) return this->frame;
    this->frame =  avcodec_alloc_frame();
    uchar *data = this->img.bits();
    frame->data[0] = (uint8_t *)data;
    frame->data[1] = (uint8_t *)data + 1;
    frame->data[2] = (uint8_t *)data + 2;
    frame->linesize[0] = width * lineSize(this->fmt);
    frame->linesize[1] = width * lineSize(this->fmt);
    frame->linesize[2] = width * lineSize(this->fmt);
    return this->frame;

Onde este-> quadro é um avframe *, e este-> img é um QIMAGE.

A uma taxa de codificação de cerca de 30fps, estou recebendo um vazamento de memória de cerca de 50 MB/s. Portanto, não tenho certeza de qual poderia ser o problema. Parece que AVCODEC_ENCODE_VIDEO () está copiando memória e nunca liberando ou algo assim. Alguma ideia?

Se o AVCODEC_ENCODE_VIDEO estivesse convertendo meus dados RGB24 em YUV420P, estaria modificando os dados apontados por frame.unownedPointer ()?

Foi útil?

Solução

Dê uma olhada no código para Qtffmpegwrapper Ele usa um contexto salvo para fazer isso com eficiência, ou você pode simplesmente usar o qtffmpegwrapper diretamente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top