方式一:

#include "myplayer.h"
#include <QtWidgets/QApplication>
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avutil.lib")
#pragma comment(lib,"avcodec.lib")
extern "C"{
#include <libavformat/avformat.h>
}
static double r2d(AVRational r){return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;
}
int main(int argc, char *argv[])
{av_register_all();char *path = "test.mp4";AVFormatContext *ac = NULL;int re = avformat_open_input(&ac, path, 0, 0);if (re != 0){//打开文件失败char buf[1024] = { 0 };av_strerror(re, buf, sizeof(buf));printf("file %s open failed because of : %s", path, buf);getchar();return -1;}int totalSec = ac->duration / AV_TIME_BASE;printf("指定的视频文件有 %d分%d秒\n", totalSec / 60, totalSec % 60);int videoStream = 0;AVCodecContext *videoCtx = NULL;for (int i = 0; i < ac->nb_streams; i++){AVCodecContext *enc = ac->streams[i]->codec;if (enc->codec_type == AVMEDIA_TYPE_VIDEO){videoStream = i;videoCtx = enc;AVCodec *codec = avcodec_find_decoder(enc->codec_id);if (!codec){printf("无法解码此视频文件\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("\n");printf("成功打开视频编码流\n");}}AVFrame *yuv = av_frame_alloc();for (;;){AVPacket pkt;re = av_read_frame(ac, &pkt);if (re != 0){break;}if (pkt.stream_index != videoStream){av_packet_unref(&pkt);continue;}int pts = pkt.pts * r2d(ac->streams[pkt.stream_index]->time_base) * 1000;//得到帧的毫秒值//=============================================================================int got_picture = 0;int re = avcodec_decode_video2(videoCtx,yuv,&got_picture,&pkt);if (got_picture){printf("[%d]___", re);}//=============================================================================printf("pts = %d 毫秒\n", pts);av_packet_unref(&pkt);}avformat_close_input(&ac);QApplication a(argc, argv);MyPlayer w;w.show();return a.exec();
}

运行结果:

第二种方式:

#include "myplayer.h"
#include <QtWidgets/QApplication>
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avutil.lib")
#pragma comment(lib,"avcodec.lib")
extern "C"{
#include <libavformat/avformat.h>
}
static double r2d(AVRational r){return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;
}
int main(int argc, char *argv[])
{av_register_all();char *path = "test.mp4";AVFormatContext *ac = NULL;int re = avformat_open_input(&ac, path, 0, 0);if (re != 0){//打开文件失败char buf[1024] = { 0 };av_strerror(re, buf, sizeof(buf));printf("file %s open failed because of : %s", path, buf);getchar();return -1;}int totalSec = ac->duration / AV_TIME_BASE;printf("指定的视频文件有 %d分%d秒\n", totalSec / 60, totalSec % 60);int videoStream = 0;AVCodecContext *videoCtx = NULL;for (int i = 0; i < ac->nb_streams; i++){AVCodecContext *enc = ac->streams[i]->codec;if (enc->codec_type == AVMEDIA_TYPE_VIDEO){videoStream = i;videoCtx = enc;AVCodec *codec = avcodec_find_decoder(enc->codec_id);if (!codec){printf("无法解码此视频文件\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("\n");printf("成功打开视频编码流\n");}}AVFrame *yuv = av_frame_alloc();for (;;){AVPacket pkt;re = av_read_frame(ac, &pkt);if (re != 0){break;}if (pkt.stream_index != videoStream){av_packet_unref(&pkt);continue;}int pts = pkt.pts * r2d(ac->streams[pkt.stream_index]->time_base) * 1000;//得到帧的毫秒值//=============================================================================int re = avcodec_send_packet(videoCtx,&pkt);if (re != 0){av_packet_unref(&pkt);continue;}re = avcodec_receive_frame(videoCtx,yuv);if (re != 0){av_packet_unref(&pkt);continue;}printf("[D]___");//=============================================================================printf("pts = %d 毫秒\n", pts);av_packet_unref(&pkt);}avformat_close_input(&ac);QApplication a(argc, argv);MyPlayer w;w.show();return a.exec();
}

运行结果:

ffmpeg系列之两种视频解码方式相关推荐

  1. 【FFMPEG】H264码流的两种组织方式:AnnexB和AVCC

    H264码流分两种组织方式,一种是AnnexB格式,一种是AVCC格式 AnnexB格式 标准名称是MPEG-2 Tansport Stream Format,适合网络传输 和标准的H264文件格式一 ...

  2. 福光电子蓄电池测试仪软件,福光电子蓄电池容量测试仪IDCE-4815C系列——交直流两种供电方式...

    IDCE-4815C系列蓄电池容量测试仪无线单体监测,超大彩屏显示,交直流两种供电方式 产品特点: 采用蓝牙无线单体监测技术,支持2V/6V/12V单体电压监测. 单体电压采集和记录采用总线数据结构, ...

  3. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  4. asp.net html silverlight 传参数,Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)...

    Silverlight实用窍门系列:37  程兴亮,网名煦风满裳 在本节中将讲述Silverlight和ASP.NET页面的相互传参的两种常用方式:Cookie和QueryString.首先我们新建一 ...

  5. SpringMVC基础学习之Controller的两种实现方式和RequstMapping注解的使用

    前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...

  6. *现在感觉librealsense和realsense-ros的安装挺简单的(普通X86平台)(现在发现都有两种安装方式,下载源码编译或者二进制安装)

    下面说的就是在普通X86平台上,不是在ARM平台,不在树莓派,TX2这些平台上. 之前潜意识里似乎还觉得会比较麻烦,实际我现在真正再看一下,回看一下,不是这样的.可能就像装双系统一样,实际并不麻烦,跟 ...

  7. LoRa终端两种入网方式OTAA与ABP工作原理的区别

    在之前的文章中介绍了"LoRa终端如何以OTAA方式入网TTN服务器",现在为大家介绍LoRa终端两种入网方式OTAA与ABP工作原理的区别,此文来自微信公众号"小七说L ...

  8. C++中的两种绑定方式(静态绑定、动态绑定)

    两种绑定方式 静态绑定:在编译时刻,根据指针或引用变量的静态类型来决定成员函数属于哪一个类. 动态绑定:在运行时刻,根据指针或引用变量实际指向或引用的对象类型(动态类型)来确定成员函数属于哪一个类. ...

  9. (C++)string 的两种输入方式和输出方式

    注:头文件如下 #include<string> #include<cstdio> #include<iostream>using namespace std; 注 ...

  10. 三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.图的遍历.遍历过程中得到的顶点序列称为图遍历序列. 2 深度优先搜索 2.1 算法思想 ...

最新文章

  1. 前端页面——Cookie与Session有什么区别
  2. (转)Properties Editor为你解除通过native2ascii进行Unicode转码的烦恼
  3. 超高损人技巧~~不可不看
  4. scrapy安装出错
  5. java中集合和数据库中_java中list集合的内容,如何使用像数据库中group by形式那样排序...
  6. CocoStudio资源区导入Plist/PSD文件
  7. adb shell 修改文件名_从零开始学Linux运维|27.Shell编程(函数与参数的传递)
  8. mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式
  9. 中科大 计算机网络7 分组延迟 分组丢失 吞吐量
  10. ParaView绘制gprMax正演模拟的波场快照方法(1)
  11. 4.C++深入理解 面向对象部分3
  12. 干电池很不经用,比充电电池差多了
  13. linux 禁 ip 分片,Linux iptables 设置允许(禁止)IP范围
  14. Django框架零基础入门
  15. smartbi服务器缓存文件,Smartbi Config页面介绍 - Smartbi V9 帮助文档
  16. Oracle 启动失败报错“TNS-12555: TNS:permission denied”解决办法
  17. 萤石开放平台-定时获取AccessToken
  18. 南京邮电大学java实验报告_南京邮电大学java第二次实验报告
  19. CAD快速选择相同图形
  20. CNN中的Inductive bias(归纳偏置)

热门文章

  1. linux平台生成awr报告,Linux平台生成awr报告
  2. SQL 列转行和动态用时间生数据列
  3. 美团笔试.最大子段和
  4. mobi电子书如何用Windows电脑阅读?
  5. 两年工作经验,三面拼多多,最终获得offer!(面经总结)
  6. python实战演练二:抓取我自己csdm博客信息的标题和文章链接,并存入文件夹《列表存入数据到txt》
  7. Windows安装numpy详细教程
  8. IDEA汉化包插件无法下载解决办法
  9. PlantUML - 程序员必备绘图工具,不只是UML
  10. 数字滤波器设计之一:巴特沃斯(Butterworth)滤波器