无法播放具有不同值的声音 [英] Unable to play sound with different values

本文介绍了无法播放具有不同值的声音的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个Android应用程序,该应用程序可以录制音频并以不同的频率和语音属性播放它. 我的代码正常工作:

I am working on an Android application that record the audio and play it with different frequency and voice properties. my code working:

  • 它会记录,停止和播放音频,但不是所需的格式和值

  • It records,Stop and play the audio but not in desired format and values

就像带效果的语音转换器

基本上,此应用程序会录制语音并以不同的属性(例如Ghost,Radio,Girl等)播放. 我正在使用列表视图来实现这一点.我想像此应用程序一样更改声音的属性.

Basically this app record voice and play it with different properties like Ghost,Radio,Girl etc etc. I am using list view to achieve this. I want to change the properties of sound just like this application.

这是主要活动的代码

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();
    }
}

推荐答案

仅通过修改频率/比特率参数就无法生成您提到的各种声音/声音效果.这将需要对音频信号处理的深入了解.

The variety of sound/voice effects you have mentioned, can not be generated simply by modifying frequency/bitrate parameters. That would require deeper knowledge of audio signal processing.

除此之外,您编写的用于播放的源似乎不正确.您同时使用MediaPlayerAudioTrack.通常,要播放单个音频文件,需要其中之一. AudioTrack使您可以访问和控制音频样本级别,因此功能强大.但是,强大的力量伴随着巨大的责任.

Apart from that, the source you have written for playback seems incorrect. You are using both MediaPlayer and AudioTrack. Generally, for playback of a single audio file, one needs either one of them. AudioTrack gives you audio sample level access and control, and therefore great power. But, with great power comes great responsibility.

MediaPlayer API相对容易实现,我建议将其用于回放.您可以查看源,该源解释了如何使用媒体播放器播放在列表的形式(使用RecyclerView)

MediaPlayer APIs are comparatively easier to implement, and I would recommend using it for playback. You may have a look at this source, which explains using media player for playback of audios which are displayed in the form of list (using RecyclerView)

这篇关于无法播放具有不同值的声音的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆