xuggle-xuggler 5.4 NullPointerException编码音频时 - java

今天,我正在使用Xuggler库,并且尝试捕获可以完美运行的屏幕。但是我还想将麦克风中的音频添加到捕获的视频文件中。这并不像我预期的那么容易,现在我陷入了这个奇怪的NullPointerException。

这是我的代码(缩写):

AudioFormat format = new AudioFormat(8000.0F, 16, 1, true, false);
writer.addAudioStream(1, 0, 1, (int) format.getSampleRate());
TargetDataLine line = getTargetDataLineForRecord(format);
final int frameSizeInBytes = format.getFrameSize();
final int bufferLengthInFrames = line.getBufferSize() / 8;
final int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes;
final byte[] buf = new byte[bufferLengthInBytes];
final long startTime = System.nanoTime();
...
while (recording) {
    int numBytesRead = 0;
    numBytesRead = line.read(buf, 0, bufferLengthInBytes);
    int numSamplesRead = numBytesRead / 2;
    short[] audioSamples = new short[numSamplesRead];
    if (format.isBigEndian()) {
        for (int i = 0; i < numSamplesRead; i++) {
            audioSamples[i] = (short) ((buf[2 * i] << 8) | buf[2 * i + 1]);
        }
    } else {
        for (int i = 0; i < numSamplesRead; i++) {
            audioSamples[i] = (short) ((buf[2 * i + 1] << 8) | buf[2 * i]);
        }
    }
    writer.encodeAudio(1, audioSamples, System.nanoTime() - startTime, TimeUnit.NANOSECONDS); // CaptureScreen.java:118
    }
writer.close();

这是NullPointerException:

java.lang.NullPointerException
    at com.xuggle.mediatool.MediaWriter.encodeAudio(MediaWriter.java:923)
    at exe.media.CaptureScreen.captureScreen(CaptureScreen.java:118)
    at exe.media.CaptureScreen.main(CaptureScreen.java:43)

我遇到的问题是在此行(118):

writer.encodeAudio(1, audioSamples, System.nanoTime() - startTime, TimeUnit.NANOSECONDS);

由于某种原因,当我尝试编码音频样本时,xuggle抛出NullPointerException,我不确定这是一个错误还是只是我在做一些愚蠢的事情,但无论如何我都无法解决。

为了更好地理解,我已将所有代码发布在pastebin上,其中包括用于捕获屏幕的代码,以及试图记录音频的代码。

这些是我包括的罐子:
commons-cli-1.2.jar
logback-classic-1.1.2.jar
logback-core-1.1.2.jar
xuggle-xuggler-arch-x86_x64-w64-mingw32.jar *
xuggle-xuggler-noarch-5.4.jar *

(“ *”表示我没有从其主要位置下载jar。

在此先感谢您,并记住任何有帮助的答案都会获得50 rep赏金!

参考方案

我假设你有line.open(format);和line.start();某处?

您可能需要确保您有音频样本:if(audioSamples.length> 0)writer.encodeAudio ...

另外,您可能想要添加slf4j-api-1.6.4.jar和slf4j-simple-1.6.4.jar以获得有关Xuggler错误的更多详细信息。

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…