我目前正在与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
可能会重复立体声配置的数据。
这个有点棘手,但这是您可以使用 adb
和 ALSA
执行的操作。
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
是捕获(用于录制(。
使用以下
adb
访问您的设备:root@user:/$ adb shell shell@android:/$:
识别您的设备:
所以你看
/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 (*)
card0
,device0
用于多媒体播放。获取播放参数:
使用标准音乐播放器应用程序播放加载的mp3文件。
播放歌曲时。
发出以下命令进行card0
、device0
(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。
替代方案:
- 您是否尝试过像getChannelConfiguration((或getChannelCount((这样的AudioTrack API 。
- 您是否尝试过查看 MP3 文件属性,元数据包含有关音频参数的信息。