2014-06-08 7 views
3

오늘은 Xuggler 라이브러리를 사용하면서 완벽하게 작동하는 화면 캡처를 시도했습니다. 그러나 마이크에서 캡처 한 비디오 파일에 오디오를 추가하려고했습니다. 이것은 예상했던 것만 큼 쉽지 않았으며, 이제는이 이상한 NullPointerException으로 인해 막혀 있습니다. xuggle-xuggler 5.4 오디오 인코딩시 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); 

오디오 샘플을 인코딩하려고 할 때 xiggle이 NullPointerException을 발생시키는 이유는 무엇입니까? 버그 또는 그냥 바보 같은 일을하고 있지만 어쨌든 그것을 해결할 수 없습니다.

더 나은 이해를 위해 모든 코드를 pastebin에 올렸으며 여기에는 내 화면 캡처 용 코드와 오디오 녹음을 시도하는 코드가 포함되어 있습니다.

이 내가 포함 한 항아리입니다
공유지-CLI-1.2.jar
logback 고전-1.1.2.jar
logback 코어-1.1.2.jar는
xuggle-xuggler-arch-x86_x64-w64-mingw32.jar *
xuggle-xuggler-noarch-5.4.jar *

합니다 ('*'는.이 차의 위치에서 나는 항아리를 다운로드하지 않은 사전 에서

감사를 의미하고, 어떤 도움이 응답 위스콘신 기억 50 rep bounty 보상을받을 수 있습니다!

답변

0

line.open (형식)이 있다고 가정합니다. 및 line.start(); 어딘가에?

당신은 audiosamples이 있는지 확인해야 할 수 있습니다

: (audioSamples.length> 0) writer.encodeAudio ...

또한, 당신은 SLF4J-API-1.6.4.jar를 추가 할 수 있습니다 경우 Xuggler의 오류에 대한 자세한 내용은 slf4j-simple-1.6.4.jar를 참조하십시오.