如何关闭libavformat错误消息

时间:2011-10-16 19:44:46

标签: c ffmpeg libavcodec libavformat libav

默认情况下,libavformat将错误消息写入stderr,如:

Estimating duration from bitrate, this may be inaccurate

如何关闭它?或者更好的是,将它传递给我自己的整洁记录功能?

编辑:将stderr重定向到其他地方是不可接受的,因为我需要它用于其他日志记录,我只是希望libavformat不写入它。

4 个答案:

答案 0 :(得分:9)

查看代码,您可以通过为av_log函数编写自己的回调函数来更改行为。

来自libavutil/log.h中此功能的说明:

  

如果级别小于或等于,则将指定的消息发送到日志   到当前的av_log_level。默认情况下,将发送所有日志消息   标准错误。 可以通过设置不同的av_vlog回调来更改此行为   功能

API提供了一个函数,允许您定义自己的回调:

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

在您的情况下,您可以编写一个简单的回调函数来完全丢弃消息(或将它们重定向到专用日志等),而不会污染您的stderr流。

答案 1 :(得分:6)

尝试av_log_set_level(level)

答案 2 :(得分:3)

  1. 包括此头文件

    #include <libavutil/log.h>
    
  2. 添加此代码将禁用日志

    av_log_set_level(AV_LOG_QUIET);
    

答案 3 :(得分:1)

您可以将它们重定向到自定义文件,它会重定向所有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,但如果其代码不可更改,您可以在调用库的api之前临时将cerr重定向到文件,并再次将其重定向到原始cerr。(但这是丑陋的方式)