MODE_STREAM 中的 AudioTrack 没有声音
AudioTrack in MODE_STREAM has no sound
我已经被这个问题困扰好几天了。我现在正处于尝试获取可构建的工作示例的阶段,但我什至无法达到这一点。
我的问题是基于this example。我已将源代码(和解决方案)包含到我自己的代码中,并且可以看到正在写入缓冲区,但设备没有声音。我正在努力确定如何进一步调试它。
package com.example.audio;
import com.example.R;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.util.Log;
public class Synth {
private static final String TAG = Synth.class.getSimpleName();
private AudioTrack audioTrack;
private Context context;
public Synth(Context context) {
this.context = context;
int minBufferSize = AudioTrack.getMinBufferSize(22050, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 22050, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
}
public void playSound() {
audioTrack.play();
int i = 0;
int bufferSize = 512;
byte [] buffer = new byte[bufferSize];
InputStream inputStream = context.getResources().openRawResource(R.raw.mysample);
try {
int writes = 0;
while((i = inputStream.read(buffer)) != -1) {
writes++; audioTrack.write(buffer, 0, i);
}
Log.d(TAG, "Wrote " + writes + " times." );
} catch (IOException e) {e.printStackTrace();}
try {inputStream.close();} catch (IOException e) {e.printStackTrace();}
}
}
(要复制项目:创建新项目,包括这个 class,添加下面提到的音频,创建 Synth
的实例,然后触发 playSound
public函数)
显然我无法上传音频,或保证它在网络文件夹中的持久性,但是 this tool will generate a WAV file exactly like I am using(将采样率更改为 22.05kHz 并按 'download .wav file')
我意识到 STREAM_MUSIC
和 MODE_STREAM
在这个例子中似乎不合适。我正在使用那些 flags/mode,因为我知道我需要在以后的开发中将 AudioTrack 与这些模式一起使用,并且实际上只是暂时尝试让声音从设备中传出。
任何人都可以建议调试步骤,或者看看播放有什么问题吗?任何帮助表示赞赏。
我已经确定了我最初提出这个问题时遇到的问题。希望它能帮助其他人...
事实证明,当我调整音量时应用程序没有播放音频,所以实际最大的音量是 system/ringtone 音量,而不是 'music, video games, and other media' 音量,已静音。
我已经被这个问题困扰好几天了。我现在正处于尝试获取可构建的工作示例的阶段,但我什至无法达到这一点。
我的问题是基于this example。我已将源代码(和解决方案)包含到我自己的代码中,并且可以看到正在写入缓冲区,但设备没有声音。我正在努力确定如何进一步调试它。
package com.example.audio;
import com.example.R;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.util.Log;
public class Synth {
private static final String TAG = Synth.class.getSimpleName();
private AudioTrack audioTrack;
private Context context;
public Synth(Context context) {
this.context = context;
int minBufferSize = AudioTrack.getMinBufferSize(22050, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 22050, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
}
public void playSound() {
audioTrack.play();
int i = 0;
int bufferSize = 512;
byte [] buffer = new byte[bufferSize];
InputStream inputStream = context.getResources().openRawResource(R.raw.mysample);
try {
int writes = 0;
while((i = inputStream.read(buffer)) != -1) {
writes++; audioTrack.write(buffer, 0, i);
}
Log.d(TAG, "Wrote " + writes + " times." );
} catch (IOException e) {e.printStackTrace();}
try {inputStream.close();} catch (IOException e) {e.printStackTrace();}
}
}
(要复制项目:创建新项目,包括这个 class,添加下面提到的音频,创建 Synth
的实例,然后触发 playSound
public函数)
显然我无法上传音频,或保证它在网络文件夹中的持久性,但是 this tool will generate a WAV file exactly like I am using(将采样率更改为 22.05kHz 并按 'download .wav file')
我意识到 STREAM_MUSIC
和 MODE_STREAM
在这个例子中似乎不合适。我正在使用那些 flags/mode,因为我知道我需要在以后的开发中将 AudioTrack 与这些模式一起使用,并且实际上只是暂时尝试让声音从设备中传出。
任何人都可以建议调试步骤,或者看看播放有什么问题吗?任何帮助表示赞赏。
我已经确定了我最初提出这个问题时遇到的问题。希望它能帮助其他人...
事实证明,当我调整音量时应用程序没有播放音频,所以实际最大的音量是 system/ringtone 音量,而不是 'music, video games, and other media' 音量,已静音。