无法播放具有不同值的声音

时间:2018-03-09 06:28:29

标签: android android-layout android-mediaplayer android-studio-3.0 android-mediarecorder

我正在开发一款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();
    }
}

1 个答案:

答案 0 :(得分:2)

您提到的各种声音/语音效果无法通过修改频率/比特率参数来生成。这需要更深入了解audio signal processing

除此之外,您为回放编写的来源似乎不正确。您正在使用MediaPlayerAudioTrack。通常,对于单个音频文件的回放,需要其中之一。 AudioTrack为您提供音频样本级别的访问和控制,因此功能强大。但是,强大的力量带来了巨大的责任。

MediaPlayer API相对容易实现,我建议使用它进行播放。您可以查看this来源,其中介绍了如何使用媒体播放器播放以列表形式显示的音频(使用RecyclerView