Java 将音频样本直接录制到Android上的音乐文件中
我正在制作一个android应用程序,我希望能够将一些在音轨上播放的音频录制到一个音乐文件中,对我来说,制作一个播放样本的ArrayList是个好主意,在播放时添加每个样本。我已经做了一些我希望能工作的东西,但之后在“音乐”应用程序下什么也没显示。请看一下我的代码,告诉我这是否是保存到音乐中的正确方法,以及我需要做些什么才能使其正常工作。请特别关注startRecord()和stopRecording()Java 将音频样本直接录制到Android上的音乐文件中,java,android,audio,sampling,Java,Android,Audio,Sampling,我正在制作一个android应用程序,我希望能够将一些在音轨上播放的音频录制到一个音乐文件中,对我来说,制作一个播放样本的ArrayList是个好主意,在播放时添加每个样本。我已经做了一些我希望能工作的东西,但之后在“音乐”应用程序下什么也没显示。请看一下我的代码,告诉我这是否是保存到音乐中的正确方法,以及我需要做些什么才能使其正常工作。请特别关注startRecord()和stopRecording() package com.example.test; 导入java.io.File; 导入j
package com.example.test;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入android.app.Activity;
导入android.app.AlertDialog;
导入android.content.Context;
导入android.content.DialogInterface;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.graphics.Point;
导入android.media.AudioFormat;
导入android.media.AudioManager;
导入android.media.AudioTrack;
导入android.os.Bundle;
导入android.os.Environment;
导入android.os.Handler;
导入android.view.Display;
导入android.view.MotionEvent;
导入android.view.view;
导入android.widget.EditText;
公共类Afspl扩展活动{
公众视野六;
私有点大小;
显示显示;
公共int宽、高、cx、cy;
布尔doPlay=false;
线声播放器;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
disp=getWindowManager().getDefaultDisplay();
试一试{
显示getSize(大小);
宽=尺寸x;
高=尺寸y;
}捕获(例外e){
wide=disp.getWidth();
高=显示getHeight();
}
cx=0;//跟踪鼠标x
cy=0;//跟踪鼠标y
vi=新的绘图视图(getApplicationContext());
setContentView(vi);
soundPlayer=新线程(新可运行(){
公开募捐{
整数计数=0;
while(true){
试一试{
睡眠((长)(持续时间*10));
}捕获(例外e){}
如果(!doPlay){
如果(count==1)跟踪.stop();
继续;
}
内部注释=cy*12/高;
如果(cx>宽/2)注释+=12;
intfreq=(int)(440*数学功率(1.059463,注));
系统输出打印项次(注+“,”+频率);
genTone(freq);
如果(计数=0){
handler.post(新的Runnable(){
公开募捐{
播放声音();
}
});
计数++;
}否则{
handler.post(新的Runnable(){
公开募捐{
track.release();
播放声音();
}
});
}
}
}
});
soundPlayer.start();
}
类DrawView扩展了视图{
油漆=新油漆();
公共绘图视图(上下文){
超级(上下文);
}
公共空白onDraw(画布c){
int red=256;
绿色整数=0;
int蓝色=0;
int-curInc=0;
对于(int i=0;i=256){
curInc=1;
}
}
else if(curInc==1){
红色-=256/2;
如果(红色=256){
curInc=3;
}
}
否则如果(curInc==3){
绿色-=256/2;
如果(绿色=256){
curInc=5;
}
}否则如果(curInc==5){
蓝色-=256/2;
}
整数宽度=宽;
int start=0;
如果(i=12){
星形=(i-12)*高度;
endy=(i-11)*高度;
}
c、 drawRect(起点、起点、宽度、终点、油漆);
}
油漆。设置颜色(颜色。白色);
c、 drawRect(宽-100,高-100,宽,高,油漆);
}
公共整数getColor(整数r、整数g、整数b){
系统输出println(r+,“+g+,”+b);
内部红色=(r高-50){
如果(!isRecording)startRecord();
否则停止录制();
}
返回true;
case MotionEvent.ACTION\u移动:
cx=(int)me.getX();
cy=(int)me.getY();
返回true;
违约:
返回super.onTouchEvent(我);
}
}
公共双倍持续时间=1;
公共int采样器=8000;
公共int numSamples=(int)持续时间*采样器;
公共最终双样本[]样本=新双样本[numSamples];
公共最终字节[]generatedSnd=新字节[numSamples*2];
public Handler=new Handler();
音轨;
公用电话(国际频率){
对于(int i=0;i>>8);
如果(isRecording){
toRec.add((字节)(val&0x00ff));
toRec.add((字节)((val&0xff00)>>>8));
}
}
}
公共空间播放声音(){
曲目=新的音频曲目(AudioManager.STREAM\u MUSIC、sampleRate、AudioFormat.CHANNEL\u OUT\u MONO、AudioFormat.ENCODING\u PCM\u 16位、generatedSnd.length、AudioTrack.MODE\u STATIC);
track.write(generatedSnd,0,generatedSnd.length);
track.play();
}
public List toRec=new ArrayList();
布尔值
package com.example.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
public class Afspl extends Activity {
public DrawView vi;
private Point size;
Display disp;
public int wide, high, cx, cy;
boolean doPlay = false;
Thread soundPlayer;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
disp = getWindowManager().getDefaultDisplay();
try{
disp.getSize(size);
wide = size.x;
high = size.y;
}catch(Exception e){
wide = disp.getWidth();
high = disp.getHeight();
}
cx = 0; //tracks mouse x
cy = 0; //tracks mouse y
vi = new DrawView(getApplicationContext());
setContentView(vi);
soundPlayer = new Thread(new Runnable(){
public void run(){
int count = 0;
while(true){
try{
Thread.sleep((long)(duration * 10));
}catch(Exception e){}
if(!doPlay){
if(count==1)track.stop();
continue;
}
int note = cy * 12 / high;
if(cx > wide/2)note+=12;
int freq = (int)(440 * Math.pow(1.059463, note));
System.out.println(note + ", " + freq);
genTone(freq);
if(count==0){
handler.post(new Runnable(){
public void run(){
playSound();
}
});
count++;
}else{
handler.post(new Runnable(){
public void run(){
track.release();
playSound();
}
});
}
}
}
});
soundPlayer.start();
}
class DrawView extends View{
Paint paint = new Paint();
public DrawView(Context context){
super(context);
}
public void onDraw(Canvas c){
int red = 256;
int green = 0;
int blue = 0;
int curInc = 0;
for(int i=0; i<24; i++){
if(curInc==0){
green += 256/2;
if(green>=256){
curInc = 1;
}
}
else if(curInc == 1){
red -= 256/2;
if(red<=0){
curInc = 2;
}
}
else if(curInc == 2){
blue += 256/2;
if(blue >= 256){
curInc = 3;
}
}
else if(curInc == 3){
green -= 256/2;
if(green<=0){
curInc = 4;
}
}
else if(curInc == 4){
red += 256/2;
if(red>=256){
curInc = 5;
}
}else if(curInc == 5){
blue -= 256/2;
}
int width = wide;
int start = 0;
if(i<12){
width/=2;
}
else{
start = width/2;
if(red==0){
red = 128;
}
if(green == 0){
green = 128;
}
if(blue == 0){
blue = 128;
}
}
paint.setColor(getColor(red, blue, green));
int height = high / 12;
int starty = i * height;
int endy = (i+1) * height;
if(i>=12){
starty = (i-12) * height;
endy = (i-11) * height;
}
c.drawRect(start, starty, width, endy, paint);
}
paint.setColor(Color.WHITE);
c.drawRect(wide-100, high-100, wide, high, paint);
}
public int getColor(int r, int g, int b){
System.out.println(r + "," + g + "," + b);
int red = (r << 16) & 0x00ff0000;
int green = (g << 8) & 0x0000ff00;
int blue = b & 0x000000ff;
return 0xff000000 | red | green | blue;
}
}
public boolean onTouchEvent(MotionEvent me){
int type = me.getActionMasked();
switch(type){
case MotionEvent.ACTION_DOWN:
cx = (int)me.getX();
cy = (int)me.getY();
doPlay = true;
return true;
case MotionEvent.ACTION_UP:
doPlay = false;
if(cx > wide-50 && cy > high-50){
if(!isRecording)startRecord();
else stopRecording();
}
return true;
case MotionEvent.ACTION_MOVE:
cx = (int)me.getX();
cy = (int)me.getY();
return true;
default:
return super.onTouchEvent(me);
}
}
public double duration = 1;
public int sampleRate = 8000;
public int numSamples = (int)duration * sampleRate;
public final double[] samples = new double[numSamples];
public final byte[] generatedSnd = new byte[numSamples * 2];
public Handler handler = new Handler();
AudioTrack track;
public void genTone(int freq){
for(int i = 0; i<numSamples; i++){
samples[i] = Math.pow(-1, (float)(i / (sampleRate/freq)));
}
int idx = 0;
int volume = 32767 * cx/wide;
for (final double dVal : samples) {
final short val = (short) ((dVal+1) * volume);
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
if(isRecording){
toRec.add((byte)(val & 0x00ff));
toRec.add((byte)((val & 0xff00) >>> 8));
}
}
}
public void playSound(){
track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length, AudioTrack.MODE_STATIC);
track.write(generatedSnd, 0, generatedSnd.length);
track.play();
}
public List<Byte> toRec = new ArrayList<Byte>();
boolean isRecording = false;
public void startRecord(){
isRecording = true;
toRec.clear();
}
String name;
public void setName(String str){
name=str;
}
public void stopRecording(){
Byte[] samplesNew = toRec.toArray(new Byte[toRec.size()]);
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Song Name");
alert.setMessage("Enter Song Title");
final EditText input = new EditText(this);
alert.setView(input);
final String name = "";
alert.setPositiveButton("OK", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int inter){
setName(input.getText().toString());
}
});
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int inter){
}
});
alert.show();
setName(name + ".mp3");
File writeTo = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC), "name");
if(!writeTo.mkdirs()){
System.out.println("Dir not created");
}
FileOutputStream stream = null;
try {
stream = new FileOutputStream(writeTo);
for(Byte b : samplesNew){
stream.write(b);
}
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}