江苏省建设厅网站怎么登不上/百度下载app下载安装到手机
一、使用场景
因为项目中需要加载MP4播放开机视频,而我们的设备所使用的架构为arm架构,其中缺乏一些多媒体库。安装这些插件库比较麻烦,所以最终决定使用FFmpeg播放视频。
二、下载编译ffmpeg库
2.1 下载源码
源码下载路径:https://www.ffmpeg.org/download.html#build-windows
2.2 编译源码
1) 解压:将源码放到指定目录,并运行"tar -jxvf ffmpeg-snapshot.tar.bz2"。若是xxx.tar.gz源文件,则用"tar -zxvf ffmpeg-xxx.tar.gz"。
2) 创建构建目录,"cd ffmpeg", "mkdir build";
3)编译:
a) ubuntu编译: "./configure --enable-static --prefix=./build"
b)arm交叉编译: "./configure --cc=xxx/aarch64-linux-gnu-gcc(QT指定的gcc路径) --cxx=xxx/aarch64-linux-gnu-g++ --enable-staticc(QT指定的g++路径) --prefix=./build --enable-cross-compile --arch=arm64 --target-os=linux"。
4) make安装: "make && make install"。
5) 运行:若需要运行ffmpeg则需要增加--enable-shared参数,并且添加环境变量"export LD_LIBRARY_PATH=xxx/build/lib/"。
6)使用帮助: 在xxx/build/bin路径下运行"./ffmpeg --help"。
2.3 常见报错
1) 交叉编译需要指定对应的gcc和g++编译器和其它的如平台参数,Linux的QTCreator可以通过如下选项查看对应的编译器路径,工程-》管理构建-》编译器-》指南(Manual)-》双击gcc或g++。注意在操作之前需要先选择工程当前的运行和构建平台为arrch64。
2) make install 报错:"strip: Unable to recognise the format of the input file":将config.mak中的"Trip=strip"改为"Trip=arm -linux-strip"。
三、使用源码
1.在工程中导入头文件和库,注意库顺序。eg:
INCLUDEPATH += xxx/build/include
LIBS += -Lxxx/xxx -lavformat\-lavdevice \-lavcodec \-lswresample \-lavfilter \ -lavutil \-lswscale
2.头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QDebug>
#include <QTimer>
#include <QTime>
#include <QAudioOutput>
extern "C"
{#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libswscale/swscale.h>#include <libavdevice/avdevice.h>#include <libavformat/version.h>#include <libavutil/time.h>#include <libavutil/mathematics.h>#include <libavfilter/buffersink.h>#include <libavfilter/buffersrc.h>#include <libavutil/avutil.h>#include <libavutil/imgutils.h>#include <libavutil/pixfmt.h>#include <libswresample/swresample.h>
}#define MAX_AUDIO_FRAME_SIZE 192000namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();public slots:void timeCallback(void);void on_play_clicked();void resizeEvent(QResizeEvent* );private:Ui::MainWindow *ui;int playVedio(void);QTimer *timer; // 定时播放,根据帧率来int vedioW,vedioH; // 图像宽高QList<QPixmap> vedioBuff; // 图像缓存区QString myUrl = QString("E:/workspace/Qt_workspace/ffmpeg/三国之战神无双.mp4"); // 视频地址AVFormatContext *pFormatCtx;AVCodecContext *pCodecCtx;AVCodec *pCodec;AVFrame *pFrame, *pFrameRGB;int ret, got_picture,got_audio; // 视频解码标志int videoindex; // 视频序号// 音频int audioindex; // 音频序号AVCodecParameters *aCodecParameters;AVCodec *aCodec;AVCodecContext *aCodecCtx;QByteArray byteBuf;//音频缓冲QAudioOutput *audioOutput;QIODevice *streamOut;
};#endif // MAINWINDOW_H
3.源文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
// qDebug(avcodec_configuration());
// unsigned version = avcodec_version();
// QString ch = QString::number(version,10);
// qDebug()<<"version:"<<version;timer = new QTimer(this);timer->setTimerType(Qt::PreciseTimer); // 精准定时设置connect(timer,SIGNAL(timeout()),this,SLOT(timeCallback()));
}void MainWindow::timeCallback(void)
{// 视频缓存播放if(!vedioBuff.isEmpty()){ui->label->setPixmap(vedioBuff.at(0));vedioBuff.removeAt(0);}else {timer->stop();}// 音频缓存播放if(audioOutput && audioOutput->state() != QAudio::StoppedState && audioOutput->state() != QAudio::SuspendedState){int writeBytes = qMin(byteBuf.length(), audioOutput->bytesFree());streamOut->write(byteBuf.data(), writeBytes);byteBuf = byteBuf.right(byteBuf.length() - writeBytes);}
}void Delay_MSec(unsigned int msec)
{QTime _Timer = QTime::currentTime().addMSecs(msec);while( QTime::currentTime() < _Timer )QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}int MainWindow::playVedio(void)
{QAudioFormat fmt;fmt.setSampleRate(44100);fmt.setSampleSize(16);fmt.setChannelCount(2);fmt.setCodec("audio/pcm");fmt.setByteOrder(QAudioFormat::LittleEndian);fmt.setSampleType(QAudioFormat::SignedInt);audioOutput = new QAudioOutput(fmt);streamOut = audioOutput->start();char *filepath = myUrl.toUtf8().data();av_register_all();avformat_network_init();pFormatCtx = avformat_alloc_context();// 打开视频文件,初始化pFormatCtx结构if(avformat_open_input(&pFormatCtx,filepath,NULL,NULL)!=0){qDebug("视频文件打开失败.\n");return -1;}// 获取音视频流if(avformat_find_stream_info(pFormatCtx,NULL)<0){qDebug("媒体流获取失败.\n");return -1;}videoindex = -1;audioindex = -1;//nb_streams视音频流的个数,这里当查找到视频流时就中断了。for(int i=0; i<pFormatCtx->nb_streams; i++)if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){videoindex=i;break;}if(videoindex==-1){qDebug("找不到视频流.\n");return -1;}//nb_streams视音频流的个数,这里当查找到音频流时就中断了。for(int i=0; i<pFormatCtx->nb_streams; i++)if(pFormatCtx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_AUDIO){audioindex=i;break;}if(audioindex==-1){qDebug("找不到音频流.\n");return -1;}//获取视频流编码结构pCodecCtx=pFormatCtx->streams[videoindex]->codec;float frameNum = pCodecCtx->framerate.num; // 每秒帧数if(frameNum>100) frameNum = frameNum/1001;int frameRate = 1000/frameNum; //qDebug("帧/秒 = %f 播放间隔是时间=%d\n",frameNum,frameRate);//查找解码器pCodec=avcodec_find_decoder(pCodecCtx->codec_id);if(pCodec==NULL){qDebug("找不到解码器.\n");return -1;}//使用解码器读取pCodecCtx结构if(avcodec_open2(pCodecCtx, pCodec,NULL)<0){qDebug("打开视频码流失败.\n");return -1;}//获取音频流编码结构-------------------------------------------------------------aCodecParameters = pFormatCtx->streams[audioindex]->codecpar;aCodec = avcodec_find_decoder(aCodecParameters->codec_id);if (aCodec == 0) {qDebug("找不到解码器.\n");return -1;}aCodecCtx = avcodec_alloc_context3(aCodec);avcodec_parameters_to_context(aCodecCtx, aCodecParameters);//使用解码器读取aCodecCtx结构if (avcodec_open2(aCodecCtx, aCodec, 0) < 0) {qDebug("打开视频码流失败.\n");return 0;}// 清空缓存区byteBuf.clear();vedioBuff.clear();//创建帧结构,此函数仅分配基本结构空间,图像数据空间需通过av_malloc分配pFrame = av_frame_alloc();pFrameRGB = av_frame_alloc();// 获取音频参数uint64_t out_channel_layout = aCodecCtx->channel_layout;AVSampleFormat out_sample_fmt = AV_SAMPLE_FMT_S16;int out_sample_rate = aCodecCtx->sample_rate;int out_channels = av_get_channel_layout_nb_channels(out_channel_layout);uint8_t *audio_out_buffer = (uint8_t *)av_malloc(MAX_AUDIO_FRAME_SIZE*2);SwrContext *swr_ctx = swr_alloc_set_opts(NULL, out_channel_layout, out_sample_fmt,out_sample_rate, aCodecCtx->channel_layout, aCodecCtx->sample_fmt, aCodecCtx->sample_rate, 0, 0);swr_init(swr_ctx);//创建动态内存,创建存储图像数据的空间unsigned char *out_buffer = (unsigned char *)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_RGB32, pCodecCtx->width, pCodecCtx->height, 1));av_image_fill_arrays(pFrameRGB->data, pFrameRGB->linesize, out_buffer, AV_PIX_FMT_RGB32, pCodecCtx->width, pCodecCtx->height, 1);AVPacket *packet = (AVPacket *)av_malloc(sizeof(AVPacket));//初始化img_convert_ctx结构struct SwsContext *img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);timer->start(frameRate); //定时间隔播放while (av_read_frame(pFormatCtx, packet) >= 0){if (packet->stream_index == audioindex){int ret = avcodec_decode_audio4(aCodecCtx, pFrame, &got_audio, packet);if ( ret < 0){qDebug("解码失败.\n");return 0;}if (got_audio){int len = swr_convert(swr_ctx, &audio_out_buffer, MAX_AUDIO_FRAME_SIZE, (const uint8_t **)pFrame->data, pFrame->nb_samples);if (len <= 0){continue;}int dst_bufsize = av_samples_get_buffer_size(0, out_channels, len, out_sample_fmt, 1);QByteArray atemp = QByteArray((const char *)audio_out_buffer, dst_bufsize);byteBuf.append(atemp);}}//如果是视频数据else if (packet->stream_index == videoindex){//解码一帧视频数据ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);if (ret < 0){qDebug("解码失败.\n");return 0;}if (got_picture){sws_scale(img_convert_ctx, (const unsigned char* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height,pFrameRGB->data, pFrameRGB->linesize);QImage img((uchar*)pFrameRGB->data[0],pCodecCtx->width,pCodecCtx->height,QImage::Format_RGB32);img = img.scaled(vedioW, vedioH);QPixmap temp = QPixmap::fromImage(img);vedioBuff.append(temp);Delay_MSec(frameRate-5); // 这里需要流出时间来显示,如果不要这个延时界面回卡死到整个视频解码完成才能播放显示//ui->label->setPixmap(temp);}}av_free_packet(packet);}sws_freeContext(img_convert_ctx);av_frame_free(&pFrameRGB);av_frame_free(&pFrame);avcodec_close(pCodecCtx);avformat_close_input(&pFormatCtx);
}void MainWindow::resizeEvent(QResizeEvent* )
{vedioW = ui->label->width();vedioH = ui->label->height();
}
MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_play_clicked()
{vedioW = ui->label->width();vedioH = ui->label->height();if(timer->isActive()) timer->stop();playVedio();
}
相关文章:

Qt使用FFmpeg播放视频
一、使用场景 因为项目中需要加载MP4播放开机视频,而我们的设备所使用的架构为arm架构,其中缺乏一些多媒体库。安装这些插件库比较麻烦,所以最终决定使用FFmpeg播放视频。 二、下载编译ffmpeg库 2.1 下载源码 源码下载路径:http…...

Win32 ListBox控件
Win32 ListBox控件 创建ListBox控件 创建窗口函数 HWND CrateWindowEx(DWORD dwExStyle , // 窗口的扩展风格,基本没用LPCTSTR lpClassName, // 已经注册的窗口类名称LPCTSTR lpWindowName, // 窗口标题栏的名字DWORD dwStyle, // 窗口的基本风格int x, // 左上角水平坐标int …...

最大值池化与均值池化比较分析
1 问题在深度学习的卷积网络过程中,神经网络有卷积层,池化层,全连接层。而池化层有最大值池化和均值池化两种情况,而我们组就在思考,最大值池化和均值池化有什么区别呢?两者的模型准确率是否有所不同&#…...

统计学 多元线性回归
文章目录统计学 多元线性回归多元线性回归模型拟合优度显著性检验线性关系检验回归系数检验多重共线性及其处理多重共线性的问题多重共线性的识别与处理变量选择利用回归方程进行预测哑变量回归统计学 多元线性回归 多元线性回归模型 多元线性回归模型:设因变量为…...

tar和gzip压缩和解压
打包和压缩的区别:打包:将多文件 封装在一起压缩:将多文件 封装在一起 通过特定的算法 将冗余的数据 进行删除tar默认是打包命令,如果想用tar进行压缩 必须加选项1、gzip格式压缩:tar zcvf 压缩包包名 文件1 文件2 文件…...

搭建Docker企业私有仓库
什么是仓库 仓库(Repository)是存储和分发 Docker 镜像的地方。镜像仓库类似于代码仓库,Docker Hub 的命名来自 GitHub,Github 是我们常用的代码存储和分发的地方。同样 Docker Hub 是用来提供 Docker 镜像存储和分发的地方。 谈…...

[NOIP2009 提高组] 最优贸易(C++,tarjan,topo,DP)
题目描述 $C 国有国有国有 n 个大城市和个大城市和个大城市和 m$ 条道路,每条道路连接这 nnn个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 mmm 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的…...

计算机网络:移动IP
移动IP相关概念 移动IP技术是移动结点(计算机/服务器)以固体的网络IP地址,实现跨越不同网段的漫游功能,并保证了基于网络IP的网络权限在漫游中不发生任何改变。移动结点:具有永久IP地址的设备。归属代理(本…...

binutils工具集——GNU binutils工具集简介
以下内容源于网络资源的学习与整理,如有侵权请告知删除。 GNU binutils是一个二进制工具集,主要包括: ld,GNU链接器。as,GNU汇编器。addr2line,把地址转化为文件名和行号。nm,列出目标文件的符…...

Golang编译选项(ldflags)有趣应用
本文介绍如何在构建时使用ldflags选项给Golang应用程序注入变量,用于给Go可执行文件增加版本标识或GIT提交摘要等信息。 应用程序的版本信息 我们首先查看Docker Cli 包含的提交信息: docker version 返回结果: Server: Docker Engine - Co…...

AIR32F103(十一) 在AIR32F103上移植微雪墨水屏驱动
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告AIR32F103(二) Linux环境和LibOpenCM3项目模板AIR32F103(三) Linux环境基于标准外设库的项目模板AIR32F103(四) 27倍频216MHz,CoreMark跑分测试AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码AIR32F103(六) ADC,I2S…...

Uipath Excel 自动化基础系列文章
Uipath Excel 自动化基础系列文章已发布到CSDN,网址:https://blog.csdn.net/Marshaljun?typeblog (3月份会在CSDN博客发布Uipath Excel 实战课程及经验分享) Uipath Studio流程设计器介绍 https://blog.csdn.net/Marshaljun/article/details/128699022 Uipath St…...

神经网络优化器之随机梯度下降法的理解
随机梯度下降法(SGD)随机梯度下降方法,在每次更新时用1个样本,随机也就是说我们用样本中的一个例子来近似我所有的样本,由于计算得到的并不是准确的一个梯度,因而不是全局最优的。但是相比于批量梯度&#…...

记录一次WIN11开机在登录页面循环的问题
记录一次由于未进行win密码设置,导致开机后卡在登录界面无法登录进去的问题。最后完美解决了。 1. 背景 开机后,显示用户登录界面,但是和以往不同,没有了密码输入框,只有一个“登录”按钮孤零零地显示在屏幕中间&…...

始终从最不易改变的方面开始
在你刚开始新工作、转换职业或者是加入新项目时,始终从最不易改变的方面开始。 在工作中,这可能意味着与团队成员建立关系,了解公司的流程和文化,或者熟悉公司的产品或服务。 在一项新项目中,这可能意味着了解项目范…...

4、Httpclient源码解析之HTTP协议
初始化CloseableHttpClient过程中涉及ExecChainHandler & DefaultHttpProcessor,即典型客户端责任链中的请求执行处理器。 责任链中各节点涉及请求处理器【ExecChainHandler】顺序如下:RedirectExec、ContentCompressionExec、HttpRequestRetryExec…...

浏览器并发行为记录
使用nodejs koa起一个服务,使请求延时返回。 服务端代码 /** 延时 */ exports.timeoutTestData async function (ctx) {console.log(get query:, ctx.request.query);const query ctx.request.query;let timeout query.timeout || 2000;await new Promise(res…...

工厂模式与抽象工厂
原理:逻辑和业务全部封装 不需要细节 只要结果 示例: # 简单工厂 class SimpleFactory:# 产品staticmethoddef product(name):return nameif __name__ "__main__":product SimpleFactory.product("Gitee")print(product) 装饰器…...

什么?你不知道 ConcurrentHashMap 的 kv 不能为 null?
一、背景 最近设计某个类库时使用了 ConcurrentHashMap 最后遇到了 value 为 null 时报了空指针异常的坑。 本文想探讨下以下几个问题: (1) Map接口的常见子类的 kv 对 null 的支持情况。 (2)为什么 ConcurrentHashM…...

SQL复习04 | 复杂查询
1. 视图 视图和表的区别: 表保存的是实际的数据视图保存的是SELECT语句 视图的优点: 视图无需保存数据,可节省存储设备的容量可以将频繁使用的SELECT语句保存成视图,可大大提高效率 1.1 创建视图 CREATE VIEW 视图名称&…...

【面试题】Java面试题汇总(无解答)
此内容会持续补充。。。 基础 short s1 1; s1 s1 1;有错吗? short s1 1; s1 1; 有错吗?String str”aaa”,与 String strnew String(“aaa”)一样吗?String 和 StringBuilder、StringBuffer 的区别?Sring最大能存多大内容?…...

C++---背包模型---收服精灵(每日一道算法2023.3.11)
注意事项: 本题是"动态规划—01背包"的扩展题,优化的思路不多赘述,dp思路会稍有不同,下面详细讲解。 本题偏向阅读理解,给每种变量归类起名字很有帮助哦。 切记先看思路,再看代码。(大…...

day30_JS
今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、BOM 三、定时器 四、正则表达式 零、 复习昨日 事件 事件绑定方式鼠标事件 onmouseoveronmouseoutonmousemove 键盘事件 onkeydownonkeyupon…...

【Java学习笔记】19.Java 正则表达式(2)
前言 本章继续介绍Java的正则表达式。 Matcher 类的方法 索引方法 索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配: 序号方法及说明1public int start()返回以前匹配的初始索引。2public int start(int group)返回在以前的匹配操作…...

华为云arm架构轻松安装kubeedge
先安装k8s 华为云arm架构安装k8s(kubernetes) 下载kubeedge需要的软件 官方github下载kubeedge地址 cloudcore.service文件下载地址 注意:下载对应的版本和arm架构 keadm-v1.6.1-linux-arm64.tar.gz 下面的2个文件可以不用下载,安装kubeedge时也会自动去下载到/etc/kubee…...

33--Vue-前端开发-使用Vue脚手架快速搭建项目
一、vue脚手架搭建项目 node的安装: 官方下载,一路下一步 node命令类似于python npm命令类似于pip 使用npm安装第三方模块,速度慢一些,需换成淘宝镜像 以后用cmpm代替npm的使用 npm install -g cnpm --registry=https://registry.npm.taobao.org安装脚手架: cnpm inst…...

TMS WEB Core开发Web应用优势说明
一、Delphi开发Web应用的三大框架如下: IntraWEB适合于WEB前、后端的开发,其自带的网络服务器非常强大、稳定,笔者使用Cesium框架开发的WEB GIS地理信息系统前端不需要Apache Tomcat或Nginx即可稳定运行; uniGUI是对JavaScript库Sencha ExtJS的封装,它带有两套VCL组件包,…...

人工智能简单应用1-OCR分栏识别:两栏识别三栏识别都可以,本地部署完美拼接
大家好,我是微学AI,今天给大家带来OCR的分栏识别。 一、文本分栏的问题 在OCR识别过程中,遇到文字是两个分栏的情况确实是一个比较常见的问题。通常情况下,OCR引擎会将文本按照从左到右,从上到下的顺序一行一行地识别…...

Gin框架路由拆分与注册详解析
Gin框架路由拆分与注册详解析1.基本的路由注册2.路由拆分成单独文件或包3.路由拆分成多个文件4.路由拆分到不同的APP1.基本的路由注册 下面最基础的gin路由注册方式,适用于路由条目比较少的简单项目或者项目demo // StatCost 是一个统计耗时请求耗时的中间件 func…...

2020蓝桥杯真题凯撒加密 C语言/C++
题目描述 给定一个单词,请使用凯撒密码将这个单词加密。 凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移 3 位后被替换成密文。即 a 变为 d,b 变为 e,⋯,w 变为z,x 变为 a࿰…...