首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文件另存为音频文件后无法播放

将文件另存为音频文件后无法播放
EN

Stack Overflow用户
提问于 2013-10-15 18:53:16
回答 1查看 161关注 0票数 1

我正在生成一个声音在安卓,这是使用audiotrack (对象的AudiTrack)播放,但我想保存这个声音作为一个音频文件在手机或SD卡。代码是

代码语言:javascript
复制
public class MainActivity extends Activity {
     // int j=2;
     private final int duration = 3; // seconds
     private final int sampleRate = 8000;
     private final int numSamples = duration * sampleRate;
     private final double sample[] = new double[numSamples];
     private final double freqOfTone = 500; // hz

     private final byte generatedSnd[] = new byte[2 * numSamples];

     Handler handler = new Handler();

     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
     }

     @Override
     protected void onResume() {
      super.onResume();

      // Use a new tread as this can take a while
      Thread thread = new Thread(new Runnable() {
          public void run() {
            genTone();
            handler.post(new Runnable() {

        public void run() {
         playSound();
        }
       });
          }   
        });
        thread.start();
     }

     void genTone(){
      // fill out the array
      for (int i = 0; i < numSamples; ++i) {
       sample[i] = Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone));
       //System.out.println("the value is ::"+sample[i]);

      }

      // convert to 16 bit pcm sound array
      // assumes the sample buffer is normalised.
      int idx = 0;
      int loop = 0;
      boolean flip =false;
      for (double dVal : sample) {
       short val = (short) (dVal * 32767);
       generatedSnd[idx++] = (byte) (val & 0x00ff);

        //System.out.println("the value at address"+generatedSnd[idx-1]);
       generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
       if(flip)
       {
           generatedSnd[idx-1]=(byte)(generatedSnd[idx-1]*2);
           generatedSnd[idx-2]=(byte)(generatedSnd[idx-2]*2);
       }


       System.out.println("the value is:"+generatedSnd[idx-1]);
       System.out.println("the value is::"+generatedSnd[idx-2]);

       loop++;
       if(loop==16){
              loop=0;
              flip=!flip;
          }

      }
     }


     void playSound(){
      AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
        8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
        AudioFormat.ENCODING_PCM_16BIT, numSamples,
        AudioTrack.MODE_STATIC);
     // audioTrack.write(generatedSnd, 0, generatedSnd.length);
     audioTrack.write(generatedSnd, 0, numSamples);
     audioTrack.play();
     String sFileName="tonegenerator.mp3"; //String sBody =generatedSnd.toString();
     try
        {
            File root = new File(Environment.getExternalStorageDirectory(), "Notes");
            if (!root.exists()) {
                root.mkdirs();
            }
            File gpxfile = new File(root, sFileName);
          //  FileWriter writer = new FileWriter(gpxfile);
            FileOutputStream writer=new FileOutputStream(gpxfile);
            writer.write(generatedSnd, 0, numSamples);


            //writer.write(generatedSnd, 0, numSamples);
          //  writer.write(generatedSnd);
           // writer.append(sBody);
            writer.flush();
            writer.close();
            Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show();
        }
        catch(IOException e)
        {
             e.printStackTrace();
            // importError = e.getMessage();
            // iError();
        }

     }


    }

现在,该文件也被保存到名为"Notes“的文件夹中。文件tonegenerator.mp3不能在电话中播放,系统also.If my code不能正确存储该文件。那么我们应该如何存储它。

EN

回答 1

Stack Overflow用户

发布于 2013-10-15 19:47:34

代码语言:javascript
复制
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
    8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
    AudioFormat.ENCODING_PCM_16BIT, numSamples,
    AudioTrack.MODE_STATIC);

尝试将大小参数从numSamples更改为generatedSnd数组的长度。同样的,

代码语言:javascript
复制
audioTrack.write(generatedSnd, 0, numSamples);

。。将第三个参数设置为该数组的长度。

此外,您生成的不是mp3,而是wav文件。

更新:基于您无法从光盘版本播放该文件的事实:

对于wav文件,您还需要写入WAV头文件。它被描述为here。读写这类文件的示例代码可以在here中看到,特别是参见writeToFilePath_WriteChunks和相关方法。

如果您希望输出为其他格式,则必须使用相应的文件格式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19379411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档