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

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

Я также получаю ошибку сегментации только при рисовании на экране.

В вызове функции Render каждые 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


person user3177342    schedule 05.03.2014    source источник


Ответы (1)


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

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

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

person George Y.    schedule 06.03.2014
comment
первый кадр, который я получаю, хорошего качества и нормальный для просмотра, но затем шаг за шагом картинка трансмутируется в такую ​​странную вещь. Я даже получаю сбой при нулевом ожидании кадра через несколько минут работы программы. - person user3177342; 06.03.2014
comment
Ваша камера работает нормально? Не могли бы вы получить четкое видео хорошего качества, просто используя командную строку ffmpeg? - person George Y.; 06.03.2014
comment
Да, ffplay (ffmpeg(libav) 1.2) показывает мне нормальное видео из этого rtsp-потока. - person user3177342; 06.03.2014
comment
Просто взял камеру h264? и проблем с ним нет, картинка хорошая и без вылетов. Тот же код... - person user3177342; 08.03.2014