我目前正在使用AudioTrack
。我正在加载一个mp3文件并播放它。但是,根据设备的不同,音乐会以一半的速率或正常速率播放。
我的代码:
AudioTrack track= new AudioTrack( AudioManager.STREAM_MUSIC,
sampleRate,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
initBuffer,
AudioTrack.MODE_STREAM);
sampleRate
是AudioFormat
和[{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
没有成功。
感谢。
答案 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)
这个有点棘手,但您可以使用adb
和ALSA
执行此操作。
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
是捕获(用于录制)。
使用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步不要求手机被植根,How to Setup ADB。
<强>替代强>: