ffmpeg解码花屏

问题:

解码为YUV420转为Bitmap后显示在屏幕上时,有三分之二为花屏:如图:


首先用h264Visa分析帧:


已经读出了sps等信息,这些信在解码第一帧时被写入环境变量中,所以下边的帧不需要sps了

而且在解码时必须为完整的一帧或者数帧。

只有IDR帧才需要带sps、pps信息。


ffmpeg中的av_read_frame()的作用是读取码流中的音频若干帧或者视频一帧。例如,解码视频的时候,每解码一个视频帧,需要先调用 av_read_frame()获得一帧视频的压缩数据,然后才能对该数据进行解码(例如H.264中一帧压缩数据通常对应一个NAL)。

通过av_read_packet(***),读取一个包,需要说明的是此函数必须是包含整数帧的,不存在半帧的情况,以ts流为例,是读取一个完整的PES包(一个完整pes包包含若干视频或音频es包),读取完毕后,通过av_parser_parse2(***)分析出视频一帧(或音频若干帧),返回,下次进入循环的时候,如果上次的数据没有完全取完,则st = s->cur_st;不会是NULL,即再此进入av_parser_parse2(***)流程,而不是下面的av_read_packet(**)流程,这样就保证了,如果读取一次包含了N帧视频数据(以视频为例),则调用av_read_frame(***)N次都不会去读数据,而是返回第一次读取的数据,直到全部解析完毕。


直接解码00 00 01之间的数据,很可能不是一帧完整的数据,所以需要先取到完整的数据,方法是使用:av_parser_parse2判断也就是说分帧的话在函数av_read_frame()会调用av_parse_parse2()函数,这只针对本地文件,如果解码网络流,需要自己调用av_parse_parse2()函数;

参照:http://blog.163.com/cho_ku2000/blog/static/913118220120553024697/

摘抄1:

如果由H264字节流格式去解码,在每次读取一段数据之后(不管每次读多少都可以),都调用av_parser_parse2去分帧,这个函数会将每次读取的264数据进行存储分析,直到得到完整的H264数据为止,然后送出,此时我们可以用avcodec_decode_video2来解码。

摘抄2:

那么送出的数据有什么规律呢? 对于IDR帧,除了IDR自身的数据外,会连同前面的SPS,PPS,SEI一并合在一起。在avcodec_decode_video2函数里面,包含了对SPS等的解析。

如果是P帧或者B帧,则不会送SPS,PPS等参赛信息。这个也很合理,因为本来就只有IDR帧才需要带参数信息


摘抄3:

需要av_parser_parse2先解析数据,再调用avcodec_decode_video2
如果av_parser_parse2的输入是1000k,但是av_parser_parse2的解析出来的数据可能只有200k
这200k作为avcodec_decode_video2的输入,剩下的800k需要再次av_parser_parse2,循环往复
如果直接将这1000k,扔进avcodec_decode_video2,返回正确,但是没有结果



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

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

相关文章

《Zookeeper》源码分析(二十三)之 客户端的命令处理过程

目录 客户端的命令处理过程1. ZooKeeper.create()2. ClientCnxn.submitRequest()3. SendThread.run()4. ClientCnxnSocket.doTransport()5. SendThread.readResponse() 客户端的命令处理过程 以创建节点命令为例,整个过程流程如下: CliCommand命令在抽…

自己动手完成数据恢复

简易数据恢复 数据恢复数据恢复原理FAT文件系统 NTFS文件系统在NTFS文件系统中的原理分析对于文件删除有一段时间时: 基于软件的文件恢复总结 数据恢复 数据恢复是一个很大的概念,包括文件恢复,分区恢复,分区格式化恢复&#xff0…

深入探讨C存储类和存储期——Storage Duration

🔗 《C语言趣味教程》👈 猛戳订阅!!! ​—— 热门专栏《维生素C语言》的重制版 —— 💭 写在前面:这是一套 C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅&#…

巨人网络305亿并购海外棋牌类游戏公司审核遭暂停

雷帝网 乐天 8月10日报道 巨人网络今日发布公告,宣布2018年8月10日收到中国证监会通知,决定对公司本次发行股份及支付现金购买资产并募集配套资金暨关联交易事项(简称“本次重组”)暂停审核。 据《上市公司重大资产重组管理办法》…

家乡的一种棋牌游戏

进来无事,想起了家乡的一种棋牌游戏,只记得小时候玩觉得蛮有趣,呵呵,现在想起就有一种用程序实现它的冲动, 呵呵,有想法就行动了,鉴于此款游戏由多人组合才能进行,所以还是选择C/S结…

C#棋牌游戏(如斗地主)

C#棋牌游戏 需求代码块定义枚举定义Card类定义CardLibrary类*定义Player类Main函数中实现结果展示 需求 需要定义Card类,该类包含特征: 每张牌的名字; 花色:红心、方块、梅花、黑桃; 牌号:1- 10、J、Q、K、小王、大王定义牌库CardLibrary类,…

自助棋牌室

1项目模块:商家模块(店铺展示、包厢展示、订单、订单搜索、店铺搜索) 用户模块(登录、注册、预约、充值、更换头像、续单、退单) 2项目技术:前端:js、jquery、vue2、vue3、后端:jdbc、java、servlet、mybatis 3功能实现: I 登录功能实现: 主要通过前后端交互实现,前后端实现流…

算法通过村第四关-栈白银笔记|手写栈操作

文章目录 前言1. 栈的基础概要1.1 栈的特征1.2 栈的操作1.3 Java中的栈 2. 栈的实现(手写栈)2.1 基于数组实现2.2 基于链表实现2.3 基于LinkedList实现 总结 前言 提示:我自己一个人的感觉很好 我并不想要拥有你 除非你比我的独处更加宜人 --…

【问题解决】无法加载文件 C:\Users\PJW\AppData\Roaming\npm\hpm.ps1,因为在此系统上禁止运行脚本

问题: PS Y:\BearPi-HM_Nano> hpm dist hpm : 无法加载文件 C:\Users\PJW\AppData\Roaming\npm\hpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policie…

intellj 无法运行程序

RT 在写作业的时候,导入老师项目,但是无法执行文件。 在这里插入图片描述 在项目模块中,添加内容根。添加目标源文件夹,解决问题。

【报错】nrm : 无法加载文件 …路径… ,因为在此系统上禁止运行脚本。

原因:核心是power shell的安全策略,将 nrm 命令视为了不安全脚本,不允许执行。只需要放开权限就行。 解决:通过管理员权限运行power shell,然后输入命令 set-ExecutionPolicy RemoteSigned 示例: 选择“是”…

com.android.phone已停止运行怎么解决方法,com.android.phone进程意外停止/已停止运行的原因及解决方法...

com.android.phone已停止怎么解决?小编带来了com.android.phone进程意外停止解决方法,有机友表示当手机刷机或root后就会出现“进程com.android.phone已停止”提示,不妨试一试下文的解决方法哦~ --原因 出现这种情况表明你的手机运行环境出现了比较大的…

在运行Android程序出现“×××已停止运行”

在运行Android程序时出现“已停止运行”的情况,点击“重新打开应用”后又提示“屡次停止运行”, 发现在Logcat中有这么一行提示:“Caused by: java.lang.NullPointerException: Attempt to invoke virtual method android.view.View android.…

无法加载文件 ,因为在此系统上禁止运行脚本

1 问题 在打开cmd命令行文件或者某个shell时,运行某个文件失败,并且显示无法加载文件 ,因为在此系统上禁止运行脚本。可能是因为你当前的shell窗口权限不够导致,可以先打开管理员权限的shell之后,修改脚本运行的策略即…

因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies

项目场景: 提示:这里简述项目相关背景: npm安装包后无法使用, 例如:npm install -g json-server 安装成功后 使用json-server命令 报错,如果没有安装过此包,一般会提示不是内部或者外部命令 问…

windows 已停止這個裝置,因為它發生了問題。

您的電腦在接入外接式裝置時出現" Windows 已停止這個裝置,因為它發生了問題。 (代碼 43)",如何解決? 一般情況下,是由於裝置非正常接入所引起的裝置驅動程式出現故障的錯誤,此時多插拔幾次即可解決。但如果…

Windows启动和停止jar包命令

一、windows启动jar包命令 命令放到 bat文件中 1、普通启动 title XXX chcp 65001 java -Dfile.encodingutf-8 -jar XXX.jar加上-Dfile.encodingutf-8后,不乱码 加上chcp 65001后,日志的中文不乱码 注:这种方式启动后,窗口不能…

因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?Link ID=135170 中的 about_Execution_Policies

出现的问题描述 在 Pycharm 的虚拟环境中,打开终端,有红字提示 重点关注的就是在此系统上禁止运行脚本 这是因为PowerShell的执行策略不允许运行脚本 有两种方法可以解决 解决办法 方法一:修改PowerShell的执行策略 以管理员方式运行Powe…

无法加载文件,因为在此系统上禁止运行脚本。

1.vscode报错,nodemon :因为在此系统上禁止运行脚本。 注意:不仅仅适用于nodemon报错,报在此系统上禁止运行脚本的错都可以用以下方法解决 2.报错原因分析:windows 为了安全,默认的执行策略为 Restricted,因此需要将执行策略设置为 RemoteSigned 即可 3.解决方法 步骤: 1.…

四种方式解决idea中出现 运行配置停止之前未连接应用程序服务器原因:无法在 localhost:1099 处 ping 服务器

出现这种问题的原因很多 第一种:项目结构那里没有选JDK 第二种:Tomcat版本和JDK版本不兼容,这就要我们手动更改Tomcat或者JDK版本了 我们先查看自己的Tomcat版本,首先点开黄色那个圈,照着图片依次进行 这里一定要点进…