1

我正在尝试在 LibVLC 中设置日志记录,但遇到了一些问题。

我使用的函数是 libvlc_log_set_file,这里是文档: LibVLC logging docs

这是我现在拥有的代码:

//header
private:
    FILE * logFile;

//source
logFile = fopen(path.c_str(), "w");
if(logFile != NULL)
{
    libvlc_log_set_file(_libvlc_instance, logFile);
}

在线libvlc_log_set_file我收到此错误,“nw.exe 中 0x77559E33 (ntdll.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0x00000014。”

我可以fputs()很好地打开和写入文件。

我正在使用 NW.js 和 WebChimera.js 在 64 位 Windows 7 机器上使用 Visual Studio 2013 编译为 32 位。

有任何想法吗?

4

1 回答 1

0

我今天遇到了这个确切的问题。我无法使用 libvlc_log_set_file 解决它。相反,我选择使用 libvlc_log_set 来设置回调并使用该方法写入日志文件。这是一个示例,它显示了需要做什么。我不推荐全局文件指针,它只是为了这个快速示例。

注意:logpath 是一个 const char*,其中包含您的日志文件的路径。此外,您可能希望使用flockfile 来确保该线程的安全。您还可以在其中使用 switch 语句来处理 LIBVLC_NOTICE、LIBVLC_ERROR、LIBVLC_WARNING 和 LIBVLC_DEBUG 的级别参数,从而为您的日志记录提供一些粒度。

bool g_loggingEnabled = true;
FILE* g_logfp = nullptr;

void logcb(void *data, int level, const libvlc_log_t *ctx, const char *fmt, va_list args)
{
    if (!g_loggingEnabled) return;

    if (g_logfp == nullptr)
    {
        errno_t err = fopen_s(&g_logfp, logpath, "w");

        if (err != 0)
        {
            g_loggingEnabled = false;
            return;
        }
    }

    vfprintf(g_logfp, fmt, args);
}

附录:在 Windows 上,您可能希望使用 CreateFile 而不是设置 FILE_SHARE_READ 标志并使用 WriteFile 以便外部文本编辑器可以在实时记录时查看文件。如果这样做,请查看 vsprintf_s 而不是 vfprintf 来填充字符缓冲区,然后您将在 logcb 方法中将其传递给 WriteFile。

于 2015-07-14T23:29:01.730 回答