我正在使用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);
}
我在屏幕上看到的图片很奇怪(绿色四边形和红线是这些四边形的运动矢量)
答案 0 :(得分:0)
如果你挂在视频设备上,你应该在相机拥有它们后立即阅读它们;您应该查询相机硬件以获得支持的FPS,或者从编解码器获取此信息。如果没有可用的信息,你必须猜测。
当你没有及时阅读框架时,你会发现一个崩溃是可疑的;在这种情况下应该发生的最坏情况将是一个丢失的框架。
根据相机色彩空间的不同,您可能还需要在将其显示在屏幕上之前对其进行转换。我不认为你这样做。