我正在开发一款Android应用程序,可记录音频并以不同的频率和语音属性播放。 我的代码工作:
它会录制,停止和播放音频,但不是所需的格式和值
基本上这个应用程序可以录制语音并使用Ghost,Radio,Girl等不同属性播放它。 我正在使用列表视图来实现这一目标。我想像这个应用程序一样改变声音的属性。
以下是主要活动的代码
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);
}
}
模型类代码
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();
}
}
答案 0 :(得分:2)
您提到的各种声音/语音效果无法通过修改频率/比特率参数来生成。这需要更深入了解audio signal processing。
除此之外,您为回放编写的来源似乎不正确。您正在使用MediaPlayer
和AudioTrack
。通常,对于单个音频文件的回放,需要其中之一。
AudioTrack
为您提供音频样本级别的访问和控制,因此功能强大。但是,强大的力量带来了巨大的责任。
MediaPlayer
API相对容易实现,我建议使用它进行播放。您可以查看this来源,其中介绍了如何使用媒体播放器播放以列表形式显示的音频(使用RecyclerView
)