热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FFmepg中错误码的玄机!

使用ffmpeg的时候,如果有错误,会返回一个负数的数字。int型。比如典型的:AVERROR_EOF就是-541478725。当我们遇到


使用 ffmpeg 的时候,如果有错误,会返回一个负数的数字。int 型。比如典型的:AVERROR_EOF 就是 - 541478725。


当我们遇到这样的错的时候,一个快速查看这个数字含义的方法就是:打开计算器!


MAC 下的计算器有编程型,总共分三步就能看到含义:


  1. 选择 10 进制,

  2. 把上面那一串数字输进去,

  3. 点击 ASCII 按钮。


结果如下:


065992df991c58758a5e4e25b76248a5.png


看到没?出现了一个 FOE 的字符串!!字节翻转之后,就是 EOF 了!!


这种做法,让错误码一眼可以知道是什么含义,而不用去翻阅文档,特别是没有文档的时候,简直是自注解的错误码嘛!很是方便哦!


如果我们自己想实现这样的错误码,就需要看一下 ffmpeg 种是怎么处理的了。学以致用哦。


我们还是从 EOF 下手。AVERROR_EOF 的定义在  libavutil/error.h 中 :


#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d))
#define AVERROR_BSF_NOT_FOUND      FFERRTAG(0xF8,&#39;B&#39;,&#39;S&#39;,&#39;F&#39;) ///< Bitstream filter not found
#define AVERROR_BUG                FFERRTAG( &#39;B&#39;,&#39;U&#39;,&#39;G&#39;,&#39;!&#39;) ///< Internal bug, also see AVERROR_BUG2
#define AVERROR_BUFFER_TOO_SMALL   FFERRTAG( &#39;B&#39;,&#39;U&#39;,&#39;F&#39;,&#39;S&#39;) ///< Buffer too small
#define AVERROR_DECODER_NOT_FOUND  FFERRTAG(0xF8,&#39;D&#39;,&#39;E&#39;,&#39;C&#39;) ///< Decoder not found
#define AVERROR_DEMUXER_NOT_FOUND  FFERRTAG(0xF8,&#39;D&#39;,&#39;E&#39;,&#39;M&#39;) ///< Demuxer not found
#define AVERROR_ENCODER_NOT_FOUND  FFERRTAG(0xF8,&#39;E&#39;,&#39;N&#39;,&#39;C&#39;) ///< Encoder not found
#define AVERROR_EOF                FFERRTAG( &#39;E&#39;,&#39;O&#39;,&#39;F&#39;,&#39; &#39;) ///< End of file
#define AVERROR_EXIT               FFERRTAG( &#39;E&#39;,&#39;X&#39;,&#39;I&#39;,&#39;T&#39;) ///< Immediate exit was requested; the called function should not be restarted
#define AVERROR_EXTERNAL           FFERRTAG( &#39;E&#39;,&#39;X&#39;,&#39;T&#39;,&#39; &#39;) ///< Generic error in an external library
#define AVERROR_FILTER_NOT_FOUND   FFERRTAG(0xF8,&#39;F&#39;,&#39;I&#39;,&#39;L&#39;) ///< Filter not found
#define AVERROR_INVALIDDATA        FFERRTAG( &#39;I&#39;,&#39;N&#39;,&#39;D&#39;,&#39;A&#39;) ///< Invalid data found when processing input
#define AVERROR_MUXER_NOT_FOUND    FFERRTAG(0xF8,&#39;M&#39;,&#39;U&#39;,&#39;X&#39;) ///< Muxer not found
#define AVERROR_OPTION_NOT_FOUND   FFERRTAG(0xF8,&#39;O&#39;,&#39;P&#39;,&#39;T&#39;) ///< Option not found
#define AVERROR_PATCHWELCOME       FFERRTAG( &#39;P&#39;,&#39;A&#39;,&#39;W&#39;,&#39;E&#39;) ///< Not yet implemented in FFmpeg, patches welcome
#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,&#39;P&#39;,&#39;R&#39;,&#39;O&#39;) ///< Protocol not found
#define AVERROR_STREAM_NOT_FOUND   FFERRTAG(0xF8,&#39;S&#39;,&#39;T&#39;,&#39;R&#39;) ///< Stream not found
/**

这里可以看到&#xff0c;宏定义了 FFERRTAG 这个函数。


第一行可以看到&#xff0c;其实最后是 MKTAG 这个宏定义&#xff1a;在 libavutil/common.h 中&#xff1a;


#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))

具体的实现是采用位移。错误码是 int 型&#xff0c;也就是 4 个字节&#xff0c;也就是 32 个 bit 位。


而一个字母是一个字节&#xff0c;也就是 8 位&#xff0c;所以&#xff0c;4 个字母可以用一个 int 来表示。左移 8 位就是移一个字节。16&#xff0c;24 同样。这样就按顺序组合好了。


MKTAG 下面还有一个 MKBETAG。这个是大端小端的区别。如果是编码是小端&#xff0c;我们需要把字符串倒过来&#xff0c;也就是 FOE 倒过来位 EOF 才是正确的字符串。


了解了原理之后&#xff0c;我们自己也可以实现这样的错误码了


以上就是简单的分析&#xff0c;觉得挺有意思&#xff0c;分享一下。


作者&#xff1a;拉风的道长 


来源&#xff1a;https://my.oschina.net/lifj/blog/1596415


最后欢迎大家加入 音视频开发进阶 知识星球 &#xff0c;这里有知识干货、编程答疑、开发教程&#xff0c;还有很多精彩分享。


更多内容可以在星球菜单中找到&#xff0c;随着时间推移&#xff0c;干货也会越来越多&#xff01;&#xff01;&#xff01;


70bdb62042a6ca657e15de9311fdb0f2.png


给出 10元 优惠券&#xff0c;涨价在即&#xff0c;目前还是白菜价&#xff0c;基本上提几个问题就回本&#xff0c;投资自己就是最好的投资&#xff01;&#xff01;&#xff01;


7214d192c1a39444fdc9022e76ad191f.png


加我微信 ezglumes &#xff0c;拉你进技术交流群


推荐阅读&#xff1a;


音视频开发工作经验分享 || 视频版


OpenGL ES 学习资源分享


开通专辑 | 细数那些年写过的技术文章专辑


Android NDK 免费视频在线学习&#xff01;&#xff01;&#xff01;


你想要的音视频开发资料库来了


推荐几个堪称教科书级别的 Android 音视频入门项目


觉得不错&#xff0c;点个在看呗~


7f061f16e7368b1247769e1486c3c200.gif




推荐阅读
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
author-avatar
凌乱LW_502
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有