如何关闭 libavformat 错误消息

发布于 2024-12-10 02:02:16 字数 235 浏览 0 评论 0原文

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

根据比特率估计持续时间,这可能不准确

如何将其关闭?或者更好的是,将其传输到我自己的简洁的日志记录功能?

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

By default, libavformat writes error messages to stderr, Like:

Estimating duration from bitrate, this may be inaccurate

How can I turn it off? or better yet, pipe it to my own neat logging function?

Edit: Redirecting stderr to somewhere else is not acceptable since I need it for other logging purposes, I just want libavformat to not write to it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

樱花落人离去 2024-12-17 02:02:16

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

libavutil/log 中对该函数的描述。 h:

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

,允许您定义自己的回调:

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

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

Looking through the code, it appears you can change the behavior by writing your own callback function for the av_log function.

From the description of this function in libavutil/log.h:

Send the specified message to the log if the level is less than or equal
to the current av_log_level. By default, all logging messages are sent to
stderr. This behavior can be altered by setting a different av_vlog callback
function.

The API provides a function that will allow you to define your own callback:

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

In your case, you could write a simple callback function that discards the messages altogether (or redirects them to a dedicated log, etc.) without tainting your stderr stream.

久隐师 2024-12-17 02:02:16

尝试一下av_log_set_level(level)

Give av_log_set_level(level) a try!

小ぇ时光︴ 2024-12-17 02:02:16
  1. 包含此头文件

    #include ;
    
  2. 添加此代码将禁用日志

    av_log_set_level(AV_LOG_QUIET);
    
  1. include this header file

    #include <libavutil/log.h>
    
  2. add this code will disable the log

    av_log_set_level(AV_LOG_QUIET);
    
抽个烟儿 2024-12-17 02:02:16

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

You can redirect them to a custom file, it will redirect all cerr entry:

#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;
}

Edit: After editing the question, i warn about above code that it will redirect all cerr entry stream to file.txt

I'm not familiar with libavformat, but if its code is unchangeable, you can temporary redirect cerr to a file before calling library's api and redirect it to original cerr again.(However this is ugly way)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文