ffmpeg关于视频前几秒黑屏的问题解决

news2025/9/15 7:20:29

关于音频播放器视频前两秒黑屏的解决,及QtAV和ffmpeg的环境搭建(软件包可以找李青璠提供,也可以自己下)

首先我们可以参考下面两个博客进行ffmpeg的搭建,第一个博客的问题可以在第二个博客里寻求方法解决。其中第一个博客ffmpeg的编译命令应该改成./configure --enable-shared --prefix=/usr/local/ffmpeg,如果需要安装yasm,那么编译语句

中的./configure可以改成./configure --prefix=/usr/local/yasm (--prefix的作用是指定路径,而--enable-shared是指定生成动态库)

(1条消息) Ubuntu安装ffmpeg_大笨钟47的博客-CSDN博客_ffmpeg ubuntu安装

(1条消息) linux上如何安装QtAV插件?(环境:ubuntu18.04,qt5.12.3,ffmpeg-4.1.3)_ResttaPersevere的博客-CSDN博客

这里我们安装好了ffmpeg.下面我们进行QtAV的编译安装,可以直接点击下面的网址,Build QtAV · wang-bin/QtAV Wiki · GitHub我按他的推荐选了一种方式,大家可以参考如下;

sudo apt-get install libopenal-dev libpulse-dev libva-dev libxv-dev libass-dev libegl1-mesa-dev

cp -r /usr/local/ffmpeg/include/* /home/liqingfan/Qt5.12.10/5.12.10/gcc_64/include/

cp -r /usr/local/ffmpeg/lib/* /home/liqingfan/Qt5.12.10/5.12.10/gcc_64/lib/

下面就可以使用QtCreator With MSVCQtCreator will detect VC compiler if it is installed. So it's easy to build in QtCreator这样这个环境就搭建完成了。用QtCreator选中QtAV.pro进行编译即可

下面描述一下问题的解决过程和结论,

首先

在编译后的文件目录下会找到:sdk_install.sh

赋予sdk_install.sh 执行权限,命令 chmod 777 sdk_install.sh

安装qtav,命令:./ sdk_install.sh

并且把/home/liqingfan/ffmpegAndQtav/build-QtAV-Desktop_Qt_5_12_10_GCC_64bit-Debug/lib_linux_x86_64/目录下的文件放到/home/liqingfan/ffmpegAndQtav/203ideoclient/libs/下就可以正常的编译这个视频项目啦

后面是关于卡顿问题的分析:

我们随意打开一个视频,可以看到日志有下面几句非常的可疑。

"AVClock started!!!!!!!!"

"no frame could be decompressed: Error number 1390 occurred 0/1390"

"invalid video frame from decoder. undecoded data size: 0"

"no frame could be decompressed: Error number 898 occurred 0/898"

"invalid video frame from decoder. undecoded data size: 0"

"no frame could be decompressed: Error number 490 occurred 0/490"

"invalid video frame from decoder. undecoded data size: 0"

"setInSize => calculating aspect ratio from converted input data(1.777778)"

QtAV::VideoFormat(pixelFormat: 15 "yuvj420p" alpha: false, channels: 3, planes: 3, bpc: 8, bpp: 12/12 -8-8-8)

"pixel format changed: => yuvj420p 15"

material changed: "gl material 16to8bit: 0, planar: 0, has alpha: 0, 2d texture: 0, 2nd plane rg: 0, xyz: 0" => "gl material 16to8bit: 0, planar: 1, has alpha: 0, 2d texture: 1,

可以看出前面几面的视频帧有问题,通过向上去找log,invalid video frame from decoder. undecoded data size: 0"证明了猜想

通过log定位在了解码器。bool VideoDecoderFFmpegBase::decode(const Packet &packet);

这是我们再分析视频合成的视频,这里分析工具用的是

我们把视频拖进去看一下,

明显第一帧和其他是不一项的。从此入手,我的解决方案就是跳过有问题的帧。于是对解码这块的源码做了如下改进。改进的函数是bool VideoDecoderFFmpegBase::decode(const Packet &packet);

bool VideoDecoderFFmpegBase::decode(const Packet &packet)

{

if (!isAvailable())

return false;

DPTR_D(VideoDecoderFFmpegBase);

// some decoders might need other fields like flags&AV_PKT_FLAG_KEY

// const AVPacket*: ffmpeg >= 1.0. no libav

int got_frame_ptr = 0;

int ret = 0;

if (packet.isEOF()) {

AVPacket eofpkt;

av_init_packet(&eofpkt);

eofpkt.data = NULL;

eofpkt.size = 0;

ret = avcodec_decode_video2(d.codec_ctx, d.frame, &got_frame_ptr, &eofpkt);

} else {

ret = avcodec_decode_video2(d.codec_ctx, d.frame, &got_frame_ptr, (AVPacket*)packet.asAVPacket());

}

//qDebug("pic_type=%c", av_get_picture_type_char(d.frame->pict_type));

d.undecoded_size = qMin(packet.data.size() - ret, packet.data.size());

if (ret < 0) {

//qWarning("[VideoDecoderFFmpegBase] %s", av_err2str(ret));

return false;

}

if (!got_frame_ptr) {

//liqingfan add for fix delay:begin

while(!got_frame_ptr){

if (packet.isEOF()) {

AVPacket eofpkt;

av_init_packet(&eofpkt);

eofpkt.data = NULL;

eofpkt.size = 0;

ret = avcodec_decode_video2(d.codec_ctx, d.frame, &got_frame_ptr, &eofpkt);

if (ret < 0) {

//qWarning("[VideoDecoderFFmpegBase] %s", av_err2str(ret));

return false;

}

if(!got_frame_ptr){

return !packet.isEOF();

}

} else {

ret = avcodec_decode_video2(d.codec_ctx, d.frame, &got_frame_ptr, (AVPacket*)packet.asAVPacket());

if (ret < 0) {

//qWarning("[VideoDecoderFFmpegBase] %s", av_err2str(ret));

return false;

}

}

}

//liqingfan add for fix delay:end

qWarning("no frame could be decompressed: %s %d/%d", av_err2str(ret), d.undecoded_size, packet.data.size());

return !packet.isEOF();

}

if (!d.codec_ctx->width || !d.codec_ctx->height)

return false;

//qDebug("codec %dx%d, frame %dx%d", d.codec_ctx->width, d.codec_ctx->height, d.frame->width, d.frame->height);

d.width = d.frame->width; // TODO: remove? used in hwdec

d.height = d.frame->height;

//avcodec_align_dimensions2(d.codec_ctx, &d.width_align, &d.height_align, aligns);

return true;

}

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

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

相关文章

服务器上后台运行python程序

Linux中将代码nohup后台执行、查看正在运行代码、结束进程写在最前面环境代码示例nohup指令& 后台运行2>&1 错误内容重定向到标准输出查看当前python相关进程结束进程nohup后台pip下载安装写在最前面 一直是pycharm运行服务器上代码&#xff0c;但存在问题&#xf…

3.1、线程概述

3.1、线程概述1.线程概述2.线程和进程区别3.线程和进程虚拟地址空间4.线程之间共享和非共享资源①共享资源②非共享资源5.线程版本NPTL1.线程概述 与进程&#xff08;process&#xff09;类似&#xff0c;线程&#xff08;thread&#xff09;是允许应用程序并发执行多个任务的…

通达信指标没有了怎么找回

通达信指标没有了可以恢复&#xff0c;不用太慌张&#xff0c;通达信会自动备份指标公式&#xff0c;可以通过备份文件找回。 1、找到通达信安装文件夹&#xff0c;一般是new_tdx&#xff0c;但是版本不同&#xff0c;安装文件夹可能有区别。本文以new_tdx这个文件夹为例。 如…

什么是零代码与低代码?有什么区别与联系?未来趋势

目前传统软件开发模式并不能很好地满足企业的需求&#xff1a;高人力成本、长研发时间、运维复杂&#xff0c;需求变化快&#xff0c;技术更新快&#xff0c;人员流失。这时零代码或低代码工具出现在市面上并被关注就是必然趋势了。对于不太了解两者的人来说&#xff0c;零代码…

【mysql性能调优 • 三】字符集和校验规则

前言 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系…

Linux下Nginx配置SSL模块,Nginx安装SSL,Nginx支持https配置详细教程

前提&#xff1a;Linux安装Nginx&#xff0c;参考教程&#xff1a;CentOS7安装Nginx完整教程&#xff0c;Linux系统下保姆式安装Nginx教程 | 老麻 安装好Nginx之后&#xff0c;需要支持SSL时&#xff0c;要单独安装SSL模块&#xff0c;方法如下&#xff1a; 输入 ./nginx –V 命…

2345看图王阻止文件删除和U盘弹出 - 解决方案

2345看图王阻止文件删除和U盘弹出 - 解决方案前言2345看图王解决方案临时方案永久方案前言 用户在使用2345看图王查看图片后&#xff0c;可能会出现图片文件/文件夹无法删除或U盘无法弹出等问题&#xff0c;这是因为2345看图王的辅助模块正在占用图片文件&#xff0c;因此无法…

设计分布式日志系统

一、日志 1.1、什么是日志 日志是一种按照时间顺序存储记录的数据&#xff0c;它记录了什么时间发生了什么事情&#xff0c;提供精确的系统记录&#xff0c;根据日志信息可以定位到错误详情和根源。按照APM概念的定义&#xff0c;日志的特点是描述一些离散的&#xff08;不连…

Spark----DataFrame和DataSet

Spark之DataFrame和DataSet 文章目录Spark之DataFrame和DataSetDataFrameDSL 语法创建DataFrame查看DataFrame的Schema信息只查看列数据的6种方式按照“age”分区&#xff0c;查看数据条数增加列withColumn修改列名withColumnRenamedRDD 转换为 DataFrameDataFrame 转换为 RDD转…

如何使用双轴XY平台绘制斜向多边形

1. 功能说明 本文示例将实现双轴XY平台绘制斜向多边形的功能。 2. 直角坐标机器人的结构设计 直角坐标机器人各个运动轴通常对应直角坐标系中的X轴、Y轴和Z 轴&#xff0c;其中X 轴和Y 轴是水平面内运动轴&#xff0c;Z轴是上下运动轴。在绝大多数情况下直角坐标机器人的各个直…

SpringBoot集成Easy-Es

文章目录SpringBoot集成Easy-Es一、集成demo二、索引CRUD创建索引查询索引更新索引删除索引三、数据CURD四、参数文档SpringBoot集成Easy-Es Easy-Es&#xff08;简称EE&#xff09;是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架&#xff0c…

C语言—实用调试技巧

实用调试技巧什么是bug&#xff1f;调试是什么&#xff1f;有多重要&#xff1f;什么是调试调试的基本步骤Debug和Release的介绍Windows环境调试介绍调试环境的准备快捷键的使用调试的时候查看程序当前信息查看断点信息查看临时变量的值查看局部变量的值查看内存信息查看汇编信…

PERSIANN 降雨数据使用教程

一、前言PERSIANN&#xff0c;“使用人工神经网络从遥感信息中估算降水”&#xff0c;是一种基于卫星的降水检索算法&#xff0c;可提供近乎实时的降雨信息。该算法使用来自全球地球同步卫星的红外 (IR) 卫星数据作为降水信息的主要来源。 红外图像的降水基于云顶温度和降水率之…

ESP32驱动1.28寸GC9A01播放视频(一、视频分辨率的调整和视频格式的转换)

ESP32驱动1.28寸GC9A01播放视频&#xff08;一、视频分辨率的调整和视频格式的转换&#xff09;播放前准备转换视频分辨率用FFmpeg将.MP4转换为.mjpeg格式FFmpeg的win10环境搭建FFmpeg的下载环境变量的搭建MP4转换成mjpeg格式总结播放前准备 1.28寸GC9A01屏幕的分辨率是240x24…

prometheus标签

004 标签 1. 作用 Prometheus中存储的数据为时间序列&#xff0c;是由Metric的名字和一系列的标签(键值对)唯一标识的, 不同的标签代表不同的时间序列&#xff0c;即 通过指定标签查询指定数据 。 指标标签实现了查询条件的作用&#xff0c;可以指定不同的标签过滤不同的数据…

类ChatGPT产品Claude上线Slack平台,一手实测体验在此

文章目录Claude-in-Slack自我介绍成语接龙数学能力代码能力其他总结Claude-in-Slack Claude是Anthropic推出的类ChatGPT对话机器人。Anthropic是一家由前OpenAI团队成员创立的人工智能初创公司。Claude免费、支持中文、无需注册&#xff0c;好心动&#xff0c;立刻上手测试。 …

第一个禁止ChatGPT的西方国家

意大利成为第一个有效禁止 ChatGPT 的西方国家。 由于可能违反隐私和数据法&#xff0c;该国的数据监管机构已下令开发聊天机器人的 OpenAI 停止运营。 意大利数据保护局 (GPDP) 提到了一些担忧&#xff0c;包括大量收集用户数据和存储以训练 AI 算法。 ChatGPT 是一种大型语…

Eyeshot Ultimate 2023 Crack

Eyeshot Ultimate 2023 Crack 已经引入了文档类。 工作区。文档现在包含绘制场景内容所需的所有数据。 2022版GEntities已被删除。 最后&#xff0c;一个真正的跨平台中立核心产品是可用的。 新功能 曲线、平面、曲面和体积网格。 屏幕空间环境光遮挡。 托管ReadDWG和ReadDXF类…

【SQL】一文带你掌握SQL基础语法

文章目录&#x1f496;1&#xff0c;SQL概述&#x1f388;1.1 SQL简介&#x1f388;1.2 通用语法&#x1f388;1.3 SQL分类&#x1f496;2&#xff0c;DDL:操作数据库&#x1f388;2.1 查询&#x1f388;2.2 创建数据库&#x1f388;2.3 删除数据库&#x1f388;2.4 使用数据库…

哪个品牌的触控笔质量好?ipad好用的触控笔

从这一点就能看出来&#xff0c;苹果原装的这一款电容笔&#xff0c;确实是贵得让人无法入手&#xff0c;一支就要一千多块钱。实际上&#xff0c;平替电容笔对没有太多预算的用户是个不错的选择。就拿正版电容笔来说&#xff0c;一正版的电容笔来说&#xff0c;就是4支平替电容…