三缸海盗船大副 发表于 2023-11-22 14:05:26

怎样把ffmpeg api内的日志输出到文件中?

各位大佬,请问有没有配置把ffmpeg api内部报错的日志信息直接输出到文件中,而不是仅仅打屏呢?

孙悟空 发表于 2023-11-22 19:43:38

-report 参数可以
不过如果是调 API 的话,应该是可以参考一下 ffmpeg 的 report 实现

static void log_callback_report(void *ptr, int level, const char *fmt, va_list vl)
{
    va_list vl2;
    char line;
    static int print_prefix = 1;

    va_copy(vl2, vl);
    av_log_default_callback(ptr, level, fmt, vl);
    av_log_format_line(ptr, level, fmt, vl2, line, sizeof(line), &print_prefix);
    va_end(vl2);
    if (report_file_level >= level) {
      fputs(line, report_file);
      fflush(report_file);
    }
}

int init_report(const char *env, FILE **file)
{
    char *filename_template = NULL;
    char *key, *val;
    int ret, count = 0;
    int prog_loglevel, envlevel = 0;
    time_t now;
    struct tm *tm;
    AVBPrint filename;

    if (report_file) /* already opened */
      return 0;
    time(&now);
    tm = localtime(&now);

    while (env && *env) {
      if ((ret = av_opt_get_key_value(&env, "=", ":", 0, &key, &val)) < 0) {
            if (count)
                av_log(NULL, AV_LOG_ERROR,
                     "Failed to parse FFREPORT environment variable: %s\n",
                     av_err2str(ret));
            break;
      }
      if (*env)
            env++;
      count++;
      if (!strcmp(key, "file")) {
            av_free(filename_template);
            filename_template = val;
            val = NULL;
      } else if (!strcmp(key, "level")) {
            char *tail;
            report_file_level = strtol(val, &tail, 10);
            if (*tail) {
                av_log(NULL, AV_LOG_FATAL, "Invalid report file level\n");
                av_free(key);
                av_free(val);
                av_free(filename_template);
                return AVERROR(EINVAL);
            }
            envlevel = 1;
      } else {
            av_log(NULL, AV_LOG_ERROR, "Unknown key '%s' in FFREPORT\n", key);
      }
      av_free(val);
      av_free(key);
    }

    av_bprint_init(&filename, 0, AV_BPRINT_SIZE_AUTOMATIC);
    expand_filename_template(&filename,
                           av_x_if_null(filename_template, "%p-%t.log"), tm);
    av_free(filename_template);
    if (!av_bprint_is_complete(&filename)) {
      av_log(NULL, AV_LOG_ERROR, "Out of memory building report file name\n");
      return AVERROR(ENOMEM);
    }

    prog_loglevel = av_log_get_level();
    if (!envlevel)
      report_file_level = FFMAX(report_file_level, prog_loglevel);

    report_file = fopen(filename.str, "w");
    if (!report_file) {
      int ret = AVERROR(errno);
      av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
               filename.str, strerror(errno));
      return ret;
    }
    av_log_set_callback(log_callback_report);
    av_log(NULL, AV_LOG_INFO,
         "%s started on %04d-%02d-%02d at %02d:%02d:%02d\n"
         "Report written to \"%s\"\n"
         "Log level: %d\n",
         program_name,
         tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
         tm->tm_hour, tm->tm_min, tm->tm_sec,
         filename.str, report_file_level);
    av_bprint_finalize(&filename, NULL);

    if (file)
      *file = report_file;

    return 0;
}

三缸海盗船大副 发表于 2023-11-22 19:44:49

孙悟空 发表于 2023-11-22 19:43
-report 参数可以
不过如果是调 API 的话,应该是可以参考一下 ffmpeg 的 report 实现



好的,感谢大师兄!这就去读读这段代码。
页: [1]
查看完整版本: 怎样把ffmpeg api内的日志输出到文件中?