2014-09-06 2 views
0

현재 AudioTrack으로 작업 중입니다. mp3 파일을로드하고 재생 중입니다. 그러나 장치에 따라 음악은 절반의 속도 또는 정상 속도로 재생됩니다.AudioTrack이 다른 장치에서 일관성없는 속도로 재생 중

내 코드 :

AudioTrack track= new AudioTrack(AudioManager.STREAM_MUSIC, 
    sampleRate, 
    AudioFormat.CHANNEL_CONFIGURATION_MONO, 
    AudioFormat.ENCODING_PCM_16BIT, 
    initBuffer, 
    AudioTrack.MODE_STREAM); 

sampleRateAudioFormatinitBufferAudioTrack.getMinBufferSize()에서 버퍼 크기에 의해 샘플 속도 리턴합니다.

나는 샘플링 속도를 바꾸려고했지만 차이는 없다. 버퍼 크기도 영향을 미치지 않습니다.

사실, CHANNEL_CONFIGURATION_STEREO으로 전환하면 느린 장치에서 정상 속도로 음악이 재생되지만 정상 속도의 두 배로 재생하면 정상적으로 재생됩니다. 내 문제는 모든 기기가 정상 속도로 재생되기를 바랍니다.

제안 사항?

이 스레드를 읽었습니다 : Android AudioTrack slow playback,하지만 어떤 장치가 모노 또는 스테레오로 재생되어야하는지 알아내는 방법을 알려주지는 않습니다. 정상 속도로

장치 : 4.2.2

BTW URBANO 4.2.2, 절반의 속도로 4.3

장치 갤럭시 S4, 갤럭시 S4 4.2.2, Experia Z, 나는 재생 MediaPlayer 사용할 수 없습니다 . AudioTrack은 맞춤식 플레이어에 포함되어 있으며이를 추출 할 때 오디오 데이터를 작성해야합니다. MediaPlayer 트릭을하지 않습니다.

감사합니다.

+0

[andraudio] (http://music.columbia.edu/mailman/listinfo/andraudio)에 가입하여 요청하면 도움이 될 수 있습니다. – Jakar

+0

감사! 나는 거기도 확인 할 것이다 – Herve

답변

0

마침내 내 문제가 해결되었습니다. 최고의 수정은 아니지만 적어도 작동합니다.

관심있는 사람들을 위해 BufferInfo 크기를 읽었으며이를 기반으로 재생해야하는 재생 속도를 결정하십시오. 기본적으로 재생이 느릴 때 크기는 표준 속도 재생보다 두 배 더 큽니다. 그냥 추측하지만 MediaCodec은 스테레오 구성을 위해 데이터를 복제 할 수 있습니다.

1

이 시도 :

track.setPlaybackRate(88200); 
track.play(); 

그것은 정상 속도로 재생한다

+0

죄송합니다, 지금은 장치에서 테스트 할 수 없지만 작동하지 않는 것 같습니다. 재생 속도를 변경하면 속도가 바뀌지 만 원하는 방식으로 변경되지는 않습니다. 내 문제는 다른 장치가 다른 속도로 재생된다는 것입니다. 88200이 모든 장치에서 나에게 적절한 속도를 줄 이유가 있습니까? – Herve

+0

88200은 훨씬 높은 하드웨어 지연을 제공합니다. –

+0

실제 장치에서 테스트했는데 여전히 느립니다 ... – Herve

0

AudioTrack 만이 MP3 재치 직접, 당신은 PCM으로 MP3를 변환하거나 뭔가를 사용할 필요가 AudioTrack 재생할 수 없습니다, PCM 오디오 데이터를 수 else (예 : MediaPlayer) AudioTrack보다.

+0

죄송합니다. 언급하지 않으 셨습니다. 이미 파일을 읽으려고합니다. – Herve

0

이것은 다소 까다 롭습니다 만 여기 adbALSA을 사용하여 수행 할 수있는 작업이 있습니다.
Android는 내부적으로 ALSA을 사용합니다. ALSA을 가져야한다

귀하의 장치는, 시도 :

[email protected]:/$ adb shell cat /proc/asound/version 
Advanced Linux Sound Architecture Driver Version 1.0.25. 

그냥 Reading ALSA Device names를보십시오.
모든 장치 (A 카드의 세분)는 캡처재생 구성 요소를 가지고있다. 카드 0 장치 /proc/asound/card0/pcm1p/proc/asound/card0/pcm1p처럼

1 pcm1p이 재생하고 pcm1c가 (녹음) 촬영입니다. 장치가 adb를 사용하여

  1. 액세스 :

  2. [email protected]:/$ adb shell 
    [email protected]:/$: 
    
    이 장치를 식별는 :

    그래서 당신은 /proc/asound/pcm 당신에게 긴 목록을 줄 것이다 참조하십시오. 상기로부터

    [email protected]:/$: cat /proc/asound/pcm          
    00-00: MultiMedia1 (*) : : playback 1 : capture 1 
    00-01: MultiMedia2 (*) : : playback 1 : capture 1 
    00-02: CS-Voice (*) : : playback 1 : capture 1 
    

    나는 멀티미디어 재생을위한 00-00: MultiMedia1 (*)card0로하고 device0 찾을 수 있습니다.

  3. 얻기 재생 매개 변수 :

    재생하여로드 된 MP3 파일 표준 음악 플레이어 응용 프로그램을 사용하여.
    노래가 재생되는 동안.
    문제 다음 card0, device0에 대한 명령 (페이지 - 재생), 및 subdevice0

    [email protected]:/$: cat /proc/asound/card0/pcm0p/sub0/hw_params    
    access: RW_INTERLEAVED 
    format: S16_LE 
    subformat: STD 
    channels: 2 
    rate: 44100 (44100/1) 
    period_size: 1920 
    buffer_size: 3840 
    

    그래서 당신은 AudioTrack track= new AudioTrack(...); 를 호출 할 때 장치가 개방에있을 때 위의 값은 볼 수 같은 값을 사용해보십시오 (오디오 재생 중).

    당신이 (같은 pcm1p 말) 잘못된 장치에이를 실행하면 다음과 같은 표시됩니다

    [email protected]:/$: cat /proc/asound/card0/pcm1p/sub0/hw_params  
    closed 
    

: 뿌리하기 위해 전화를 필요로하지 않는다
1 단계 , How to Setup ADB.

대안 :

  1. 당신이 here에서 getChannelConfiguration() 또는 getChannelCount()처럼 AudioTrack API를 해봤 - 그냥 물어.
  2. MP3 파일 속성을 살펴 보았습니까? 메타 데이터에는 오디오 매개 변수에 대한 정보가 있습니다.
2

MediaCodec을 사용하여 모노 파일을 디코딩하려고 할 때 발생했습니다. 일부 장치에서는 코덱이 스테레오 스트림을 출력하고 모노는 다른 스트림에 출력합니다.오디오 트랙을 설정할 때 MediaExtractor에서 반환 한 미디어 형식을 사용했습니다.이 형식은 모노였습니다. 코덱에서 스테레오 스트림을 생성하는 장치에서는 오디오 트랙에 두 배의 샘플이 공급됩니다. 해결책은 MediaCodec에서 MediaFormatChanged 이벤트를 수신하고 AudioTrack의 MediaFormat을 조정하는 것입니다.

관련 문제