如何找到FFmpeg错误代码的含义?

时间:2019-02-19 02:07:50

标签: c++ ffmpeg

我在使用FFMPEG时遇到问题。

avcodec_send_packet()返回错误代码-12。

我试图找出-12的含义。

我找到了此页面,但无法理解-12的计算结果

How can I find out what this ffmpeg error code means?

有人可以帮助我吗?

我正在使用DXVA2进行解码。并且avcodec_send_packet()函数在第20帧之后返回-12。

第20帧返回

image

第21帧返回

image

1 个答案:

答案 0 :(得分:1)

如果您读了avcodec_send_packet() documentation,它会说:

  

返回

     成功时为

0,否则为负错误代码:AVERROR(EAGAIN):当前状态下不接受输入-用户必须使用avcodec_receive_frame()读取输出(一旦读取了所有输出,则应重新发送数据包,并且通话不会失败,EAGAIN)。 AVERROR_EOF:解码器已清空,无法发送新数据包(如果发送了多个刷新数据包,则也返回)AVERROR(EINVAL):未打开编解码器,它是编码器,或要求刷新AVERROR(ENOMEM):无法将数据包添加到内部队列,或其他类似错误:合法的解码错误

请注意,avcodec_send_packet()正在基于AVERROR()宏返回错误代码,该宏在libavutil/error.h中定义为:

/* error handling */
#if EDOM > 0
#define AVERROR(e) (-(e))   ///< Returns a negative error code from a POSIX error code, to return from library functions.
#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value.
#else
/* Some platforms have E* and errno already negated. */
#define AVERROR(e) (e)
#define AVUNERROR(e) (e)
#endif

您可以在文档中看到,标准的POSIX错误代码正在传递给AVERROR()

现在,如果查看编译器的errno.h标头中定义的POSIX错误代码,您会发现[-]12被定义为ENOMEM,这是可能的一种avcodec_send_packet()文档中提到的值:

  

AVERROR(ENOMEM):无法将数据包添加到内部队列,或其他类似错误:合法的解码错误

this version of error.h(与this version相对)说:

#if LIBAVUTIL_VERSION_MAJOR < 51
#define AVERROR_INVALIDDATA AVERROR(EINVAL)  
...
#define AVERROR_NOMEM       AVERROR(ENOMEM)  
...
#endif

您显示的屏幕快照正在测试avcodec_send_packet()而不是AVERROR_INVALIDDATA的{​​{1}}的返回值。