2013-10-14 2 views
0

audiotrack을 통해 pcm 데이터를 재생하려고 할 때 jLayer lib를 사용하여 mp3를 디코딩하면 많은 오디오 왜곡이 발생합니다. audiotrack에서 PCm 데이터 재생

내 디코더 코드 :

public static void decode(String path, int startMs, int maxMs) 
       throws IOException { 
       ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024); 

       float totalMs = 0; 
       boolean seeking = true; 

       File file = new File(path); 
       System.out.println("the data "+path); 
       InputStream inputStream = new BufferedInputStream(new FileInputStream(file), 8 * 1024); 
       try { 
       Bitstream bitstream = new Bitstream(inputStream); 
       Decoder decoder = new Decoder(); 

       boolean done = false; 
       while (! done) { 
        javazoom.jl.decoder.Header frameHeader = bitstream.readFrame(); 
        if (frameHeader == null) { 
        done = true;  
        } else { 
        totalMs += frameHeader.ms_per_frame(); 

        if (totalMs >= startMs) { 
         seeking = false; 
        } 

        if (! seeking) { 
         SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream); 

         if (output.getSampleFrequency() != 44100 
          || output.getChannelCount() != 2) { 
         // throw new com.mindtherobot.libs.mpg.DecoderException("mono or non-44100 MP3 not supported"); 
         } 

         short[] pcm = output.getBuffer(); 
         byte[] bs; 
         int index=0; 
         ByteBuffer buffer; 
         buffer = ByteBuffer.allocate(2*pcm.length); 

         for (short s : pcm) {  
//      outStream.write(s & 0xff);  
//      outStream.write((s >> 8) & 0xff); 


         buffer.putShort(s); 



         }  

         byte[] dataaudio = buffer.array(); 

         //return buffer.array(); 






         track.write(dataaudio, 0, dataaudio.length); 

        } 

        if (totalMs >= (startMs + maxMs)) { 
         done = true; 
        } 
        } 
        bitstream.closeFrame(); 
       } 

       //return outStream.toByteArray(); 
       } catch (BitstreamException e) { 
       throw new IOException("Bitstream error: " + e); 
       } catch (DecoderException e) { 
       Log.w("data", "Decoder error", e); 
       ; 
       } finally { 
       // IOUtils.safeClose(inputStream);  
       } 
      } 
+0

왜 MediaPlayer를 사용하지 않으십니까? 자동으로 오디오 파일을 디코딩하여 다시 재생합니다. – tiguchi

+0

답장을 보내 주셔서 감사합니다. 실제로 다른 장치로 데이터를 스트리밍하고 싶습니다 ... – user2705259

+0

나는 어쩌면 네이티브 MP3 디코더 라이브러리에 시도해보아야 할 것입니다. Java로 작성된 디코더보다 빠르며 오디오 왜곡 문제도 없앨 수 있습니다. – tiguchi

답변

0

난 당신이 변환하지 않는 것이 좋을 것 당신의 [] [] 바이트 만 쓸 짧게 짧게 []를 AudioTrack에 즉 track.write (PCM 전화 , 0, pcm.length) 대신에 track.write (dataaudio, 0, dataaudio.length)를 사용합니다.

JLayer를 사용하여 MP3 파일을 읽고 데이터를 처리 한 다음 AudioTrack으로 출력하는 Android 용 오디오 프로세서를 작성했습니다. 데이터 처리를하지 않고 JLayer의 데이터를 AudioTrack에 보내면 내 Nexus7에서 실제로 재생됩니다. 그러나 내 처리 (피치 쉬프트 및/또는 시간 압축)를 수행 할 때 짜증나는 딱딱 소리가납니다.

이상하게도, JLayer에서 한 프레임을 읽어 AudioTrack (처리 없음)으로 보내면 소리가 잘 들리지만 JLayer에서 두 프레임을 읽어서 AudioTrack (처리 없음)로 보내면 난 딱딱 거리는 소리가납니다!

나는 안드로이드 (기본적으로 동일한 코드를 실행하지만 내 랩톱에서 사운드를 재생하거나 WAV 파일로 변환하는 AudioTrack의 자체 구현 더미로 실행)를 시작했습니다. & 결과는 지금까지 매우 있습니다 이상한.

앞으로 나아 갔다면, 어떻게하고 있는지 알고 싶을 것입니다.