【问题标题】:How can I found FFmpeg Error code's meaning?如何找到 FFmpeg 错误代码的含义?
【发布时间】:2019-02-19 17:42:01
【问题描述】:

我在使用 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 帧返回

第 21 帧返回

【问题讨论】:

  • AVERROR_INVALIDDATA 并不是那么明确,但提供了一个小提示。输入中有无效数据。什么和在哪里,我不能说,但如果你能建立一个minimal reproducible example,也许 ffmpeg 大师可以提供帮助。

标签: c++ ffmpeg


【解决方案1】:

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

退货

0 表示成功,否则为负错误代码:AVERROR(EAGAIN):在当前状态下不接受输入 - 用户必须使用avcodec_receive_frame() 读取输出(一旦读取所有输出,应重新发送数据包,调用将EAGAIN 不会失败)。 AVERROR_EOF: 解码器已经flush了,不能再发新包了(发送多于1个flush包也会返回)AVERROR(EINVAL): codec没打开,是encoder,或者需要flush 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,这是@987654339 中提到的可能值之一@文档:

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 而不是AVERROR_NOMEM

【讨论】:

  • 谢谢。我如何在 libavutil/error.h 中匹配 12 和 AVERROR(ENOMEM)?
  • 哦。我可以找到 int errno.h 。非常感谢。 :)
猜你喜欢
  • 2014-05-21
  • 2013-09-17
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2019-01-08
  • 2023-04-10
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多