1

audiotrack (AudiTrack のオブジェクト) を使用して再生されているアンドロイドでトーンを生成していますが、このトーンをオーディオ ファイルとして電話または SD カードに保存したいと考えています。コードは

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は電話とシステムでも再生されません.私のコードがそれを保存するのに正しくない場合. では、どのように保管すればよいでしょうか。

4

1 に答える 1

1
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
    8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
    AudioFormat.ENCODING_PCM_16BIT, numSamples,
    AudioTrack.MODE_STATIC);

そのサイズ引数を numSamples から generatedSnd 配列の長さに変更してみてください。同様に、

audioTrack.write(generatedSnd, 0, numSamples);

.. 3 番目の引数をその配列の長さに設定します。

また、mp3 ではなく、wav ファイルを生成しています。

更新:ディスクバージョンからそのファイルを再生できないという事実に基づいて:

wav ファイルの場合は、WAV ヘッダーも記述する必要があります。ここに 記載。そのようなファイルを読み書きするためのサンプル コードは、ここで見ることができます。特に、writeToFilePath_WriteChunks および関連するメソッドを参照してください。

他の形式で出力したい場合は、対応するファイル形式を使用する必要があります。

于 2013-10-15T11:47:34.153 に答える