Как я могу отключить сообщения об ошибках libavformat - PullRequest
9 голосов
/ 16 октября 2011

По умолчанию libavformat записывает сообщения об ошибках в stderr, например:

Estimating duration from bitrate, this may be inaccurate

Как его отключить?или, что еще лучше, направьте его в мою собственную функцию аккуратного ведения журнала?

Edit: Перенаправление stderr куда-либо еще недопустимо, так как оно мне нужно для других целей ведения журнала, я просто хочу, чтобы libavformat ненапиши ему.

Ответы [ 4 ]

9 голосов
/ 17 октября 2011

Просматривая код, вы можете изменить поведение, написав собственную функцию обратного вызова для функции av_log.

Из описания этой функции в libavutil / log.h :

Отправить указанное сообщение в журнал, если уровень ниже или равен на текущий av_log_level. По умолчанию все сообщения регистрации отправляются STDERR. Это поведение можно изменить, установив другой обратный вызов av_vlog функция.

API предоставляет функцию, которая позволит вам определить свой собственный обратный вызов:

void av_log_set_callback(void (*)(void*, int, const char*, va_list));

В вашем случае вы могли бы написать простую функцию обратного вызова, которая полностью отбрасывает сообщения (или перенаправляет их в выделенный журнал и т. Д.), Не портя поток stderr.

6 голосов
/ 27 октября 2011

Дайте av_log_set_level(level) попробовать!

3 голосов
/ 10 сентября 2018
  1. включить этот заголовочный файл

    #include <libavutil/log.h>
    
  2. добавить этот код отключит журнал

    av_log_set_level(AV_LOG_QUIET);
    
1 голос
/ 16 октября 2011

Вы можете перенаправить их в пользовательский файл, он перенаправит все записи cerr :

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
  ofstream file("file.txt");

  streambuf *old_cerr = cerr.rdbuf();

  cerr.rdbuf (file.rdbuf());

  cerr << "test test test" << endl; // writes to file.txt

  // ...

  cerr.rdbuf (old_cerr); // restore orginal cerr

  return 0;
}

Редактировать: После редактирования вопроса я предупреждаю о приведенном выше коде, что он перенаправит весь cerr входной поток на file.txt

Я не знаком с libavformat, но если его код неизменен, вы можете временно перенаправить cerr в файл перед вызовом API библиотеки и снова перенаправить на исходный cerr (однако это уродливый способ)

...