Ip相机使用ffmpeg绘图在屏幕上

时间:2014-03-05 06:09:05

标签: c++ video ffmpeg video-processing ip-camera

我正在使用ffmpeg 1.2从ip camera中获取视频。我在屏幕上画画,所以我想知道是否有一些事件机制来知道是否是时候调用av_read_frame? 如果我读取框架不是那么频繁,相机给出帧我会得到分段错误=在ffmpeg例程中的一些malloc函数(video_get_buffer)

我在屏幕上绘图时也会出现分段错误。

在每0毫秒的渲染函数调用中

void BasicGLPane::DrawNextFrame()
{
int f=1;
while(av_read_frame(pFormatCtx, &packet)>=0)
    {
        // Is this a packet from the video stream?
        if(packet.stream_index==videoStream)
        {


            // Decode video frame
            avcodec_decode_video2(pCodecCtx, pFrame, &FrameFinished,
                                  &packet);

            // Did we get a video frame?
            if(FrameFinished)
            {
                f++;
                this->fram->Clear();
               // if (pFrame->pict_type == AV_PICTURE_TYPE_I) wxMessageBox("I cadr");
                if (pFrame->pict_type != AV_PICTURE_TYPE_I)
                printMVMatrix(f, pFrame, pCodecCtx);
                pFrameRGB->linesize[0]= pCodecCtx->width*3; // in case of rgb4  one plane

                sws_scale(swsContext, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
                //glGenTextures(1, &VideoTexture);
                if ((*current_Vtex)==VideoTexture) current_Vtex = &VideoTexture2;else current_Vtex = &VideoTexture;
                glBindTexture(GL_TEXTURE_2D, (*current_Vtex));
                glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
                glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
                glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
                glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pCodecCtx->width, pCodecCtx->height, GL_RGB, GL_UNSIGNED_BYTE, pFrameRGB->data[0]);
                //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pCodecCtx->width, pCodecCtx->height, 0, GL_RGB, GL_UNSIGNED_BYTE, pFrameRGB->data[0]);
                //glDeleteTextures(1, &VideoTexture);
                GLenum err;
                while ((err = glGetError()) != GL_NO_ERROR)
                {
                    cerr << "OpenGL error: " << err << endl;
                }
              //  av_free(buffer);
            }
        }

        // Free the packet that was allocated by av_read_frame
        av_free_packet(&packet);
        if (f>1) break;
    }

//av_free(pFrameRGB);
}

我在屏幕上看到的图片很奇怪(绿色四边形和红线是这些四边形的运动矢量)

http://i.stack.imgur.com/9HJ9t.png

1 个答案:

答案 0 :(得分:0)

如果你挂在视频设备上,你应该在相机拥有它们后立即阅读它们;您应该查询相机硬件以获得支持的FPS,或者从编解码器获取此信息。如果没有可用的信息,你必须猜测。

当你没有及时阅读框架时,你会发现一个崩溃是可疑的;在这种情况下应该发生的最坏情况将是一个丢失的框架。

根据相机色彩空间的不同,您可能还需要在将其显示在屏幕上之前对其进行转换。我不认为你这样做。