音轨在不同设备上以不一致的速度播放



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

我的代码:

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

sampleRate是按AudioFormat返回的采样率,并从AudioTrack.getMinBufferSize() initBuffer缓冲区大小。

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

实际上,切换到CHANNEL_CONFIGURATION_STEREO确实会使音乐在速度较慢的设备上以正常速率播放,但它也使那些以正常速度的两倍播放的音乐正常工作。我的问题是我希望所有设备都以正常速度播放。

有什么建议吗?

我已经阅读了这个线程:Android AudioTrack 播放缓慢,但它并没有告诉我如何找出哪些设备应该以单声道或立体声播放。

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

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

顺便说一句,我不能使用MediaPlayer进行播放。AudioTrack包含在自定义播放器中,我需要在提取音频数据时写入音频数据。 MediaPlayer不会这样做。

谢谢。

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

AudioTrack 只允许 PCM 音频数据,您不能直接播放 mp3 与 AudioTrack 通话,您必须将 mp3 转换为 PCM 或使用其他东西(例如媒体播放器(而不是 AudioTrack。

我终于解决了我的问题。不是最好的解决方案,但它至少有效。

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

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

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

root@user:/$ adb shell cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version 1.0.25.

只需查看读取 ALSA 设备名称。
每个设备(的细分(都有一个捕获播放组件。

就像/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
    


步骤1不需要手机扎根,如何设置ADB。

替代方案

  1. 您是否尝试过像getChannelConfiguration((或getChannelCount((这样的AudioTrack API
  2. 您是否尝试过查看 MP3 文件属性,元数据包含有关音频参数的信息。

相关内容

  • 没有找到相关文章

最新更新