#include "firstqt.h"
#include <QtWidgets/QApplication>
extern "C"{
#include <libavcodec\avcodec.h>
#include <libavformat\avformat.h>
}
static double r2d(AVRational r)
{
return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;
}
//char *path = "Debug/test.mp4";
int main(int argc, char *argv[])
{
av_register_all();
char *path = "Debug/test.mp4";
AVFormatContext *ic = NULL;
//打开文件
int re = avformat_open_input(&ic,path,0,0);
//打开出错
if (re!=0)
{
char buf[102] = {0};
av_strerror(re,buf,sizeof(buf));
printf("open %s failed:%s\n",path,buf);
getchar();
return -1;
}
int totalSec = ic->duration / AV_TIME_BASE;
printf("file totalSec is %d\n",totalSec/60,totalSec%60);
int videoStream = 0;
//打开视频解码器
for (int i = 0; i < ic->nb_streams;i++)
{
AVCodecContext *enc = ic->streams[i]->codec;
if (enc->codec_type==AVMEDIA_TYPE_VIDEO)
{
videoStream = i;
AVCodec *codec = avcodec_find_decoder(enc->codec_id);
if (!codec)
{
printf("video code not find1\n");
return -1;
}
int err = avcodec_open2(enc,codec,NULL);
if (err!=0)
{
char buf[1024] = { 0 };
av_strerror(err,buf,sizeof(buf));
printf(buf);
return -2;
}
printf("open codec success!\n");
}
}
//读取视频帧
for (;;)
{
AVPacket pkt;
re = av_read_frame(ic,&pkt);
if (re!=0)
{
break;
}
int pts = pkt.pts * r2d(ic->streams[pkt.stream_index]->time_base) * 1000;
printf("pts=%d\n",pts);
av_packet_unref(&pkt);//释放空间
}
//关闭文件流
avformat_close_input(&ic);
QApplication a(argc, argv);
FirstQt w;
w.show();
return a.exec();
}