计算目录中 MP4 文件的总持续时间时出现 SLF4J 问题

Issue with SLF4J while calculating total duration of MP4 files in a directory

主要目标:

我的主要目标是从目录中获取所有 .mp4 文件的持续时间。所以,我用谷歌搜索并找到了 where one answer referred this 的完整代码。

导入错误:

当我在我的代码中获取必要的部分时,它在以下行中显示错误:

import com.xuggle.xuggler.IContainer;

之后,我从 here which I got from here 下载了 Xuggler。然后我得到以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at com.xuggle.ferry.JNILibrary.<clinit>(JNILibrary.java:42)
    at com.xuggle.ferry.FerryJNI.<clinit>(FerryJNI.java:14)
    at com.xuggle.ferry.Ferry.<clinit>(Ferry.java:25)
    at com.xuggle.xuggler.XugglerJNI.<clinit>(XugglerJNI.java:19)
    at com.xuggle.xuggler.IContainer.<clinit>(IContainer.java:1622)
    at videotimecalcualtioncoursera.MainFrame.calculateTime(MainFrame.java:116)
    at videotimecalcualtioncoursera.MainFrame.jButtonCalculateActionPerformed(MainFrame.java:284)
    at videotimecalcualtioncoursera.MainFrame.access[=11=]0(MainFrame.java:33)
    at videotimecalcualtioncoursera.MainFrame.actionPerformed(MainFrame.java:204)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6525)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6290)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4881)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Window.dispatchEventImpl(Window.java:2739)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    at java.awt.EventQueue.access0(EventQueue.java:97)
    at java.awt.EventQueue.run(EventQueue.java:697)
    at java.awt.EventQueue.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue.run(EventQueue.java:719)
    at java.awt.EventQueue.run(EventQueue.java:717)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    at java.net.URLClassLoader.run(URLClassLoader.java:372)
    at java.net.URLClassLoader.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 45 more

解决异常"java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory":

为了寻求上述异常的解决方案,我找到了this question并尝试了所有的三个解决方案,但没有成功。出现以下异常:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006ee76520, pid=10112, tid=3292
#
# JRE version: Java(TM) SE Runtime Environment (8.0_25-b18) (build 1.8.0_25-b18)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.25-b02 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [xuggle6026878147022032067.dll+0x736520]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# H:\Dropbox\JavaProjects\VideoTimeCalcualtionCoursera\hs_err_pid10112.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Java Result: 1

解决异常 "SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder":

寻找它的解决方案,我得到了this question,接受的答案除了删除错误流中的前三行外什么也做不了。

当时我尝试过的:

我尝试在我的项目中添加以下 .jar 文件:

  1. xuggle-xuggler-5.4.jar
  2. slf4j-api-1.6.4.jar / slf4j-api-1.7.12.jar
  3. slf4j-simple-1.7.6.jar / slf4j-simple-1.7.12.jar
  4. log4j-1.2.16.jar
  5. logback-classic-1.0.0.jar
  6. logback-core-1.0.6.jar
  7. slf4j-jdk14-1.7.12.jar
  8. slf4j-log4j12-1.7.12.jar

文件 - hs_err_pid10112.log:

您可以看到错误文件 here,我无法添加它,因为添加它会超过字符数限制。

如何解决这个问题?

注:

我已经遍历了以下问题:

  1. using Logback with slf4j [on hold]
  2. Given I'm stuck with SLF4J and java.util.Logging, what is optimal solution?
  3. How do I get a list of configured loggers using Jboss LogManager with SLF4J?
  4. How to write event logs into xml files with SLF4J or Logback?
  5. OpenJPA logging with slf4j on WebSphere
  6. Tomcat Logging With Slf4j and Log4j

我会尝试一一添加您的依赖项(同时注释掉依赖代码)。我的第一印象是其中一个库在其类路径上具有与 slf4j 不兼容的 versions/backends 功能。在您发现这一点之前,您不可能知道是哪一个。一旦你这样做了,你可以gradle/maven从你的类路径中排除一个冲突的东西。

您通常需要三个功能部件:

  1. 程序使用的API(slf4j-api)
  2. 使记录器实现适应 SLF4J 的桥接代码API(例如 slf4j-log4j12)这个必须与您使用的记录器相匹配。
  3. 记录器实现(例如 log4j)

一些罐子覆盖不止一个部分,例如logback 涵盖第 2 和第 3 部分,因为它本身实现了 slf4j,或者如果您使用 java util 日志记录,则不需要显式添加第 3 部分(它在 Java 运行时)

您还必须使用匹配版本的 slf4j 组件,例如不要将 slf4j-api-1.6.4.jar 与 slf4j-log4j12-1.7.12.jar 混合使用。

查看slf4j documentation了解详情。

我无法解决问题,但我可以通过其他方式实现我的目标。

我用过IBM的工具包。

  1. 已从 here 下载 IBM 的 API。
  2. 在我的代码中添加了以下代码片段:

    public long getDuration(File file) throws IOException {
        PlayerControl playerControl = PlayerFactory.createLightweightMPEG4Player();
        playerControl.open(file.getAbsolutePath());
        return playerControl.getDuration();
    }
    

因为我的目标只是获得持续时间,所以这不是有效的方法。

在我的 PC(core-i5、2.5GHz、6GB 内存、Win10)中,处理 60 个 .mp4 个文件花费了 42657ms,这些文件输出了 大约 6 小时 41 分钟持续时间.

如果需要,可以在my repository中查看。