今天我正在使用 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 代表赏金!