大部分开源项目都会封装一下错误码,FFmpeg 也不例外。FFmpeg 对 错误码 以及 相关的 API 函数 的定义是在 libavutil/error.h
里面的,如下:
MKTAG()
宏函数的定义在 libavutil/common.h
里面,如下:
因此,FFmpeg 封装错误码的方法,实际上就是把 英文字符对应的 ASCII 码拼接起来,转成数字拼接起来。
由于一个 英文字符 占 8 位(1个字节),所以 4 个字符,刚刚好可以放进去 一个 int
的内存里面,一个 int
是 4 个字节大小。
下面通过一个代码实例来演示一下错误码,下载地址:GitHub,编译环境是 Qt 5.15.2 跟 MSVC2019_64bit 。
运行结果如下:
大家可以网上搜一下 ,字符 B 的 ASCII 码是不是 0xDE
,字符 U 的 ASCII 码是不是 0xB8
。
有时候我们调一些 FFmpeg 的函数的时候会发生错误,例如调 avcodec_receive_packet()
的时候,编码器内部报错了。这时候如果想需要显示具体的错误给用户看,就可以用到下面两个函数来把 错误码 转成字符串。
1,av_err2str()
,这是一个比较方便的宏函数,定义如下:
av_err2str()
不是返回的堆指针,而是栈指针,所以你不用释放内存,他这种传参是初始化了一个栈变量,然后把栈变量指针传进去的。
这种写法,跟你在调函数之前,创建一个栈变量,然后把栈变量指针丢进去函数是一样的,他这种写法很值得学习。
不过这种写法在 C++ 是不支持的,如果在 C++ 项目调用了 av_err2str()
宏函数,会编译报错。这时候可以使用下面的 av_strerror()
函数。
2,av_strerror()
,这个函数有点麻烦,你需要先定义个栈内存,或者堆内存,然后传给它。定义如下:
上面两个 API 函数的示例代码如下:
运行结果如下:
FFmpeg 的错误码介绍完毕。