AudioTrack在不同设备上以不一致​​的速度播放

问题描述:

我目前使用AudioTrack。我正在加载一个mp3文件并播放它。但是,根据设备的不同,音乐播放速度可能是正常速率的一半。AudioTrack在不同设备上以不一致​​的速度播放

我的代码:

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

sampleRateAudioFormat并从AudioTrack.getMinBufferSize()缓冲区大小的采样率的回报。

我试图改变采样率,但没有区别。缓冲区大小也没有影响。

事实上,切换到CHANNEL_CONFIGURATION_STEREO的确会让音乐在慢速播放的设备上以正常的速度播放,但它也可以使播放速度以正常速度的两倍播放。我的问题是我希望所有设备以正常速度播放。

有什么建议吗?

我已阅读此主题:Android AudioTrack slow playback,但它并不告诉我如何找出哪些设备应在单声道或立体声播放。

装置以正常速度:乌尔巴诺4.2.2,银河S4以一半的速度4.3

器械,银河S4 4.2.2,Experia还ž4.2.2

顺便说一句,我不能回放使用MediaPlayerAudioTrack包含在自定义播放器中,我需要在提取音频数据时编写它。 MediaPlayer不会诀窍。

谢谢。

+0

如果你还没有,可以通过订阅[andraudio](http://music.columbia.edu/mailman/listinfo/andraudio)并在那里询问获益。 – Jakar 2014-09-06 18:13:40

+0

谢谢!我也会在那里查询 – Herve 2014-09-06 18:21:04

我终于解决了我的问题。不是最好的解决方法,但它至少起作用。

对于那些有兴趣的人,我正在阅读BufferInfo的大小,并根据它决定我应该播放的播放速率。基本上,当播放速度较慢时,其尺寸比正常速度播放时大两倍。只是猜测,但MediaCodec可能会复制立体声配置数据。

试试这个:

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

应该以正常速度播放

+0

对不起,我现在无法在设备上进行测试,但似乎无法正常工作。改变播放速度确实会改变速度,但不是我想要的方式。我的问题是,不同的设备将以不同的速度播放。 88200是否有理由让我在所有设备上都能正确运行? – Herve 2014-09-06 18:56:33

+0

88200提供了更高的硬件适应性。 – 2014-09-06 21:03:43

+0

在实际设备上测试过,它仍然很慢... – Herve 2014-09-08 01:09:07

AudioTrack只允许PCM音频数据,不能播放MP3机智AudioTrack直接,你有你的MP3转换成PCM或使用的东西其他(比如MediaPlayer)比AudioTrack。

+0

对不起,我忘了提及,在阅读它之前我已经在转换文件。 – Herve 2014-09-08 01:08:26

这是一个有点棘手,但这是你可以使用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
每个设备(一个细分)具有捕获回放组件。

/proc/asound/card0/pcm1p/proc/asound/card0/pcm1p其中卡0设备1 pcm1p是您的播放和pcm1c是捕获(记录)。使用adb设备

  1. 访问:

    [email protected]:/$ adb shell 
    [email protected]:/$: 
    
  2. 识别您的设备:

    所以你看/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 (*)card0device0为多媒体播放。

  3. 四处重演参数:

    播放使用标准的音乐播放器应用您加载的MP3文件。
    歌曲正在播放。
    问题为card0device0以下命令(P - 播放),并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 
    

注意
第一步并不需要手机植根,How to Setup ADB

替代

  1. 你从here试过AudioTrack API,如getChannelConfiguration()或​​- 只是要求。
  2. 您是否尝试过查看MP3文件属性,元数据中包含有关音频参数的信息。

我尝试使用MediaCodec解码单声道文件时遇到过这种情况。在某些设备上,编解码器会输出立体声流,而单声道则输出立体声流。设置音轨时,我使用了MediaExtractor返回的单声道媒体格式。在编解码器将产生立体声流的设备上,音频轨道将被馈送两倍的样本。解决方案是侦听来自MediaCodec的MediaFormatChanged事件并调整AudioTrack的MediaFormat。