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?
Antwort
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);
}
});
}
}
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
@sandeep bearbeiten ...! – lelloman
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
haben Sie bereits die Mediaplayer-Klasse versucht? Es kann Midi-Dateien abspielen, vielleicht können Sie den Ausgabepuffer abfangen und als Wave speichern. – lelloman
Ja, ich habe es benutzt, um MIDI-Dateien abzuspielen, aber ich weiß nicht, wie ich es speichern soll? hast du irgendeine Idee? – sandeep
könntest du den code posten, den du geschrieben hast, um den midi zu spielen? – lelloman