FFmpeg编解码的那些事(2)

软解码

1.构建输入AVFormatContext

    AVFormatContext* avFormatContext = avformat_alloc_context();int res = avformat_open_input(&avFormatContext,filename.toUtf8().data(), NULL, NULL);//打开文件if (res < 0) {qCritical()<<__FUNCTION__<<__LINE__<<"error "<<res<<"in avformat_open_input";return res;}

2.查找视频信息流

    res = avformat_find_stream_info(avFormatContext, nullptr);//取出流信息if (res < 0){return res;}//查找视频流和音频流av_dump_format(avFormatContext, 0,filename.toUtf8().data(), 0);//列出输入文件的相关流信息for (unsigned int i = 0; i < avFormatContext->nb_streams; i++){if (avFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){if(video_index==-1){video_index = i;}}}m_width   = avFormatContext->streams[video_index]->codec->width;m_height  = avFormatContext->streams[video_index]->codec->height;

3.初始化软解码

    AVCodecContext *avCodecContext = avFormatContext->streams[video_index]->codec;AVCodec* m_codec = avcodec_find_decoder(avCodecContext->codec_id);if (avcodec_open2(avCodecContext, m_codec, NULL) < 0){return false;}

4.初始化SwsContext图像转换上下文

    img_convert_ctx = sws_getContext(m_width,m_height,avCodecContext->pix_fmt,m_width,m_height,AV_PIX_FMT_BGRA,SWS_BICUBIC,NULL, NULL, NULL);

5.循环读取数据

    while (true){int ret = av_read_frame(avFormatContext, avPacket);if (ret < 0){qDebug()<< "read end";break;}else if (avPacket->stream_index == video_index){decode_to_photo(avPacket);}av_packet_unref(avPacket);}void decode_to_photo(const AVPacket *avPacket)
{int ret = avcodec_send_packet(avCodecContext, avPacket);if (ret < 0) {char error[1024];av_strerror(ret, error, 1024);qDebug() << "发送解码失败:" << error;}while (true){ret = avcodec_receive_frame(avCodecContext, avFrame);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){//qDebug() << "avcodec_receive_frame end:" << ret;break;}else if (ret < 0){//qDebug()<< "获取解码数据失败"<<ret;return;}else{QImage pixLogo2;int m_rotat = getRotateAngle(avFormatContext->streams[video_index]);if(dec_st == AV_SOFTWARE_DECODER){sws_scale(img_convert_ctx,(const unsigned char* const*)avFrame->data,avFrame->linesize, 0,avFrame->height,bgrFrame->data,bgrFrame->linesize);QImage pixLogo(bgrFrame->data[0],bgrFrame->width,bgrFrame->height,bgrFrame->width * 4, QImage::Format_ARGB32);QMatrix matrix;matrix.rotate(m_rotat);pixLogo2 = pixLogo.transformed(matrix,Qt::FastTransformation);/*这里可以进行必要的图片处理操作*/}curcount++;av_frame_unref(sw_frame);av_frame_unref(avFrame);}}
}

tips:

根据pts来计算一桢在整个视频中的时间位置

timestamp(秒) = pts * av_q2d(st->time_base) 
timestamp(毫秒) = pts * av_q2d(st->time_base) * 1000 

计算视频长度的方法

time(秒) = st->duration * av_q2d(st->time_base)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【文末附gpt升级秘笈】Suno全新功能在音乐创作领域的应用与影响

Suno全新功能在音乐创作领域的应用与影响 摘要&#xff1a; 随着科技的飞速发展&#xff0c;人工智能与音乐创作的结合日益紧密。本文旨在探讨Suno全新功能——即兴哼唱创作与声音模仿——在音乐创作领域的应用与影响。通过深入分析这一技术的原理、特点及其在音乐创作中的实际…

nvm for wins下载地方

https://github.com/coreybutler/nvm-windows

十大排序算法之->快速排序

一、快速排序简介 快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;它的基本思想是采用分治法来实现排序。 快速排序的工作原理基于分治的思想。首先选取一个基准元素&#xff0c;通常选择第一个或最后一个元素。然后重新排列数组中的元素&#…

什么是低代码?有什么特点?

低代码是一种高效的软件开发方法&#xff0c;它允许开发者通过图形化界面和预构建的代码块&#xff0c;以最小化传统手写代码的方式快速构建应用程序。这种方法旨在加速应用程序的开发周期&#xff0c;同时降低技术门槛和成本。以下是根据驰骋低代码设计者的观念与主张&#xf…

单个反光柱作为landmark,因输入角度异常导致ceres后端崩溃

landmark默认是有方向的,所以作者在ceres优化中考虑到了角度信息,但是单个反光柱作为路标是没有准确的角度信息的,所以只能优化位置信息,修改代码如下: template <typename T>bool operator()(const T* const prev_node_pose, const T* const next_node_pose,const …

从零入手人工智能(1)——卷积神经网络

1.前言 本人作为一名单片机工程师&#xff0c;近期对人工智能领域产生了浓厚的兴趣&#xff0c;并开始了我的探索之旅。人工智能是一个博大精深的领域&#xff0c;我相信有许多志同道合的朋友也希望涉足这个领域&#xff0c;因此我写下这篇文章&#xff0c;旨在详细记录我学习…

操作系统微助教题库(组卷)

概论 1. 操作系统是对 ( ) 进行管理的软件 A. 软件 B. 硬件 C. 计算机资源 D. 应用程序 2. 从用户的观点看&#xff0c;操作系统是&#xff08; &#xff09; A. 用户与计算机之间的接口 B. 控制和管理计算机资源的软件 C. 合理的组织计算机工作流程的软件 D. 由若干…

Java:流程控制语句

文章目录 一、顺序结构二、分支结构2.1 if2.2 switch 三、循环结构3.1 for3.2 while3.3 do...while 四、流程控制4.1 break4.2 continue 五、结语 一、顺序结构 顺序结构语句是Java程序默认的执行流程&#xff0c;按照代码的先后顺序&#xff0c;从上到下依次执行。 二、分支结…

雷士大路灯有必要买吗?雷士、书客、孩视宝护眼落地灯实测PK!

面对市面上众多的护眼大路灯品牌&#xff0c;其中雷士、书客和孩视宝这几款大路灯受到了广泛的青睐&#xff0c;也是热度比较高的几款产品&#xff0c;正是因为这么多款大路灯&#xff0c;很多伙伴在看到文章推荐后很纠结&#xff0c;不知道如何选择&#xff0c;也有一部分伙伴…

TH方程学习 (7)

一、内容介绍 TH存在广泛应用&#xff0c;在下面案例中&#xff0c;将介绍几种相对运动模型&#xff0c;斜滑接近模型&#xff0c;本节学习斜滑接近制导方法能够对接近时间、接近方向以及自主接近过程的相对速度进行控制。施加脉冲时刻追踪器的位置连线可构成一条直线&#xf…

自动装车系统车辆定位-激光雷达解决方案

在自动装车系统中&#xff0c;激光雷达为车辆定位提供了一种高效且精确的解决方案。以下是关于这一解决方案的详细分析&#xff1a; 一、解决方案概述 激光雷达解决方案在自动装车系统中&#xff0c;通过发射激光束并接收目标反射回来的信号&#xff0c;来探测车辆的位置、状…

Win10下CodeBlock实现socket TCP server/client

文章目录 1 安装codeblock2 适配libws2_32.a库3 TCP socket工作原理4 代码实现服务端客户端5 运行效果1 安装codeblock 官方免费下载 值得一提的是,安装时,指定安装路径,其他默认安装即可 2 适配libws2_32.a库 默认安装,只有3个库,如果编译socket,需要专门的库libws2…

前端小程序面试真题

1. 简单描述下微信小程序的相关文件类型 微信小程序项目结构主要有四个文件类型 WXML&#xff08;WeiXin Markup Language&#xff09;是框架设计的一套标签语言&#xff0c;结合基础组件、事件系统&#xff0c;可以构建出页面的结构。内部主要是微信自己定义的一套组件WXSS …

CA到TA的调用流程是什么?如何实现的?

快速链接: . &#x1f449;&#x1f449;&#x1f449;Trustzone/TEE/安全 面试100问-目录 &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】:联系方式-加入交流群 ----联系方式-加入交流群 个人博客笔记导读目录(全部) 简单一点来说&#xff0c;CA…

【机器学习基础】Python编程02:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

微信小程序能唤起APP吗?封装唤起APP组件

微信小程序能唤起APP吗&#xff1f;首先回答&#xff1a;可以的&#xff0c;但是受限使用场景。 实现方式 微信没有提供API&#xff0c;通过button中open-type设置为launchApp来实现跳转APP。 它可以传递的参数&#xff1a; 可以通过app-parameter属性设定向APP传的参数&…

SolidWorks价格与其它CAD软件相比:为什么选择SolidWorks更划算

在CAD软件的浩瀚星海中&#xff0c;SolidWorks如同一颗璀璨的明星&#xff0c;以其卓越的性能、广泛的适用性和合理的定价策略&#xff0c;赢得了全球众多工程师和设计师的青睐。亿达四方&#xff0c;作为官方授权的SolidWorks代理商&#xff0c;今天将带您深入价格与功能的比较…

银河麒麟安装nginx

参考&#xff1a; https://zhuanlan.zhihu.com/p/699896814 yum install nginx systemctl start nginx firewall-cmd --permanent --zonepublic --add-servicehttp firewall-cmd --permanent --zonepublic --add-servicehttps sudo firewall-cmd --reload systemctl enable n…

【成品设计】基于单片机的智慧交通控制系统设计

《基于单片机的智慧交通控制系统设计》 所需器件&#xff1a; STM32最小系统板。按键模块。红黄绿LED灯柱。距离传感器。OLED屏幕。语音识别模块。 整体功能&#xff1a; 本文介绍了一种基于单片机的智慧交通控制系统设计。该系统集成了多种传感器、控制器和执行器&#xf…

22data-脚本 6.18-6.21

for循环 Python for 循环语句 | 菜鸟教程 while循环 Python While 循环语句 | 菜鸟教程 循环嵌套 Python 循环嵌套 | 菜鸟教程 break、continue、pass语句 Python break 语句 | 菜鸟教程 Python continue 语句 | 菜鸟教程 Python pass 语句 | 菜鸟教程