Skip to content

Instantly share code, notes, and snippets.

@hasanaga
Created December 27, 2017 19:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hasanaga/58b40cb2dc4ff43ac6edcc61773c9d8f to your computer and use it in GitHub Desktop.
Save hasanaga/58b40cb2dc4ff43ac6edcc61773c9d8f to your computer and use it in GitHub Desktop.
Capture frame from RTSP Stream witg FFMPEG Api, OpenCV
#include <QtCore/QCoreApplication>
#include <QDebug>
#define __STDC_CONSTANT_MACROS
#define __STDC_LIMIT_MACROS
#define UINT64_C
#define WinMain@16
#include "fcntl.h"
int f_desw;
extern "C" {
#include <libavdevice/avdevice.h>
#include <libswscale/swscale.h>
}
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
av_register_all();
avdevice_register_all();
avcodec_register_all();
avformat_network_init();
const char *filenameSrc = "rtsp://172.16.6.18:554";
AVCodecContext *pCodecCtx;
AVFormatContext *pFormatCtx = avformat_alloc_context();
AVCodec * pCodec;
AVFrame *pFrame, *pFrameRGB;
if(avformat_open_input(&pFormatCtx,filenameSrc,NULL,NULL) != 0) return -12;
if(av_find_stream_info(pFormatCtx) < 0) return -13;
av_dump_format(pFormatCtx, 0, filenameSrc, 0);
int videoStream = 1;
for(int i=0; i < pFormatCtx->nb_streams; i++)
{
if(pFormatCtx->streams[i]->codec->coder_type==AVMEDIA_TYPE_VIDEO)
{
videoStream = i;
break;
}
}
if(videoStream == -1) return -14;
pCodecCtx = pFormatCtx->streams[videoStream]->codec;
pCodec =avcodec_find_decoder(pCodecCtx->codec_id);
if(pCodec==NULL) return -15; //codec not found
if(avcodec_open2(pCodecCtx,pCodec,NULL) < 0) return -16;
pFrame = avcodec_alloc_frame();
pFrameRGB = avcodec_alloc_frame();
uint8_t *buffer;
int numBytes;
AVPixelFormat pFormat = AV_PIX_FMT_BGR24;
numBytes = avpicture_get_size(pFormat,pCodecCtx->width,pCodecCtx->height) ; //AV_PIX_FMT_RGB24
buffer = (uint8_t *) av_malloc(numBytes*sizeof(uint8_t));
avpicture_fill((AVPicture *) pFrameRGB,buffer,pFormat,pCodecCtx->width,pCodecCtx->height);
int res;
int frameFinished;
AVPacket packet;
while(res = av_read_frame(pFormatCtx,&packet)>=0)
{
if(packet.stream_index == videoStream){
avcodec_decode_video2(pCodecCtx,pFrame,&frameFinished,&packet);
if(frameFinished){
struct SwsContext * img_convert_ctx;
img_convert_ctx = sws_getCachedContext(NULL,pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL,NULL);
sws_scale(img_convert_ctx, ((AVPicture*)pFrame)->data, ((AVPicture*)pFrame)->linesize, 0, pCodecCtx->height, ((AVPicture *)pFrameRGB)->data, ((AVPicture *)pFrameRGB)->linesize);
cv::Mat img(pFrame->height,pFrame->width,CV_8UC3,pFrameRGB->data[0]); //dst->data[0]);
cv::imshow("display",img);
cvWaitKey(1);
av_free_packet(&packet);
sws_freeContext(img_convert_ctx);
}
}
}
av_free_packet(&packet);
close(f_desw);
avcodec_close(pCodecCtx);
av_free(pFrame);
av_free(pFrameRGB);
avformat_close_input(&pFormatCtx);
return a.exec();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment