Как я могу отключить сообщения об ошибках libavformat

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

Estimating duration from bitrate, this may be inaccurate

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

Редактировать: перенаправление stderr в другое место неприемлемо, так как мне это нужно для других целей ведения журнала, я просто хочу, чтобы libavformat не писал в него.


person amrhassan    schedule 16.10.2011    source источник
comment
См. либо stackoverflow.com/questions /5095839/ или stackoverflow.com/questions/573724/   -  person Martin Beckett    schedule 16.10.2011
comment
Я не хочу перенаправлять весь вывод stderr программы, у меня есть функции ведения журнала, записывающие его в аккуратно отформатированном виде. Я просто хочу, чтобы libavformat не писал в него.   -  person amrhassan    schedule 16.10.2011
comment
Что именно пишет в stderr? Это первый раз, когда я слышу, что библиотека libavcodec отправляет ошибки в stderr (мой опыт работы с этой библиотекой невелик).   -  person BЈовић    schedule 17.10.2011
comment
Я не совсем уверен. Он выдает сообщения об ошибках случайным образом, как то, что я упоминал выше. Это может быть даже libavcodec, а не libavformat. Трудно отследить, так как никакой дополнительной информации не дается.   -  person amrhassan    schedule 17.10.2011


Ответы (4)


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

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

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

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

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

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

person Ben    schedule 16.10.2011
comment
Ударь меня. Вы также можете использовать av_log_set_level(AV_LOG_QUIET), чтобы отключить все журналы. - person Dan Cruz; 17.10.2011

Попробуйте av_log_set_level(level)!

person cpl    schedule 27.10.2011

  1. включить этот заголовочный файл

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

    av_log_set_level(AV_LOG_QUIET);
    
person bingyi    schedule 10.09.2018

Вы можете перенаправить их в пользовательский файл, он перенаправит все записи 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 (однако это некрасивый способ)

person Dennis Ritchie    schedule 16.10.2011
comment
... и все остальные cerr сообщения. Я не думаю, что это то, чего хотел ОП. - person BЈовић; 16.10.2011