2013-02-18 16 views
6

Kann mir jemand helfen, wie man .mid Dateien in ein beliebiges Audio-Format wie .wav oder .mp3 Format durch programmgesteuert konvertieren.Convert. Mid-Datei in ein beliebiges Audio-Format als. WAV oder MP3-Datei in Android?

+0

haben Sie bereits die Mediaplayer-Klasse versucht? Es kann Midi-Dateien abspielen, vielleicht können Sie den Ausgabepuffer abfangen und als Wave speichern. – lelloman

+0

Ja, ich habe es benutzt, um MIDI-Dateien abzuspielen, aber ich weiß nicht, wie ich es speichern soll? hast du irgendeine Idee? – sandeep

+0

könntest du den code posten, den du geschrieben hast, um den midi zu spielen? – lelloman

Antwort

5

Ich dachte, es wäre möglich, einen AudioRecorder zu verwenden, um direkt von einem MediaPlayer aufzunehmen und den Mediaplayer als Audioquelle des Recorders einzustellen, aber es scheint, dass es no way dafür gibt. Also, ich dachte zwei wirklich-nicht-saubere Möglichkeiten:

1- Die meisten Geräte haben eine 3,5-mm-Klinkenbuchse mit 3 Kanälen, 2 für Stereo-Ausgang und einen für Mikrofon-Eingang. Was Sie benötigen, ist ein Kabel, das die drei Signale aufteilt, so dass Sie den Stereo-Ausgang in einer Art Kurzschluss an den Eingang anschließen und den Midi-Eingang vom Mikrofoneingang aufnehmen können. Ich benutzte es, um eine Audio-Stream-Quelle an das Telefon zu übergeben, es auszuarbeiten und es dann an ein drittes Gerät zu senden. Der Draht, über den ich spreche, ist RCA-Anschlüssen mit Stereo-Audio + Video sehr ähnlich, ich weiß, dass es verrückt klingt, aber es hängt davon ab, was Sie tun.

2- Vorausgesetzt, dass Sie das Midi nicht aufnehmen müssen, während Sie es tatsächlich spielen, können Sie die Midi-Datei lesen und den Sound dann selbst synthetisieren. Das ist wirklich schwierig, besonders wenn man mit Klängen verschiedener Instrumente (Saiten, Drums etc.) umgehen muss, die Verwendung von Samples könnte die Arbeit vielleicht reduzieren.

Ich weiß, das ist nicht die erwartete Antwort, aber es ist besser als nichts, wenn Sie so verzweifelt sind, eine dieser Methoden zu versuchen, kann ich einige Beispielcode und Links zur Verfügung stellen.

EDIT:

ok, das war verrückt. Ich habe einen anderen Weg gefunden, verwenden Visualizer Klasse. Der Zweck des Visualizers besteht nicht darin, PCM aufzunehmen, sondern (überraschend) die Schallwelle zu visualisieren, so dass es einige Qualitätsprobleme geben könnte. Sie können PCM jedoch im Wave-Format speichern. Um dies zu tun, müssen Sie dem Raw-PCM-Array einen Header hinzufügen. Für Wave-Dateiformat schauen Sie sich here. Hier ein Beispiel, es zeigt nur das Byte-Array von MediaPlayer in einem TextView, aber es scheint zu funktionieren ...!

android.permission.RECORD_AUDIO 
android.permission.MODIFY_AUDIO_SETTINGS 

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".MainActivity" > 

    <Button 
     android:id="@+id/btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Play" /> 

    <Button 
     android:id="@+id/btn2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Pause" /> 

    <ScrollView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <TextView 
      android:id="@+id/textview" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
    </ScrollView> 

MainActivity.java

package com.example.midify; 

import java.util.Arrays; 

import android.media.MediaPlayer; 
import android.media.audiofx.Visualizer; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.app.Activity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
    MediaPlayer mp; 
    TextView tv; 
    Visualizer mVisualizer; 

    Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      tv.setText((String) msg.obj); 
     } 
    }; 

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

     mp = MediaPlayer.create(this, R.raw.midi); 

     Button btn = (Button) findViewById(R.id.btn); 
     Button btn2 = (Button) findViewById(R.id.btn2); 
     tv = (TextView) findViewById(R.id.textview); 

     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       if (!mp.isPlaying()) { 
        mp.start(); 
        init_visualizer(); 
       } 
      } 
     }); 

     btn2.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       if (mp.isPlaying()) { 
        mp.pause(); 
        mVisualizer.release(); 
       } 
      } 
     }); 
    } 

    @Override 
    public void finish() { 
     mp.release(); 
     mVisualizer.release(); 

     super.finish(); 
    } 

    private void PassData(byte[] data) { 
     String txt = Arrays.toString(data); 
     Message msg = handler.obtainMessage(); 
     msg.obj = txt; 
     handler.sendMessage(msg); 
    } 

    public void init_visualizer() { 
     mVisualizer = new Visualizer(mp.getAudioSessionId()); 
     mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); 

     Visualizer.OnDataCaptureListener captureListener = new Visualizer.OnDataCaptureListener() { 
      @Override 
      public void onWaveFormDataCapture(Visualizer visualizer, 
        byte[] bytes, int samplingRate) { 
       PassData(bytes); 
      } 

      @Override 
      public void onFftDataCapture(Visualizer visualizer, byte[] bytes, 
        int samplingRate) { 

      } 
     }; 

     mVisualizer.setDataCaptureListener(captureListener, 
       Visualizer.getMaxCaptureRate(), true, false); 

     mVisualizer.setEnabled(true); 
     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mediaPlayer) { 
       mVisualizer.setEnabled(false); 
      } 
     }); 
    } 
} 
+0

Hallo, danke fürs nochmal beantworten.Wir können die Ausgabe von dem Mikrofon speichern, aber es ist nicht gut, den Ton vom Mikrofon zu speichern, weil es erstens etwas Unschärfe-Sound hinzufügt, und zweitens, wenn wir etwas sprechen, wenn wir den Ton vom Mikrofon speichern, dann wird unsere Stimme auch mit ihm verschmelzen..so ich benutze kein Mikrofon, um die Ausgabe zu speichern. Nochmals vielen Dank .. wenn Sie einen Vorschlag haben, bitte helfen Sie .. – sandeep

+0

@sandeep bearbeiten ...! – lelloman

+0

Hallo, ich konvertiere das PCM (Byte-Daten) in WAV-Format, aber die Ausgabe ist nicht perfekt. Es gibt Unschärfe Sound und etwas Musik von Midi-Datei, wenn wir es spielen. Danke ... – sandeep