我正在尝试在 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()
打开文件并写入文件。
我在 64 位 Windows 7 机器上使用 NW.js 和 WebChimera.js 编译为 32 位 Visual Studio 2013。
有什么想法吗?
最佳答案
我今天遇到了这个问题。我无法使用 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 上,您可能希望使用设置了 FILE_SHARE_READ 标志的 CreateFile,并使用 WriteFile,以便外部文本编辑器可以在实时记录时查看文件。如果这样做,请查看 vsprintf_s 而不是 vfprintf 来填充一个字符缓冲区,然后您将在 logcb 方法中将其传递给 WriteFile。
关于c++ - LibVLC 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31334594/