广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt+FFMPEG实现循环解码详解
  • 767
分享到

Qt+FFMPEG实现循环解码详解

Qt FFMPEG解码Qt 解码 2022-11-13 14:11:09 767人浏览 泡泡鱼
摘要

目录一、结果二、解码准备工作+循环解码相关操作videodecode.h .cppmain.cpp一、结果 可以设置延时函数-----遍历每一帧的信息进行打印 25(fps)*

一、结果

可以设置延时函数-----遍历每一帧的信息进行打印

25(fps)*30(秒)=750帧

二、解码准备工作+循环解码相关操作

videodecode.h .cpp

#ifndef VIDEODECODE_H
#define VIDEODECODE_H
 
#include <QObject>
 
//当前c++兼容C语言
extern "C"
{
//avcodec:编解码(最重要的库)
#include <libavcodec/avcodec.h>
//avfORMat:封装格式处理
#include <libavformat/avformat.h>
//swscale:视频像素数据格式转换
#include <libswscale/swscale.h>
//avdevice:各种设备的输入输出
#include <libavdevice/avdevice.h>
//avutil:工具库(大部分库都需要这个库的支持)
#include <libavutil/avutil.h>
}
 
class videoDecode : public QObject
{
    Q_OBJECT
public:
    explicit videoDecode(QObject *parent = 0);
 
     //视频文件上下文格式
     AVFormatContext* avformat_context;
     //编解码器上下文格式
     AVCodecContext* avcodec_context;
     //解码器上下文格式
     AVCodec* avcodec;
 
 
 
signals:
 
public slots:
};
 
#endif // VIDEODECODE_H
#include "videodecode.h"
#include<QDebug>
#include<QCoreApplication>
#include<Qthread>
 
//解码初始化操作
//1.注册所有组件
//2.打开视频输入文件
//3.查找视频流信息
//4.查找解码器
//5.打开解码器
 
videoDecode::videoDecode(QObject *parent) : QObject(parent)
{
    qDebug()<<"1.注册所有组件";
    av_reGISter_all();
 
    qDebug()<<"2.打开视频输入文件";
    QString filename = QCoreApplication::applicationDirPath();
    qDebug()<<"获取程序运行目录 "<<filename;
    QString cinputFilePath = "test.avi";  //本地视频文件放入程序运行目录
    avformat_context = avformat_alloc_context();
    //参数一:封装格式上下文->AVFormatContext->包含了视频信息(视频格式、大小等等...)
    //参数二:打开文件(入口文件)->url
    int avformat_open_result = avformat_open_input(&avformat_context,cinputFilePath.toStdString().c_str(),NULL,NULL);
    if (avformat_open_result != 0)
    {
        //获取异常信息
        char* error_info = new char[32];
        av_strerror(avformat_open_result, error_info, 1024);
        qDebug()<<QString("异常信息 %1").arg(error_info);
 
    };
 
    qDebug()<<"3.查找视频流信息";
    //参数一:封装格式上下文->AVFormatContext
    //参数二:配置
    //返回值:0>=返回OK,否则失败
    int avformat_find_stream_info_result = avformat_find_stream_info(avformat_context, NULL);
    if (avformat_find_stream_info_result < 0){
        //获取失败
        char* error_info = new char[32];
        av_strerror(avformat_find_stream_info_result, error_info, 1024);
        qDebug()<<QString("异常信息 %1").arg(error_info);
    }
 
    qDebug()<<"4.查找解码器";
    //第一点:获取当前解码器是属于什么类型解码器->找到了视频流
    //音频解码器、视频解码器、字幕解码器等等...
    //获取视频解码器流引用
    int av_stream_index = -1;
    for (int i = 0; i < avformat_context->nb_streams; ++i) {
        //循环遍历每一流
        //视频流、音频流、字幕流等等...
        if (avformat_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){
            //找到了
            av_stream_index = i;
            break;
        }
    }
    if (av_stream_index == -1)
    {
        qDebug()<<QString("没有找到视频流");
    }
    //第二点:根据视频流->查找到视频解码器上下文->视频压缩数据
    //编解码器上下文
    avcodec_context = avformat_context->streams[av_stream_index]->codec;
 
    //第三点:根据解码器上下文->获取解码器ID
    avcodec = avcodec_find_decoder(avcodec_context->codec_id);
    if (avcodec == NULL)
    {
        qDebug()<<QString("没有找到视频解码器");
    }
 
    qDebug()<<"5.打开解码器";
    int avcodec_open2_result = avcodec_open2(avcodec_context,avcodec,NULL);
    if (avcodec_open2_result != 0)
    {
        char* error_info = new char[32];
        av_strerror(avformat_find_stream_info_result, error_info, 1024);
        qDebug()<<QString("异常信息 %1").arg(error_info);
    }
 
    qDebug()<<"视频详细信息输出";
    //此函数自动打印输入或输出的详细信息
    av_dump_format(avformat_context, 0, cinputFilePath.toStdString().c_str(), 0);
    qDebug()<<"----------------解码准备工作完成-----------------";
    qDebug()<<"----------------开始循环解码操作-----------------";
 
    qDebug()<<"6.循环解码";
 
    //读取帧数据换成到哪里->缓存到packet里面
    AVPacket* av_packet = (AVPacket*)av_malloc(sizeof(AVPacket));
    //解码的状态类型(0:表示解码完毕,非0:表示正在解码)
    int current_frame_index = 0;
 
    //>=0:说明有数据,继续读取   <0:说明读取完毕,结束
    //从视频文件上下文中读取包--- 有数据就一直读取
    while (av_read_frame(avformat_context,av_packet) >= 0)
    {
        //解码什么类型流(视频流、音频流、字幕流等等...)
        if (av_packet->stream_index == av_stream_index)
        {
                //遍历每一帧的信息进行打印
                current_frame_index++;
                //延时操作  1秒显示25帧--1000/25=40
                QThread::msleep(40);
                qDebug()<<QString("当前遍历第 %1 帧").arg(current_frame_index);
        }
    }
 
    qDebug()<<"7.关闭所有解码组件";
    av_packet_free(&av_packet);
    //关闭流
    avcodec_close(avcodec_context);
    avformat_free_context(avformat_context);
}

main.cpp

#include "widget.h"
#include <QApplication>
#include"indexwin.h"
#include<QGraphicsItem>    //图元
#include<QGraphiCSScene>   //场景
#include<QGraphicsView>    //视图
#include<QTransform>       //变换
#include<QDebug>
#include"myview.h"
#include <QWidget>
#include"usersdata.h"
#include"registerwin.h"
#include"sqlite3.h"
#include"Mysqlite.h"//数据库类
#include"videodecode.h"
 
 
//当前C++兼容C语言
extern "C"
{
//avcodec:编解码(最重要的库)
#include <libavcodec/avcodec.h>
//avformat:封装格式处理
#include <libavformat/avformat.h>
//swscale:视频像素数据格式转换
#include <libswscale/swscale.h>
//avdevice:各种设备的输入输出
#include <libavdevice/avdevice.h>
//avutil:工具库(大部分库都需要这个库的支持)
#include <libavutil/avutil.h>
}
 
int main(int arGC, char *argv[])
{
    QApplication a(argc, argv);
 
    qDebug()<<"sqlite3版本"<<sqlite3_libversion();
 
    qDebug("------------------------------------------------------------------------");
    qDebug("%s", avcodec_configuration());
    qDebug("version: %d", avcodec_version());
    qDebug("------------------------------------------------------------------------");
 
    mysqlite::getInstance("app.db");//创建数据库
    mySqlite::createUserTable("user");//创建用户表
 
    videoDecode *p = new videoDecode;
 
    //开机动画
    myView kaiji;//对象创建
    kaiji.show();//调用方法
 
    return a.exec();
}

到此这篇关于Qt+FFmpeg实现循环解码详解的文章就介绍到这了,更多相关Qt FFMPEG解码内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Qt+FFMPEG实现循环解码详解

本文链接: https://www.lsjlt.com/news/171909.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt+FFMPEG实现循环解码详解
    目录一、结果二、解码准备工作+循环解码相关操作videodecode.h .cppmain.cpp一、结果 可以设置延时函数-----遍历每一帧的信息进行打印 25(fps)*...
    99+
    2022-11-13
    Qt FFMPEG解码 Qt 解码
  • QT+ffmpeg实现视频解析的示例详解
    目录一、创建QT项目二、引入ffmpeg1、复制头文件和lib2、复制bin文件3、简单测试三、视频解析1、创建线程2、创建自定义绘制控件3、使用自定义控件4、开启线程,进行视频解析...
    99+
    2022-11-13
  • Python for循环详解【附代码实例】
    文章目录 一、for循环二、for循环语法如下三、 for循环应用案例案例一:for循环实现方式案例二:遍历字典案例三:for循环嵌套 四、总结for循环与while循环的异同五、for...
    99+
    2023-09-25
    python 服务器 linux
  • Python循环语句代码详解
    本篇内容介绍了“Python循环语句代码详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!.1 while循环循环语句是程序设计中常用的语句...
    99+
    2023-06-15
  • Qt音视频开发之利用ffmpeg实现解码本地摄像头
    目录一、前言二、效果图三、体验地址四、相关代码五、功能特点5.1 基础功能5.2 特色功能5.3 视频控件一、前言 一开始用ffmpeg做的是视频流的解析,后面增加了本地视频文件的支...
    99+
    2023-03-24
    Qt ffmpeg解码本地摄像头 Qt解码本地摄像头 Qt ffmpeg摄像头 Qt ffmpeg
  • QT实现贪吃蛇游戏代码详解
    目录一、新建一个Qt项目二、添加要用到的头文件三、写类声明信息四、对类函数的实现构造函数界面刷新随机奖励的生成移动绘图按键事件判断蛇身是否相撞五、结束一、新建一个Qt项目 新建Qt ...
    99+
    2022-11-12
  • javascript 实例详解循环用法
    闲来无聊,整理了几道有关循环的简单练习题,希望对初学JS的小伙伴有所帮助。 1.打印1-100之间所有7的倍数的个数及总和 var sum=0; var n=0; for(var...
    99+
    2022-11-12
  • Java基础之代码死循环详解
    目录一、前言二、死循环的危害三、哪些场景会产生死循环?3.1 一般循环遍历3.1.1 条件恒等3.1.2 不正确的continue3.1.3 flag线程间不可见3.2 Iterat...
    99+
    2022-11-12
  • Qt音视频开发之怎么用ffmpeg实现解码本地摄像头
    这篇文章主要介绍了Qt音视频开发之怎么用ffmpeg实现解码本地摄像头的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt音视频开发之怎么用ffmpeg实现解码本地摄像头文章都会有所收获,下面我们一起来看看吧。相...
    99+
    2023-07-05
  • Python+matplotlib实现循环作图的方法详解
    目录一、前言二、实现过程三、总结大家好,我是皮皮。 一、前言 前几天在Python白银交流群【在 途中要勤奋的熏肉肉】问了一道Python可视化处理的问题,如下图所示。 原始代码,...
    99+
    2022-11-11
  • Node.js 事件循环详解及实例
    Node.js 事件循环详解及实例 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,...
    99+
    2022-06-04
    详解 实例 事件
  • Python循环语句代码详解:while、for、break
    目录 1 while循环   1 while循环 循环语句是程序设计中常用的语句之一。任何编程语言都有while循环,Python也不例外。while循环的格式如下所示。  while(表达式):       …   else: ...
    99+
    2023-09-20
    python 开发语言
  • 详解QT媒体播放器代码案例实现
    QT媒体播放器代码案例实现涉及以下几个方面:1. 界面设计:使用QT的UI设计器设计播放器界面,包括播放/暂停按钮、进度条、音量控制...
    99+
    2023-09-22
    QT
  • C++ffmpeg硬件解码的实现方法
    目录什么是硬件解码为什么要使用硬件解码怎样使用硬件解码注意事项关键函数解析什么是硬件解码 普通解码是利用cpu去解码也就是软件解码 硬件解码就是利用gpu去解码 为什么要使用硬件解码...
    99+
    2022-11-13
  • Linux shell数组循环的实例详解
    shell数组循环 测试shell数组,循环的例子: arr=("a" "b" "c") echo "所有的内容如下:"${arr[@]} echo "数组的长度:"${#arr[*...
    99+
    2022-06-04
    数组 详解 实例
  • python双向循环链表实例详解
    使用python实现双向循环链表,供大家参考,具体内容如下 双向循环链表: 将所有的数据存放到节点中,每一个节点相连接,首尾链接,每一个节点中有一个数据存储区,和两个链接区,一个链接...
    99+
    2022-11-11
  • python单向循环链表实例详解
    使用python实现单向循环链表,供大家参考,具体内容如下 单向循环链表 将所有的链接在一起,每一个节点分为数据存储区和链接区,数据区存储数据,链接区链接下一个节点 item: 存储...
    99+
    2022-11-11
  • 6个实例,8段代码,详解 Python 中的 For 循环
    Python 支持for循环,它的语法与其他语言(如JavaScript 或Java)稍有不同。下面的代码块演示如何在Python中使用for循环来遍历列表中的元素:上述的代码段是将三个字母分行打印的。你可以通过在print语句的后面添加逗...
    99+
    2023-05-14
    Python for 循环
  • Qt+OpenCV实现目标检测详解
    目录一、创建项目&UI设计二、代码与演示演示效果拓展阅读一、创建项目&UI设计 创建项目,UI设计如下 文件类型判断 简单的判断文件类型 QString file(...
    99+
    2022-11-13
  • JavaScript实现异步任务循环顺序执行详解
    目录一、错误的实现简单的错误实现使用 Promise.all 的错误实现二、正确的实现需求场景:数组的元素作为异步任务的参数,循环遍历该数组,并执行异步任务。 一、错误的实现 简单的...
    99+
    2023-03-19
    JavaScript异步任务循环顺序执行 JavaScript异步任务执行 JavaScript异步任务
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作