首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换.mid文件到任何音频格式的.wav或.mp3文件在安卓?

转换.mid文件到任何音频格式的.wav或.mp3文件在安卓?
EN

Stack Overflow用户
提问于 2013-02-18 18:00:31
回答 1查看 4.7K关注 0票数 6

谁可以帮助我如何通过编程转换成.wav.mp3格式的任何音频格式的.mid文件。

EN

回答 1

Stack Overflow用户

发布于 2013-02-22 06:39:00

我认为可以使用AudioRecorder直接从MediaPlayer录制,将Mediaplayer设置为录像机的音频源,但似乎有no way可以做到这一点。所以,我想了两种非常不干净的方法:

1-大多数设备都有一个3.5毫米插孔插孔,有3个通道,2个用于立体声输出,一个用于麦克风输入。你需要的是一根将三个信号分开的电缆,这样你就可以将立体声输出连接到输入,在某种程度上短路,并从麦克风输入录制midi。我用它把音频流的来源传给手机,然后再把它发送到第三个设备上。我所说的线路非常类似于带有立体声音频+视频的RCA接口,我知道这听起来很疯狂,但这取决于你在做什么。

2-假设你在实际播放的时候不需要录制midi,你可以读取midi文件,然后自己合成声音。这真的很难,特别是当必须处理不同乐器(弦乐,鼓等)的声音时,使用样本可能会减少工作。

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

编辑:

好吧,这太疯狂了。我找到了另一种方法,使用Visualizer类。visualizer的目的不是让PCM录制它,而是(令人惊讶的)可视化声波,所以可能会有一些质量问题。但是,您可以将PCM保存为wave格式,为此,您必须向原始PCM数组添加一个标头。有关wave文件格式,请查看here。这里有一个例子,它只显示了在TextView中从MediaPlayer获得的字节数组,但它似乎可以工作...!

代码语言:javascript
复制
android.permission.RECORD_AUDIO
android.permission.MODIFY_AUDIO_SETTINGS

activity_main.xml

代码语言:javascript
复制
<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

代码语言:javascript
复制
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);
            }
        });
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14933620

复制
相关文章

相似问题

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