将.mid文件转换为任何音频格式,如android中的.wav或.mp3文件?

问题描述:

任何人都可以帮助我如何通过编程将.mid文件转换为.wav.mp3格式的任何音频格式。将.mid文件转换为任何音频格式,如android中的.wav或.mp3文件?

+0

没有你已经尝试过的媒体播放器类?它可以播放MIDI文件,也许你可以拦截输出缓冲区并将其存储为波形。 – lelloman 2013-02-18 10:16:31

+0

是的,我用它来播放MIDI文件,但我不知道如何保存它?你有什么主意吗? – sandeep 2013-02-19 05:59:41

+0

你可以发布你写的演奏MIDI的代码吗? – lelloman 2013-02-19 23:41:00

我认为有可能使用AudioRecorder直接从MediaPlayer录制,将Mediaplayer设置为录音机的音源,但似乎有no way这样做。所以,我认为两种真正不干净的方式:大多数设备都有3.5mm插孔,3个通道,2个用于立体声输出,1个用于麦克风输入。您需要的是一根分离三个信号的电缆,以便您可以通过短路将立体声输出连接到输入,并从麦克风输入录制MIDI。我用它将音频流源传递给手机,详述它,然后将其发送给第三个设备。我所说的导线与带有立体声音频+视频的RCA连接器非常相似,我知道这听起来很疯狂,但这取决于你在做什么。如果你不需要在实际演奏时记录midi,你可以阅读midi文件,然后自己合成声音。这非常困难,特别是当需要处理不同乐器(琴弦,鼓等)的声音时,使用样品可能会减少工作。

我知道这不是预期的答案,但它总比没有好,如果你非常渴望尝试这些方法之一,我可以提供一些示例代码和链接。

编辑:

好的,这是疯了。我发现另一种方式,使用Visualizer类。可视化器的目的不是让PCM来记录它,但(令人惊讶地)可视化声波,所以可能存在一些质量问题。但是,您可以将PCM保存为波形格式,为此,您必须向原始PCM阵列添加一个标头。对于波形文件格式,请看看here。这里有一个例子,它只是显示了TextPlayer中MediaPlayer的字节数组,但它似乎工作...!

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

嗨,谢谢你再次回答。我们可以保存麦克风的输出,但是从麦克风存储声音并不好,因为首先它会给它增加一些模糊的声音;其次,如果我们在保存麦克风声音时说话,那么我们的声音将会也与它合并..因此我不使用麦克风来保存输出。再次感谢..如果你有任何建议,请帮助.. – sandeep 2013-02-22 04:40:17

+0

@sandeep编辑...! – lelloman 2013-02-22 14:24:24

+0

嗨,我将该pcm(字节数据)转换为wav格式,但输出不完美。当我们播放它时,它会给出模糊声音和一些midi文件的音乐。感谢... – sandeep 2013-02-27 09:53:19