无法播放不同值的声音

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.

有更深入的了解

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

MediaPlayer API实现起来比较简单,推荐使用播放。您可以查看 this 来源,其中解释了使用媒体播放器播放以列表形式显示的音频(使用 RecyclerView