如何关闭 libavformat 错误消息

Posted

技术标签:

【中文标题】如何关闭 libavformat 错误消息【英文标题】:How can I turn libavformat error messages off 【发布时间】:2011-12-08 20:44:58 【问题描述】:

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

Estimating duration from bitrate, this may be inaccurate

如何关闭它?或者更好的是,将它通过管道传输到我自己整洁的日志记录函数中?

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

【问题讨论】:

查看***.com/questions/5095839/… 或***.com/questions/573724/… 我不想重定向程序 stderr 的整个输出,我的日志记录函数以一种简洁的格式写入它。我只是希望 libavformat 不写入它。 究竟向标准错误写入了什么?这是我第一次听到 libavcodec 库向 stderr 发送错误(我对该库的经验并不丰富)。 我不太确定。它像我上面提到的那样随意抛出错误消息。它甚至可能是 libavcodec 而不是 libavformat。由于没有提供更多信息,因此很难追踪。 【参考方案1】:

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

来自libavutil/log.h中对该函数的描述:

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

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

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

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

【讨论】:

打败我。您也可以使用av_log_set_level(AV_LOG_QUIET) 来静默所有日志记录。【参考方案2】:

试试av_log_set_level(level)

【讨论】:

【参考方案3】:

    包含这个头文件

    #include <libavutil/log.h>
    

    添加此代码将禁用日志

    av_log_set_level(AV_LOG_QUIET);
    

【讨论】:

【参考方案4】:

您可以将它们重定向到自定义文件,它将重定向所有 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。(但这是丑陋的方式)

【讨论】:

... 和所有其他 cerr 消息。我认为这不是 OP 想要的。

以上是关于如何关闭 libavformat 错误消息的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg 错误:选择了模式类型“glob”,但此 libavformat 构建不支持 glob

在 Visual Studio 2010 中构建任何 ffmpeg 项目时出现错误链接 2001 libavformat.a(tls_schannel.o)

如何实现“return true;”?错误:“消息端口在收到响应之前关闭。”

如何编码以防止此错误消息来自正则表达式并通过单击关闭按钮随时关闭该表单?

如何使用 c++ 从其他应用程序关闭设备启动时生成的错误消息框?

打开错误文件的错误消息[关闭]