Created
December 27, 2017 19:06
-
-
Save hasanaga/58b40cb2dc4ff43ac6edcc61773c9d8f to your computer and use it in GitHub Desktop.
Capture frame from RTSP Stream witg FFMPEG Api, OpenCV
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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