返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >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://lsjlt.com/news/171909.html(转载时请注明来源链接)

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

猜你喜欢
  • 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+
    2024-04-02
  • 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+
    2024-04-02
  • javascript 实例详解循环用法
    闲来无聊,整理了几道有关循环的简单练习题,希望对初学JS的小伙伴有所帮助。 1.打印1-100之间所有7的倍数的个数及总和 var sum=0; var n=0; for(var...
    99+
    2024-04-02
  • python while循环详解
    1.while循环的基础语法 i = 0while i num: print("你猜的大了") else: print("你猜的小了")pr...
    99+
    2023-09-27
    python 开发语言
  • Java for循环详解
    一套完整的嵌入式开发学习路线(高薪就业版),知识全面,思路清晰,猛击这里免费领取! for 语句是应用最广泛、功能最强的一种循环语句。大部分情况下,for 循环可以代替 while 循环、do while 循环。 for 语句是一种在程序...
    99+
    2023-09-04
    java jvm 开发语言
  • 详解python的循环
    目录range函数的使用第一种创建方式第二种创建方式第三种创建方式判断指定的数有没有在当前序列中循环结构总结 range函数的使用 作为循环遍历的对象 第一种创建方式 r=ra...
    99+
    2024-04-02
  • Java基础之代码死循环详解
    目录一、前言二、死循环的危害三、哪些场景会产生死循环?3.1 一般循环遍历3.1.1 条件恒等3.1.2 不正确的continue3.1.3 flag线程间不可见3.2 Iterat...
    99+
    2024-04-02
  • Qt音视频开发之怎么用ffmpeg实现解码本地摄像头
    这篇文章主要介绍了Qt音视频开发之怎么用ffmpeg实现解码本地摄像头的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt音视频开发之怎么用ffmpeg实现解码本地摄像头文章都会有所收获,下面我们一起来看看吧。相...
    99+
    2023-07-05
  • Python+matplotlib实现循环作图的方法详解
    目录一、前言二、实现过程三、总结大家好,我是皮皮。 一、前言 前几天在Python白银交流群【在 途中要勤奋的熏肉肉】问了一道Python可视化处理的问题,如下图所示。 原始代码,...
    99+
    2024-04-02
  • Node.js 事件循环详解及实例
    Node.js 事件循环详解及实例 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,...
    99+
    2022-06-04
    详解 实例 事件
  • shell 循环命令详解
    目录1. for 命令1.1 for 命令的使用1.2 for 命令面临的问题1.3 更改字段分隔符1.4 用通配符读取目录2. c 风格 for 命令3. while 命令4. until 命令5. 控制循环5.1. ...
    99+
    2024-04-02
  • Python循环结构详解
    目录一、内容简介二、while循环三、for循环四、break语句五、continue语句六、break和continue对比七、循环结构总结一、内容简介 使用while循环编写重复...
    99+
    2024-04-02
  • Python 循环结构详解
    目录一、While循环二、While…else…循环三、for循环四、for…else…循环五、循环体结束语句六、嵌套循环前言...
    99+
    2024-04-02
  • 详解JavaScript事件循环
    目录一、事件循环的执行过程二、事件循环进阶用法三、JavaScript任务类型3.1 同步任务&异步任务3.2 宏任务&微任务JavaScript事件循环是一种机制,...
    99+
    2023-05-16
    JavaScript事件循环 JavaScript循环
  • shell 循环命令详解
    目录1. for 命令1.1 for 命令的使用1.2 for 命令面临的问题1.3 更改字段分隔符1.4 用通配符读取目录2. c 风格 for 命令3. while 命令4. u...
    99+
    2022-11-13
    shell 循环命令 shell 命令 shell for 命令 shell break 命令 shell while 命令
  • C++ffmpeg硬件解码的实现方法
    目录什么是硬件解码为什么要使用硬件解码怎样使用硬件解码注意事项关键函数解析什么是硬件解码 普通解码是利用cpu去解码也就是软件解码 硬件解码就是利用gpu去解码 为什么要使用硬件解码...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作