【移动应用开发技术】Android如何实现伴奏录音合成MP3_第1页
【移动应用开发技术】Android如何实现伴奏录音合成MP3_第2页
【移动应用开发技术】Android如何实现伴奏录音合成MP3_第3页
【移动应用开发技术】Android如何实现伴奏录音合成MP3_第4页
【移动应用开发技术】Android如何实现伴奏录音合成MP3_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】Android如何实现伴奏录音合成MP3

这篇文章主要介绍了Android如何实现伴奏录音合成MP3,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让在下带着大家一起了解一下。具体内容如下基本实现思路如下:1.利用android自带的录音类(AudioRecord)实现录音.

/**

*

播放伴奏

*/

private

MediaPlayer

player;

/**

*

返回按钮

*/

private

ImageView

btnBack;

/**

*

切换歌曲

*/

private

Button

btnSwitchSong;

/**

*

伴唱时长

*/

private

TextView

tv_recod_time;

/**

*

歌词VIEW

*/

private

LyricView

lv_lyric;

/**

*

开始录制

*/

private

Button

btnPlay;

/**

*

标题

*/

private

TextView

ivTitle;

private

boolean

canPlay

=

true;

private

boolean

isPause

=

false;

/***

*

背景音乐模式

*/

private

BackgroudMusicMode

mode

=

BackgroudMusicMode.Accompany;

/**

*

歌曲id

*/

private

String

songId;

/**

*

歌曲名称

*/

private

String

songName;

/**

*

歌手名字

*/

private

String

singerName;

/**

*

伴奏文件

*/

private

File

file;

/**

*

是否正在录制

*/

private

boolean

isStart

=

false;

/**

*

录音状态

*/

private

boolean

starting

=

false;

/**

*

伴奏时间

*/

private

int

bztimetmp

=

0;

/**

*

伴奏时间

*/

private

String

bztime

=

"";

/**

*

录制时间

*/

private

int

recordTimeLength=0;

/**

*

更新伴奏时间

*/

private

RecordTask

rt

=

null;

/**

*

录制频率,单位hz.这里的值注意了,写的不好,可能实例化AudioRecord对象的时候,会出错。我开始写成11025就不行。这取决于硬件设备

*

设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025

*/

private

int

sampleRateInHz

=

44100;

/**

*

设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道

*/

private

int

channelConfig

=

AudioFormat.CHANNEL_CONFIGURATION_MONO;

/**

*

音频数据格式:PCM

16位每个样本。保证设备支持。PCM

8位每个样本。不一定能得到设备支持。

*/

private

int

audioFormat

=

AudioFormat.ENCODING_PCM_16BIT;

/**

*

调整播放音量

*/

private

AudioManager

audioManager;

/**

*

最大音量

*/

private

int

maxVolume

=

0;

/**

*

当前音量

*/

private

int

currentVolume

=

0;

/**

*

AudioRecord

写入缓冲区大小

*/

protected

int

m_in_buf_size;

/**

*

录制音频对象

*/

private

AudioRecord

mRecorder;

/**

*

录入的字节数组

*/

private

byte[]

m_in_bytes;

/**

*

存放录入字节数组的大小

*/

private

LinkedList<byte[]>

m_in_q;

/**

*

AudioTrack

播放缓冲大小

*/

private

int

m_out_buf_size;

/**

*

播放音频对象

*/

private

AudioTrack

mAudioTrack;

/**

*

播放的字节数组

*/

private

byte[]

m_out_bytes;

/**

*

录制音频线程

*/

private

Thread

record;

/**

*

播放音频线程

*/

private

Thread

play;

/**

*

让线程停止的标志

*/

private

boolean

flag

=

true;

/**

*

是否启动回声

*/

private

boolean

room_flag

=

true;

/***上面有个播放歌词的组件

/***

*

初始化

*/

private

void

init()

{

audioManager

=

(AudioManager)getSystemService(Context.AUDIO_SERVICE);

maxVolume

=

audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);

currentVolume

=

audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);

registerHeadsetPlugReceiver();

ycApplication

=

(YueChangApplication)

getApplication();

coverDao

=

new

CoverDao(getApplicationContext());

Bundle

bundle

=

getIntent().getExtras();

songId

=

bundle.getString("songId");

songName

=

bundle.getString("songName");

singerName

=

bundle.getString("singerName");

if

(songId

!=

null)

{

//

AudioRecord

得到录制最小缓冲区的大小

m_in_buf_size

=

AudioRecord.getMinBufferSize(sampleRateInHz,

channelConfig,

audioFormat);

//

实例化播放音频对象

mRecorder

=

new

AudioRecord(MediaRecorder.AudioSource.MIC,

sampleRateInHz,

channelConfig,

audioFormat,

m_in_buf_size);

//

实例化一个字节数组,长度为最小缓冲区的长度

m_in_bytes

=

new

byte[m_in_buf_size];

//

实例化一个链表,用来存放字节组数

m_in_q

=

new

LinkedList<byte[]>();

//

AudioTrack

得到播放最小缓冲区的大小

m_out_buf_size

=

AudioTrack.getMinBufferSize(sampleRateInHz,

channelConfig,

audioFormat);

//

实例化播放音频对象

mAudioTrack

=

new

AudioTrack(AudioManager.STREAM_MUSIC,

sampleRateInHz,

channelConfig,

audioFormat,

m_out_buf_size,

AudioTrack.MODE_STREAM);

//

实例化一个长度为播放最小缓冲大小的字节数组

m_out_bytes

=

new

byte[m_out_buf_size];

record

=

new

Thread(new

recordSound());

//

if(ycApplication.isHeadsetplug()){

//

}else{

//

m_out_trk

=

new

AudioTrack(AudioManager.STREAM_MUSIC,

sampleRateInHz,

channelConfig,

audioFormat,

//

m_out_buf_size,

AudioTrack.MODE_STREAM);

//

}

}

}

/**

*

*

类描述:录音线程

*

*

@version

1.0

*/

class

recordSound

implements

Runnable

{

@Override

public

void

run()

{

//

初始化输出流

DataOutputStream

dos

=

null;

try

{

File

audioFile

=

new

File(SongUtil.getRecordSingPCMPath(songId));

//

初始化输出流

dos

=

new

DataOutputStream(new

BufferedOutputStream(new

FileOutputStream(audioFile)));

byte[]

bytes_pkg;

if

(mRecorder.getState()

==

AudioRecord.STATE_UNINITIALIZED)

{

//

实例化播放音频对象

mRecorder

=

new

AudioRecord(MediaRecorder.AudioSource.MIC,

sampleRateInHz,

channelConfig,

audioFormat,

m_in_buf_size);

}

//

开始录音

mRecorder.startRecording();

while

(flag)

{

int

size

=

mRecorder.read(m_in_bytes,

0,

m_in_buf_size);

bytes_pkg

=

m_in_bytes.clone();

if

(m_in_q.size()

>=

2)

{

m_in_q.removeFirst();

}

m_in_q.add(bytes_pkg);

if

((ycApplication.isHeadsetplug()

&&

ycApplication.isOpenInEarphone())

||

(!ycApplication.isHeadsetplug()

&&

ycApplication.isOpenInSpeaker()))

{

//Log.d(SingSingleActivity.this.getClass().getName(),

"启动录音播放1");

if

(play

==

null||!room_flag)

{

//Log.d(SingSingleActivity.this.getClass().getName(),

"启动录音播放2");

room_flag

=

true;

play

=

new

Thread(new

playRecord());

//

启动播放线程

play.start();

}

}

else

{

if(room_flag||play

!=

null){

//Log.d(SingSingleActivity.this.getClass().getName(),

"关闭录音播放1");

room_flag

=

false;

if

(play

!=

null)

{

errupt();

}

play

=

null;

}

}

//

写入PCM文件

dos.write(bytes_pkg,

0,

size);

dos.flush();

}

}

catch

(Exception

e)

{

//

TODO:

handle

exception

e.printStackTrace();

}

finally

{

try

{

//

关闭录音

if

(mRecorder

!=

null)

{

try

{

if

(mRecorder.getState()

==

AudioRecord.STATE_INITIALIZED)

{

//

关闭录音

mRecorder.stop();

mRecorder.release();

}

}

catch

(Exception

e2)

{

//

TODO:

handle

exception

}

}

if

(dos

!=

null)

{

dos.close();

}

}

catch

(Exception

e2)

{

//

TODO:

handle

exception

e2.printStackTrace();

}

}

}

}2.录音完成后,调用开源工具(Mad)实现PCM合成输出到MP3文件.主要调用的合成方法:/***

*

方法描述:本地方法调用JNI合并mp3PCM与sourcePCM

*

@param

sourcePCM

*

@param

mp3PCM

*

@param

mixPCM

*

@return

*/

public

static

native

int

mix2PCMToPCM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论