AudioTrack在不同设备上以不一致的速度播放
我目前使用AudioTrack
。我正在加载一个mp3文件并播放它。但是,根据设备的不同,音乐播放速度可能是正常速率的一半。AudioTrack在不同设备上以不一致的速度播放
我的代码:
AudioTrack track= new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
initBuffer,
AudioTrack.MODE_STREAM);
sampleRate
是AudioFormat
并从AudioTrack.getMinBufferSize()
缓冲区大小的采样率的回报。
我试图改变采样率,但没有区别。缓冲区大小也没有影响。
事实上,切换到CHANNEL_CONFIGURATION_STEREO
的确会让音乐在慢速播放的设备上以正常的速度播放,但它也可以使播放速度以正常速度的两倍播放。我的问题是我希望所有设备以正常速度播放。
有什么建议吗?
我已阅读此主题:Android AudioTrack slow playback,但它并不告诉我如何找出哪些设备应在单声道或立体声播放。
装置以正常速度:乌尔巴诺4.2.2,银河S4以一半的速度4.3
器械,银河S4 4.2.2,Experia还ž4.2.2
顺便说一句,我不能回放使用MediaPlayer
。 AudioTrack
包含在自定义播放器中,我需要在提取音频数据时编写它。 MediaPlayer
不会诀窍。
谢谢。
我终于解决了我的问题。不是最好的解决方法,但它至少起作用。
对于那些有兴趣的人,我正在阅读BufferInfo
的大小,并根据它决定我应该播放的播放速率。基本上,当播放速度较慢时,其尺寸比正常速度播放时大两倍。只是猜测,但MediaCodec
可能会复制立体声配置数据。
AudioTrack只允许PCM音频数据,不能播放MP3机智AudioTrack直接,你有你的MP3转换成PCM或使用的东西其他(比如MediaPlayer)比AudioTrack。
对不起,我忘了提及,在阅读它之前我已经在转换文件。 – Herve 2014-09-08 01:08:26
这是一个有点棘手,但这是你可以使用adb
和ALSA
做什么。
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
设备
-
访问:
[email protected]:/$ adb shell [email protected]:/$:
-
识别您的设备:
所以你看
/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 (*)
为card0
和device0
为多媒体播放。 -
四处重演参数:
播放使用标准的音乐播放器应用您加载的MP3文件。
歌曲正在播放。
问题为card0
,device0
以下命令(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。
替代:
- 你从here试过AudioTrack API,如getChannelConfiguration()或- 只是要求。
- 您是否尝试过查看MP3文件属性,元数据中包含有关音频参数的信息。
我尝试使用MediaCodec解码单声道文件时遇到过这种情况。在某些设备上,编解码器会输出立体声流,而单声道则输出立体声流。设置音轨时,我使用了MediaExtractor返回的单声道媒体格式。在编解码器将产生立体声流的设备上,音频轨道将被馈送两倍的样本。解决方案是侦听来自MediaCodec的MediaFormatChanged事件并调整AudioTrack的MediaFormat。
如果你还没有,可以通过订阅[andraudio](http://music.columbia.edu/mailman/listinfo/andraudio)并在那里询问获益。 – Jakar 2014-09-06 18:13:40
谢谢!我也会在那里查询 – Herve 2014-09-06 18:21:04