Как я могу найти значение кода ошибки FFmpeg? - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблема с использованием FFMPEG.

avcodec_send_packet() возвращает код ошибки -12.

Я пытаюсь найти значение -12.

Я нашел эту страницу, но не могу понять расчет для -12:

Как узнать, что означает этот код ошибки ffmpeg?

Может кто-нибудь помочьменя?

Я использую DXVA2 для декодирования.и функция avcodec_send_packet() возвращает -12 после 20-го кадра.

возврат 20-го кадра

image

возврат 21-го кадра

image

1 Ответ

0 голосов
/ 19 февраля 2019

Если вы прочитали документацию avcodec_send_packet() , там написано:

Возвращает

0 в случае успеха,в противном случае отрицательный код ошибки: AVERROR(EAGAIN): ввод не принят в текущем состоянии - пользователь должен прочитать вывод с помощью avcodec_receive_frame() (как только все выходные данные прочитаны, пакет должен быть повторно отправлен, и вызов не будет завершен с EAGAIN),AVERROR_EOF: декодер сброшен, и на него нельзя отправлять новые пакеты (также возвращается, если отправлено более 1 пакета очистки) 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().

Теперь, если вы пойдете, посмотрите на коды ошибок POSIX, определенные вВ заголовке errno.h вашего компилятора вы обнаружите, что [-]12 определен как ENOMEM, что является одним из возможных значений, упомянутых в документации avcodec_send_packet():

AVERROR(ENOMEM):не удалось добавить пакет во внутреннюю очередь или аналогичные другие ошибки: допустимые ошибки декодирования

Что, согласно этой версии error.h (в отличие от этой версии) говорит:

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

чтНа скриншотах, которые вы показали, проверяется возвращаемое значение avcodec_send_packet() для AVERROR_INVALIDDATA вместо AVERROR_NOMEM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...