编码音频时的 xuggle-xuggler 5.4 NullPointerException

Posted

技术标签:

【中文标题】编码音频时的 xuggle-xuggler 5.4 NullPointerException【英文标题】:xuggle-xuggler 5.4 NullPointerException when encoding audio 【发布时间】:2014-07-29 10:13:55 【问题描述】:

今天我正在使用 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.jarxuggle-xuggler-arch-x86_x64-w64-mingw32.jar*xuggle-xuggler-noarch-5.4.jar*

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

提前感谢并记住任何有用的答案都将获得 50 代表赏金奖励

【问题讨论】:

【参考方案1】:

我假设你有 line.open(format);和 line.start();什么地方?

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

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

【讨论】:

以上是关于编码音频时的 xuggle-xuggler 5.4 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

Audio音频开发音频基础知识及PCM技术详解

Audio音频开发音频基础知识及PCM技术详解

Laravel 5.4 验证请求,如何处理更新时的唯一验证?

5.4心得

使用 Solr 5.4 语音搜索邮政编码

计算机网络—— 物理层(45):编码与调制信道的极限容量