IP-камера, используя ffmpeg рисунок на экране

Я использую ffmpeg 1.2 для получения видео с ip-камеры. Я рисую его на экране, поэтому мне интересно, есть ли какой-нибудь механизм событий, чтобы узнать, пора ли вызывать av_read_frame?
Если я читаю кадр не так часто, как камера дает кадры, я получаю ошибку сегментации = в некоторых функциях malloc внутри подпрограмм ffmpeg (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

0

Решение

Если вы зависаете на видеоустройстве, вы должны читать кадры, как только они появятся в камере; Вам следует либо запросить у оборудования камеры поддерживаемый FPS, либо получить эту информацию из кодека. Если информация не доступна, вы должны угадать.

Подозрительно, что вы получаете сбой, когда вы не читаете фрейм вовремя; худшее, что должно произойти в этом случае, было бы потерянным кадром.

В зависимости от цветового пространства камеры вам также может потребоваться преобразовать его перед отображением на экране. Я не вижу, как ты это делаешь.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]