2014-10-23 9 views
3

mp3와 ogg 플레이어를 모두 구현해야하는 멀티 플랫폼 데스크톱 응용 프로그램에서 작업하고 있습니다. 이제 mp3 부분이 좋아졌지만 ogg 재생을 시도하는 것이 효과가 없습니다. ... 나는 javazoom.jlgui의 BasicPlayer을 사용하고 다음하고Java를 사용하여 ogg를 재생할 때 검색을 적용해야합니다.

내 또 다른 OGG을 추구 구현하는 기능을 추구 추가 할 수있는 방법이

/** 
* Skip bytes in the File inputstream. It will skip N frames matching to 
* bytes, so it will never skip given bytes length exactly. 
* 
* @param bytes 
* @return value>0 for File and value=0 for URL and InputStream 
* @throws BasicPlayerException 
* @throws IOException 
*/ 
protected long skipBytes(long bytes) throws BasicPlayerException, NullPointerException, IOException { 

    long totalSkipped = 0; 

    if (m_dataSource instanceof File) { 
     log.info("Bytes to skip : " + bytes); 
     int previousStatus = m_status; 
     m_status = SEEKING; 
     long skipped = 0; 

     synchronized (m_audioInputStream) { 
      notifyEvent(BasicPlayerEvent.SEEKING, getEncodedStreamPosition(), -1, null); 
      initAudioInputStream(); 

      if (m_audioInputStream != null) { 
       // Loop until bytes are really skipped. 
       while (totalSkipped < (bytes - SKIP_INACCURACY_SIZE)) { 
        skipped = m_audioInputStream.skip(bytes - totalSkipped); 
        if (skipped == 0) { 
         break; 
        } 

        totalSkipped = totalSkipped + skipped; 
        log.info("Skipped : " + totalSkipped + "/" + bytes); 

        if (totalSkipped == -1) { 
         throw new BasicPlayerException(BasicPlayerException.SKIPNOTSUPPORTED); 
        } 
       } 
      } 
     } 

     notifyEvent(BasicPlayerEvent.SEEKED, getEncodedStreamPosition(), -1, null); 
     m_status = OPENED; 

     if (previousStatus == PLAYING) { 
      startPlayback(); 
     } else if (previousStatus == PAUSED) { 
      startPlayback(); 
      pausePlayback(); 
     } 
    } 

    return totalSkipped; 
} 

기능을 추구인가? 사전에 감사합니다 ...

,

이 어떻게 작동하는지에 대해 잘 몰라,하지만 괜찮 중지, OGG 재생, 일시 정지에서 를 중지 추구를 위해 포함 MP3, 오디오 재생, 일시 정지를 위해 잘 작동하지만, 추구 오디오 재생이 처음부터 시작될 때 문제가된다.

나는, BasicPlayer API의 코드 소스의 일부를 내가 깊이 세부 사항을 확인 http://www.javazoom.net/jlgui/sources/basicplayer3.0.zip

는 jlgui3.0 플레이어는 오그 재생을 추구 구현되지 않은이 코드를 사용하여 구현 변경하지 않은 그들은 그것을 언급했다. 따라서 현재 코드는 Ogg 연주를위한 별도의 탐색 기능으로 추가해야하며 재생 오디오가 Ogg 일 때마다 현재 seek() 대신 사용하십시오.

나는 어떻게 그렇게 할 수 있을지 모르겠다. 좋은 소스를 참조하고 동일한 방법을 구현하는 쉬운 방법 ...

+0

* "OGG 플레이에서 추구하는 것은 작동하지 않습니다"*이 뭐하는 거지? 아니면하지? 또한 'else if (previousStatus == PAUSED) {startPlayback(); pausePlayback(); }'? (나는 당신의 프로그램이 어떻게 작동하는지 알지 못하지만'시작'->'일시 정지'는 의심 스럽다.) – Radiodef

+0

@Radiodef : Question edited ... – Fahad

+0

나는 이것이 간단하고 직선적 인 작업이 될 것이라고 생각하지 않는다. 추구를 구현하십시오. OGG 형식은 매우 다르며 탐색을위한 기본 지원이 정확하지 않은 것 같습니다. – helmy

답변

1

이 라이브러리는 사용자의 필요에 충분하지 않을 수도 있습니다. jlGui의 소스 코드 (아래 붙여 넣기)를 보면 seeking은 .mp3 파일과 .wav 파일에서만 지원됩니다.

또한 고정 된 바이트 수만큼 앞으로 만 건너 뛰기 때문에 논리가 다소 순진합니다. PCM 형식의 .wav 파일의 경우 건너 뛴 바이트 수는 건너 뛴 시간에 항상 비례하지만 가변 비트 전송률 .mp3 파일의 경우 건너 뛸 시간은 파일의 다른 지점에서 순간 비트 전송률에 따라 달라집니다 . Ogg Vorbis는 멀티플렉싱을 지원하는 컨테이너 형식으로, 파일을 앞뒤로 건너 뛰고 디코더를 다시 동기화하는 것보다 훨씬 복잡합니다.

대신 JavaSound 또는 JavaFX API를 사용하는 것이 좋습니다. JavaSound 또는 JavaFX API는 바이트 오프셋이 아닌 오디오 파일을 재생하고 제공 시간을 검색 할 수 있습니다. jlGui에서

:

protected void processSeek(double rate) 
{ 
    try 
    { 
     if ((audioInfo != null) && (audioInfo.containsKey("audio.type"))) 
     { 
      String type = (String) audioInfo.get("audio.type"); 
      // Seek support for MP3. 
      if ((type.equalsIgnoreCase("mp3")) && (audioInfo.containsKey("audio.length.bytes"))) 
      { 
       long skipBytes = (long) Math.round(((Integer) audioInfo.get("audio.length.bytes")).intValue() * rate); 
       log.debug("Seek value (MP3) : " + skipBytes); 
       theSoundPlayer.seek(skipBytes); 
      } 
      // Seek support for WAV. 
      else if ((type.equalsIgnoreCase("wave")) && (audioInfo.containsKey("audio.length.bytes"))) 
      { 
       long skipBytes = (long) Math.round(((Integer) audioInfo.get("audio.length.bytes")).intValue() * rate); 
       log.debug("Seek value (WAVE) : " + skipBytes); 
       theSoundPlayer.seek(skipBytes); 
      } 
      else posValueJump = false; 
     } 
     else posValueJump = false; 
    } 
    catch (BasicPlayerException ioe) 
    { 
     log.error("Cannot skip", ioe); 
     posValueJump = false; 
    } 
} 
+0

play ogg with javafx : http://stackoverflow.com/a/23472480/62255 – jedierikb