读取视频帧

ffmpeg查看信息(使用ffmpeg和QT开发播放器)(1)

打开视频解码器

ffmpeg查看信息(使用ffmpeg和QT开发播放器)(2)

完整main函数

//qt的头文件

#include "xplay.h"

#include <QtWidgets/QApplication>

//c 的头文件

#include <iostream>

using namespace std;

//预处理指令导入库

#pragma comment(lib,"avformat.lib") // 文件格式 依赖库

#pragma comment(lib, "avutil.lib") // 工具类库 获取错误信息的库

#pragma comment(lib, "avcodec.lib") // 编码格式

// 引用c语言的头文件

extern"C" {

#include <libavformat\avformat.h>

}

/***************************************************************

f9 可设置断点

注释:ctrl k c

取消注释:ctrl k u

***************************************************************/

int main(int argc, char *argv[])

{

av_register_all(); //注册所有的格式

char *path = "video.mp4"; //设置路径 这个视频是放在我的bin目录下面的

AVFormatContext *ic = NULL; //存放打开视频或者流的信息

int re = avformat_open_input(&ic, path, 0, 0); //打开文件流

if (re != 0) //打开失败

{

char buf[1024] = { 0 };

av_strerror(re, buf, sizeof(buf)); // 输出错误的信息

printf("open %s failed: %s\n",path, buf );

getchar();

return -1;

}

// 获取视频的时长 单位s

int totalSec = ic->duration / AV_TIME_BASE;

printf("file totleSec is %d-%d\n",totalSec/60, totalSec`);

// 打开视频解码器

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);// 查找解码器 返回的是解码器的id

if (!codec)

{

printf("video code not find!\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;

printf("pts = %lld\n",pkt.pts);// pts 存放的时间戳 来控制进度

av_packet_unref(&pkt);

}

avformat_close_input(&ic); //释放

QApplication a(argc, argv);

Xplay w;

w.show();

return a.exec();

}

,