2009-10-11 11 views
2

Java에서 WAV 사운드 (일부 사용자 정의 비디오 형식의 오디오 트랙)를 재생하고 싶지만, 클립을 사용하는 데 문제가 있습니다. 한 번에 하나의 인스턴스 만들을 수 있습니다. 따라서, 나는 평범한 옛 SourceDataLine 방식으로 전환했다.SourceDataLine 재생 일시 중지

이 컨텍스트에서 비디오를 일시 중지하고 일시 중지 해제 할 때 오디오를 일시 중지했다가 다시 시작하려고합니다. 운수 나쁘게. 예정)

sdl.open(); 
sdl.start(); 
sdl.write(dataBuffer); 
sdl.drain(); 
sdl.stop(); 

비동기 음성 스레드 기록에 차단되는 동안 정지() 또는 드레인 (발행 : I는 SDL에 중지()를 호출하는 경우, 재생 스레드 완전히 완료 사운드 버퍼는 비워 실제로 재생 위치가 느슨합니다.

차단 방법으로 SourceDataLine을 사용하여 일시 중지하거나 (write) (databuffer, skip, len) 쓰기를 사용하여 얼마나 많은 오디오가 재생되었는지 알 수있는 방법은 무엇입니까?

답변

4

의도 된 방법은 SourceDataLine의 stop()을 호출하여 일시 중지하고 start()을 호출하여 다시 시작하는 것입니다. SourceDataLine이 시작될 때 오디오 데이터를 제공하는 것을 중지하면 일반적으로 오류 조건으로 간주되는 버퍼 언더런이 발생합니다. 정지 상태 일 때만 데이터 공급을 중단하십시오.

drain()은 SourceDataLine에 기록한 모든 데이터가 재생되도록하려면 마지막에 호출해야합니다. "일시 중지"기능을 호출하지 마십시오!

더 나은 제어를 위해 작은 버퍼를 소스 데이터 라인에 써야하는 것이 맞습니다. 좋은 크기는 50ms 버퍼와 같습니다. open(AudioFormat, bufferSize) 메서드를 사용하여 버퍼 크기를 바이트 단위로 지정합니다 (예 : 44100Hz, 16 비트 스테레오의 경우 8820 바이트).

또한 Clip을 사용하는 것이 더 좋은 해결책이라고 할 수 있습니다. 클립에 start()와 stop()을 사용하면 많이 삼켜서는 안됩니다. 대부분의 Java Sound 구현은 Clip에 내부적으로 SourceDataLine을 사용하므로 기능적 차이가 없어야합니다. Java Sound는 한 번에 여러 클립을 재생할 수 있는지 확인해야합니다.

관련 문제