ffmpeg挂在avcodec_encode_video2中

时间:2016-08-03 05:03:53

标签: c++ qt ffmpeg

我使用ffmeg对视频流进行编码。 Shell QT Creator。 OC Windows 7.编译器MinGW。 H264编解码器。

有一个函数,我给输入框架,我必须返回一个编码的字节数组。在此函数中,它在调用avcodec_encode_video2时挂起,但在第一次调用时不会挂起,并且是随机的。 也就是说,任意编码帧挂起(100到10000)。

QByteArray VideoEncoder::createFrameVideoFromImage(QImage picture)
{
    AVFrame* frame_source = av_frame_alloc();        
    avpicture_fill((AVPicture*)frame_source, picture.bits(), AV_PIX_FMT_RGB24, this->width_frame, this->height_frame);

    AVFrame* frame_dst = av_frame_alloc();

    avpicture_fill((AVPicture*)frame_dst, (uint8_t*)this->inbuffer, AV_PIX_FMT_YUV420P, this->width_frame, this->height_frame);

    sws_scale(this->convert_rgb_yuv, frame_source->data, frame_source->linesize,
        0, this->ctx_codec_in->height, frame_dst->data, frame_dst->linesize);

    AVPacket packet;
    av_init_packet(&packet);
    packet.data = NULL;
    packet.size = 0;
    packet.pts = packet.dts = AV_NOPTS_VALUE;

    int nOutputSize = 0;
    if (avcodec_encode_video2(this->ctx_codec_in, &packet, frame_dst, &nOutputSize) < 0)
    {
        qDebug() << "VideoEncoder error";
    }
    this->traffic += packet.size;

    QByteArray data_frame = QByteArray((char*)packet.data, packet.size);

    av_frame_free(&frame_source);
    av_frame_free(&frame_dst);
    av_free_packet(&packet);

    return data_frame;
}

提前谢谢!

0 个答案:

没有答案