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

时间:2014-09-06 18:10:21

标签: android audiotrack

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

我的代码:

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

sampleRateAudioFormat和[{1}}的缓冲区大小initBuffer的采样率回报率。

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

事实上,切换到AudioTrack.getMinBufferSize()确实可以让音乐在速度较慢的设备上以正常速率播放,但同时也能让播放效果正常的播放速度提高两倍。我的问题是我希望所有设备都以正常速度播放。

有什么建议吗?

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

正常速度的设备:Urbano 4.2.2,Galaxy S4 4.3

设备速度的一半,Galaxy S4 4.2.2,Experia Z 4.2.2

顺便说一句,我无法使用CHANNEL_CONFIGURATION_STEREO进行播放。 MediaPlayer包含在自定义播放器中,我需要在提取音频数据时编写音频数据。 AudioTrack没有成功。

感谢。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

试试这个:

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

它应该以正常速度播放

答案 2 :(得分:0)

AudioTrack只允许PCM音频数据,你不能直接播放MP3音频,你必须将你的mp3转换为PCM或使用其他东西(例如MediaPlayer)而不是AudioTrack。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

这个有点棘手,但您可以使用adbALSA执行此操作。
Android内部使用ALSA

您的设备应该ALSA,请尝试:

root@user:/$ 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是捕获(用于录制)。

  1. 使用adb访问您的设备:

    root@user:/$ adb shell
    shell@android:/$:  
    
  2. 识别您的设备:

    所以你看到/proc/asound/pcm会给你一个很长的清单。

    shell@android:/$: 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

    发出以下命令
    shell@android:/$: 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),您会看到以下内容:

    shell@android:/$: cat /proc/asound/card0/pcm1p/sub0/hw_params    
    closed
    
  4. 注意
    第1步不要求手机被植根,How to Setup ADB

    <强>替代

    1. 您是否尝试过来自getChannelConfiguration()getChannelCount()here等AudioTrack API - Just Asking。
    2. 您是否尝试过查看MP3文件属性,元数据中包含有关音频参数的信息。