我怎样才能找出这个 ffmpeg 错误代码的含义?

2021-12-26 00:00:00 ffmpeg c c++

我正在使用 avcodec_decode_video2 函数.在流中的编码更改时,它返回 -1094995529.该文档仅说明:

<块引用>

出错时返回负值,否则返回字节数如果没有可以解压缩的帧,则使用或为零.

但似乎没有返回代码的枚举或任何其他形式的文档.错误是什么意思,我一般如何确定?

解决方案

来自 ffmpeg 的错误代码(来自 avutil 的 error.h):http://ffmpeg.org/doxygen/trunk/error_8h_source.html

原来你指定的值是:

#define AVERROR_INVALIDDATA FFERRTAG('I','N','D','A')

-1094995529 变为 -0x41444E49,当您查看这些字母时,在 ACSII 中,0x41 = 'A'、0x44 = 'D'、0x4E = 'N 和 0x49 = 'I'.由于宏/等的东西被颠倒了,所以ADNI变成了INDA,你可以从#define片段中看到,是AVERROR_INVALIDDATA定义的FFERRTAG('I','N','D','A').

其余的错误代码在该文件中,我已将它们粘贴在此处:

#define AVERROR_BSF_NOT_FOUND FFERRTAG(0xF8,'B','S','F')///<未找到比特流过滤器#define AVERROR_BUG FFERRTAG('B','U','G','!')///<内部错误,另见 AVERROR_BUG2#define AVERROR_BUFFER_TOO_SMALL FFERRTAG('B','U','F','S')///<缓冲区太小#define AVERROR_DECODER_NOT_FOUND FFERRTAG(0xF8,'D','E','C')///<未找到解码器#define AVERROR_DEMUXER_NOT_FOUND FFERRTAG(0xF8,'D','E','M')///<未找到分路器#define AVERROR_ENCODER_NOT_FOUND FFERRTAG(0xF8,'E','N','C')///<未找到编码器#define AVERROR_EOF FFERRTAG('E','O','F','')///<文件结束#define AVERROR_EXIT FFERRTAG('E','X','I','T')///<要求立即退出;不应重新启动被调用的函数#define AVERROR_EXTERNAL FFERRTAG('E','X','T','')///<外部库中的一般错误#define AVERROR_FILTER_NOT_FOUND FFERRTAG(0xF8,'F','I','L')///<未找到过滤器#define AVERROR_INVALIDDATA FFERRTAG('I','N','D','A')///<处理输入时发现无效数据#define AVERROR_MUXER_NOT_FOUND FFERRTAG(0xF8,'M','U','X')///<未找到多路复用器#define AVERROR_OPTION_NOT_FOUND FFERRTAG(0xF8,'O','P','T')///<未找到选项#define AVERROR_PATCHWELCOME FFERRTAG('P','A','W','E')///<尚未在 FFmpeg 中实现,欢迎提供补丁#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O')///<未找到协议#define AVERROR_STREAM_NOT_FOUND FFERRTAG(0xF8,'S','T','R')///<未发现流媒体#define AVERROR_BUG2 FFERRTAG('B','U','G','')#define AVERROR_UNKNOWN FFERRTAG('U','N','K','N')///<未知错误,通常来自外部库#define AVERROR_EXPERIMENTAL (-0x2bb2afa8)///<请求的功能被标记为实验性的.如果您真的想使用它,请设置 strict_std_compliance.#define AVERROR_INPUT_CHANGED (-0x636e6701)///<输入在调用之间改变.需要重新配置.(可以与 AVERROR_OUTPUT_CHANGED 进行 OR 运算)#define AVERROR_OUTPUT_CHANGED (-0x636e6702)///<输出在调用之间改变.需要重新配置.(可以与 AVERROR_INPUT_CHANGED 进行 OR 运算)#define AVERROR_HTTP_BAD_REQUEST FFERRTAG(0xF8,'4','0','0')#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8,'4','0','1')#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8,'4','0','3')#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8,'4','0','4')#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8,'4','X','X')#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8,'5','X','X')

I'm using the function avcodec_decode_video2. On an encoding change in the stream, it returns -1094995529. The documentation only states:

On error a negative value is returned, otherwise the number of bytes used or zero if no frame could be decompressed.

But there doesn't seem to be an enum of return codes or any other form of documentation. What does the error mean and how can I determine that in general?

解决方案

Error codes from ffmpeg (error.h from avutil) : http://ffmpeg.org/doxygen/trunk/error_8h_source.html

It turns out the value you specified is :

#define AVERROR_INVALIDDATA        FFERRTAG( 'I','N','D','A')

The -1094995529 becomes -0x41444E49 and when you look at those letters, in ACSII, 0x41 = 'A', 0x44 = 'D', 0x4E = 'N, and 0x49 = 'I'. Due to the macro/etc things are reversed, so ADNI becomes INDA, which you can see from the #define snippet, is the AVERROR_INVALIDDATA defined FFERRTAG( 'I','N','D','A').

The rest of the error codes are in that file and I've pasted them below here :

#define AVERROR_BSF_NOT_FOUND      FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found
#define AVERROR_BUG                FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2
#define AVERROR_BUFFER_TOO_SMALL   FFERRTAG( 'B','U','F','S') ///< Buffer too small
#define AVERROR_DECODER_NOT_FOUND  FFERRTAG(0xF8,'D','E','C') ///< Decoder not found
#define AVERROR_DEMUXER_NOT_FOUND  FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found
#define AVERROR_ENCODER_NOT_FOUND  FFERRTAG(0xF8,'E','N','C') ///< Encoder not found
#define AVERROR_EOF                FFERRTAG( 'E','O','F',' ') ///< End of file
#define AVERROR_EXIT               FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted
#define AVERROR_EXTERNAL           FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library
#define AVERROR_FILTER_NOT_FOUND   FFERRTAG(0xF8,'F','I','L') ///< Filter not found
#define AVERROR_INVALIDDATA        FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input
#define AVERROR_MUXER_NOT_FOUND    FFERRTAG(0xF8,'M','U','X') ///< Muxer not found
#define AVERROR_OPTION_NOT_FOUND   FFERRTAG(0xF8,'O','P','T') ///< Option not found
#define AVERROR_PATCHWELCOME       FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome
#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found
#define AVERROR_STREAM_NOT_FOUND   FFERRTAG(0xF8,'S','T','R') ///< Stream not found
#define AVERROR_BUG2               FFERRTAG( 'B','U','G',' ')
#define AVERROR_UNKNOWN            FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library
#define AVERROR_EXPERIMENTAL       (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.
#define AVERROR_INPUT_CHANGED      (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED)
#define AVERROR_OUTPUT_CHANGED     (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED)
#define AVERROR_HTTP_BAD_REQUEST   FFERRTAG(0xF8,'4','0','0')
#define AVERROR_HTTP_UNAUTHORIZED  FFERRTAG(0xF8,'4','0','1')
#define AVERROR_HTTP_FORBIDDEN     FFERRTAG(0xF8,'4','0','3')
#define AVERROR_HTTP_NOT_FOUND     FFERRTAG(0xF8,'4','0','4')
#define AVERROR_HTTP_OTHER_4XX     FFERRTAG(0xF8,'4','X','X')
#define AVERROR_HTTP_SERVER_ERROR  FFERRTAG(0xF8,'5','X','X')

相关文章