无法播放不同值的声音
Unable to play sound with different values
我正在开发一个 Android 应用程序,它可以录制音频并以不同的频率和语音属性播放。
我的代码有效:
它记录、停止和播放音频但不是所需的格式和值
基本上这个应用程序录制声音并使用不同的属性播放它,如 Ghost、Radio、Girl 等。
我正在使用列表视图来实现这一点。我想像这个应用一样改变声音的属性。
这是主要代码 activity
public class MainActivity extends AppCompatActivity {
ArrayList<Model> datamodels;
ListView listView;
MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView= (ListView) findViewById(R.id.listview);
datamodels= new ArrayList<>();
datamodels.add(new Model(R.drawable.ic_color_lens_black_24dp,"Normal",R.drawable.ic_play_arrow_black_24dp,11025,0,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_spa_black_24dp,"Ghost",R.drawable.ic_play_arrow_black_24dp,16000, 128,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_local_phone_black_24dp,"Telephone",R.drawable.ic_play_arrow_black_24dp,22050, 8000 ,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_camera,"Girl",R.drawable.ic_play_arrow_black_24dp,44100, 200,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_android_black_24dp,"Cave",R.drawable.ic_play_arrow_black_24dp,200, -10453621,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_gallery,"Speaker",R.drawable.ic_play_arrow_black_24dp,-9079435, 4300,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_manage,"Anger",R.drawable.ic_play_arrow_black_24dp,-16121, 3100,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_send,"Under Water",R.drawable.ic_play_arrow_black_24dp,-12627531, 500, R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_share,"Space",R.drawable.ic_play_arrow_black_24dp,-14575885, 1000,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_slideshow,"Robot",R.drawable.ic_play_arrow_black_24dp,-16743537, 2000,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_mood_bad_black_24dp,"Optomus Prime",R.drawable.ic_play_arrow_black_24dp,-8825528, 400,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_people_black_24dp,"Spinning",R.drawable.ic_play_arrow_black_24dp,-26624, 1400,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_people_black_24dp,"Alien",R.drawable.ic_play_arrow_black_24dp,-141259, 4400,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_people_black_24dp,"Small Alien",R.drawable.ic_play_arrow_black_24dp,-4142541, 3800,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_spa_black_24dp,"Fan",R.drawable.ic_play_arrow_black_24dp,-16689253, 3900,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_local_phone_black_24dp,"Old Radio",R.drawable.ic_play_arrow_black_24dp,-7461718, 3600,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_local_phone_black_24dp,"Wolf",R.drawable.ic_play_arrow_black_24dp,-1754827, 3200,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_local_phone_black_24dp,"Android",R.drawable.ic_play_arrow_black_24dp,-16746133, 3300,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_local_phone_black_24dp,"Warning",R.drawable.ic_play_arrow_black_24dp,-1499549, 1500,R.drawable.ic_more_vert_black_24dp,false));
myAdapter = new MyAdapter(datamodels, this);
listView.setAdapter(myAdapter);
}
}
模型代码 class
public class Model {
int image1;
String imagename1;
int ply;
int optn;
double freqancy;
double bit_rate;
boolean ischange;
public Model(int image1, String imagename1, int ply,double freqancy,int bit_rate, int optn,boolean ischange){
this.image1=image1;
this.imagename1= imagename1;
this.ply=ply;
this.optn=optn;
this.freqancy=freqancy;
this.bit_rate=bit_rate;
this.ischange=ischange;
}
public int getImage1() {
return image1;
}
public double getBit_rate() {
return bit_rate;
}
public double getFreqancy() {
return freqancy;
}
public boolean setIschange(boolean ischange) {
this.ischange = ischange;
return ischange;
}
public String getName() {
return imagename1;
}
}
玩不同值的代码
void playRecord(int freq, double bit_rate) throws IOException {
String folder_main = "MyVoiceChanger";
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + folder_main + "/Recording.mp3");
int shortSizeInBytes = Short.SIZE/Byte.SIZE;
int bufferSizeInBytes = (int)(file.length()/shortSizeInBytes);
short[] audioData = new short[bufferSizeInBytes];
try {
InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);
int i = 0;
try {
while (dataInputStream.available() > 0) {
audioData[i] = dataInputStream.readShort();
i++;
}
}catch (java.io.EOFException e){
e.printStackTrace();
}
dataInputStream.close();
int sampleFreq = freq;
double b_rate=bit_rate;
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,sampleFreq,
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_8BIT,
bufferSizeInBytes, AudioTrack.MODE_STREAM);
Toast.makeText(mContext, "Usm", Toast.LENGTH_SHORT).show();
mediaPlayer.prepare();
audioTrack.write(audioData, 0, bufferSizeInBytes);
audioTrack.play();
mediaPlayer.start();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
你说的sound/voice多种效果,不是简单的修改frequency/bitrate参数就能产生的。这需要对 audio signal processing.
有更深入的了解
除此之外,您为播放编写的源似乎不正确。您同时使用 MediaPlayer
和 AudioTrack
。通常,要播放单个音频文件,需要其中一个。
AudioTrack
为您提供音频样本级别的访问和控制,因此功能强大。但是,能力越大,责任越大。
MediaPlayer
API实现起来比较简单,推荐使用播放。您可以查看 this 来源,其中解释了使用媒体播放器播放以列表形式显示的音频(使用 RecyclerView
)
我正在开发一个 Android 应用程序,它可以录制音频并以不同的频率和语音属性播放。 我的代码有效:
它记录、停止和播放音频但不是所需的格式和值
基本上这个应用程序录制声音并使用不同的属性播放它,如 Ghost、Radio、Girl 等。 我正在使用列表视图来实现这一点。我想像这个应用一样改变声音的属性。
这是主要代码 activity
public class MainActivity extends AppCompatActivity {
ArrayList<Model> datamodels;
ListView listView;
MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView= (ListView) findViewById(R.id.listview);
datamodels= new ArrayList<>();
datamodels.add(new Model(R.drawable.ic_color_lens_black_24dp,"Normal",R.drawable.ic_play_arrow_black_24dp,11025,0,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_spa_black_24dp,"Ghost",R.drawable.ic_play_arrow_black_24dp,16000, 128,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_local_phone_black_24dp,"Telephone",R.drawable.ic_play_arrow_black_24dp,22050, 8000 ,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_camera,"Girl",R.drawable.ic_play_arrow_black_24dp,44100, 200,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_android_black_24dp,"Cave",R.drawable.ic_play_arrow_black_24dp,200, -10453621,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_gallery,"Speaker",R.drawable.ic_play_arrow_black_24dp,-9079435, 4300,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_manage,"Anger",R.drawable.ic_play_arrow_black_24dp,-16121, 3100,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_send,"Under Water",R.drawable.ic_play_arrow_black_24dp,-12627531, 500, R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_share,"Space",R.drawable.ic_play_arrow_black_24dp,-14575885, 1000,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_menu_slideshow,"Robot",R.drawable.ic_play_arrow_black_24dp,-16743537, 2000,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_mood_bad_black_24dp,"Optomus Prime",R.drawable.ic_play_arrow_black_24dp,-8825528, 400,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_people_black_24dp,"Spinning",R.drawable.ic_play_arrow_black_24dp,-26624, 1400,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_people_black_24dp,"Alien",R.drawable.ic_play_arrow_black_24dp,-141259, 4400,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_people_black_24dp,"Small Alien",R.drawable.ic_play_arrow_black_24dp,-4142541, 3800,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_spa_black_24dp,"Fan",R.drawable.ic_play_arrow_black_24dp,-16689253, 3900,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_local_phone_black_24dp,"Old Radio",R.drawable.ic_play_arrow_black_24dp,-7461718, 3600,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_local_phone_black_24dp,"Wolf",R.drawable.ic_play_arrow_black_24dp,-1754827, 3200,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_local_phone_black_24dp,"Android",R.drawable.ic_play_arrow_black_24dp,-16746133, 3300,R.drawable.ic_more_vert_black_24dp,false));
datamodels.add(new Model(R.drawable.ic_local_phone_black_24dp,"Warning",R.drawable.ic_play_arrow_black_24dp,-1499549, 1500,R.drawable.ic_more_vert_black_24dp,false));
myAdapter = new MyAdapter(datamodels, this);
listView.setAdapter(myAdapter);
}
}
模型代码 class
public class Model {
int image1;
String imagename1;
int ply;
int optn;
double freqancy;
double bit_rate;
boolean ischange;
public Model(int image1, String imagename1, int ply,double freqancy,int bit_rate, int optn,boolean ischange){
this.image1=image1;
this.imagename1= imagename1;
this.ply=ply;
this.optn=optn;
this.freqancy=freqancy;
this.bit_rate=bit_rate;
this.ischange=ischange;
}
public int getImage1() {
return image1;
}
public double getBit_rate() {
return bit_rate;
}
public double getFreqancy() {
return freqancy;
}
public boolean setIschange(boolean ischange) {
this.ischange = ischange;
return ischange;
}
public String getName() {
return imagename1;
}
}
玩不同值的代码
void playRecord(int freq, double bit_rate) throws IOException {
String folder_main = "MyVoiceChanger";
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + folder_main + "/Recording.mp3");
int shortSizeInBytes = Short.SIZE/Byte.SIZE;
int bufferSizeInBytes = (int)(file.length()/shortSizeInBytes);
short[] audioData = new short[bufferSizeInBytes];
try {
InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);
int i = 0;
try {
while (dataInputStream.available() > 0) {
audioData[i] = dataInputStream.readShort();
i++;
}
}catch (java.io.EOFException e){
e.printStackTrace();
}
dataInputStream.close();
int sampleFreq = freq;
double b_rate=bit_rate;
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,sampleFreq,
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_8BIT,
bufferSizeInBytes, AudioTrack.MODE_STREAM);
Toast.makeText(mContext, "Usm", Toast.LENGTH_SHORT).show();
mediaPlayer.prepare();
audioTrack.write(audioData, 0, bufferSizeInBytes);
audioTrack.play();
mediaPlayer.start();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
你说的sound/voice多种效果,不是简单的修改frequency/bitrate参数就能产生的。这需要对 audio signal processing.
有更深入的了解除此之外,您为播放编写的源似乎不正确。您同时使用 MediaPlayer
和 AudioTrack
。通常,要播放单个音频文件,需要其中一个。
AudioTrack
为您提供音频样本级别的访问和控制,因此功能强大。但是,能力越大,责任越大。
MediaPlayer
API实现起来比较简单,推荐使用播放。您可以查看 this 来源,其中解释了使用媒体播放器播放以列表形式显示的音频(使用 RecyclerView
)