java - Android AudioTrack 播放速度快
问题描述
我正在尝试使用 AudioTrack 播放音频。
我可以正常速度播放。而且我可以慢慢播放。
但我不能快速播放。
如何快速播放?
try (InputStream is = getResources().openRawResource(R.raw.sample)) {
byte[] bytes = new byte[is.available()];
is.read(bytes);
final int SAMPLING_RATE = 48000;
final int size = AudioTrack.getMinBufferSize(
SAMPLING_RATE,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioTrack audioTrack = new AudioTrack.Builder()
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build())
.setAudioFormat(new AudioFormat.Builder()
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(SAMPLING_RATE)
.build())
.setBufferSizeInBytes(size)
.build();
audioTrack.setPlaybackRate(SAMPLING_RATE);
PlaybackParams params = audioTrack.getPlaybackParams();
//params.setSpeed(1.0f); // available
//params.setSpeed(0.5f); // available
params.setSpeed(1.5f); // not available
audioTrack.setPlaybackParams(params);
audioTrack.play();
audioTrack.write(bytes, 44, bytes.length - 44);
audioTrack.stop();
audioTrack.flush();
} catch (IOException e) {
Log.e(TAG, e.toString());
}
params.setSpeed(1.5f) 不可用。
我收到以下错误消息。
06-14 09:24:55.714 957-12866/? D/AES: onEndOfErrorDumpThread: data_app_crash Process: com.example.audiotracksample
Flags: 0x38e8bf46
Package: com.example.audiotracksample v1 (1.0)
Foreground: Yes
Build: COVIA/CP-L45s/CP-L45s:7.0/NRD90M/1502850909:user/release-keys
java.lang.IllegalArgumentException: arguments out of range
at android.media.AudioTrack.native_set_playback_params(Native Method)
at android.media.AudioTrack.setPlaybackParams(AudioTrack.java:1590)
at com.example.audiotracksample.MainActivity$AudioThread.run(MainActivity.java:69)
at java.lang.Thread.run(Thread.java:761)
- compileSdkVersion:26
- minSdkVersion : 24
- targetSdkVersion : 26
解决方案
根据文档,缓冲区也需要很大以提高速度。
如果您想将速度提高 2 倍,则应使用至少两倍于最小缓冲区大小的缓冲区
audioTrack = AudioTrack(
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build(),
AudioFormat.Builder()
.setChannelMask(channelConfig)
.setSampleRate(sampleRateInHz)
.setEncoding(audioFormat)
.build(),
max(minBufferSize, bufferSize) * 2, // see here.
AudioTrack.MODE_STREAM,
AudioManager.AUDIO_SESSION_ID_GENERATE
)
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
val playbackParams = PlaybackParams()
playbackParams.speed = 2F
audioTrack.playbackParams = playbackParams
}
推荐阅读
- android - Cordova:Android 构建失败原因:Dex 无法解析版本 52 字节代码
- loops - unix:如何将结果保存并显示为列而不是大字符串?
- css - 尺寸:与其父尺寸相关的伪元素?
- python - pycharm中的Tensorflow.keras.layers“未解决的参考”
- maven - Maven项目上不可解决的导入POM错误
- java - Java Pattern 类 - 使用哪个正则表达式从外括号中获取字符串?
- visual-studio - 是否有可能找出提到的线程的特定输出窗口是关于什么的?
- wordpress - 避免 wordpress 永久链接重定向
- javascript - 替换对象并保留指向该对象的现有指针
- javascript - 如何修复 node.js 服务器上 bitmovin-javascript 中的“HTTP 响应代码为 403 禁止”错误