ضبط صدا در اندروید
سلام امروز میخواهیم به اموزش ضبط صدا در اندروید بپردازیم.همه گوشی های اندروید دارای میکروفون هستند که ما میتوانیم از ان برای ضبط صدا استفاده کنیم.خب ابتدا باید اجازه دسترسی به برناممان بدهیم برای اینکار به فایل AndroidManifest.xml می رویم و permission های زیر را در ان مینویسیم:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
حالا سراغ بخش اصلی برناممان یعنی ضبط صدا و پخش و بقیه کار ها میرویم برای اینکار ما از کلاس MediaRecorder استفاده میکنیم و سپس لازم است که مشخصات ضبط صدا مانند منبع صدا را مشخص کنیم:
MediaRecorder myRecorder = new MediaRecorder();
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myRecorder.setOutputFile(outputFile);
در اینجا به بررسی مختصر توابع این کلاس میپردازیم:
setAudioSource():برای مشخص کردن منبع ضبط صدا را مشخص میکنم که در اینجا میکروفون نوشته شده است
setOutputFormat():فرمت ذخیره صدا را مشخص میکند مانند 3gp
setAudioEncoder():نوع رمزنگاری صدا را مشخص میکند
setOutputFile():محل ذخیره فایل ضبط شده را مشخص میکند ما در اینجا نوشتیم outputFile که یک مسیر از قبل تایین شدست که در ادامه ان را میبینید
خب حالا به طور کامل کدمان را مینویسیم و به اموزش ان میپردازیم:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.text1);
// store it to sd card
outputFile = Environment.getExternalStorageDirectory().
getAbsolutePath() + "/javacodegeeksRecording.3gpp";
MediaRecorder myRecorder = new MediaRecorder();
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myRecorder.setOutputFile(outputFile);
startBtn = (Button)findViewById(R.id.start);
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
start(v);
}
});
stopBtn = (Button)findViewById(R.id.stop);
stopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stop(v);
}
});
playBtn = (Button)findViewById(R.id.play);
playBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
play(v);
}
});
stopPlayBtn = (Button)findViewById(R.id.stopPlay);
stopPlayBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopPlay(v);
}
});
}
public void start(View view){
try {
myRecorder.prepare();
myRecorder.start();
} catch (IllegalStateException e) {
// start:it is called before prepare()
// prepare: it is called after start() or before setOutputFormat()
e.printStackTrace();
} catch (IOException e) {
// prepare() fails
e.printStackTrace();
}
text.setText("Recording Point: Recording");
startBtn.setEnabled(false);
stopBtn.setEnabled(true);
Toast.makeText(getApplicationContext(), "Start recording...",
Toast.LENGTH_SHORT).show();
}
public void stop(View view){
try {
myRecorder.stop();
myRecorder.release();
myRecorder = null;
stopBtn.setEnabled(false);
playBtn.setEnabled(true);
text.setText("Recording Point: Stop recording");
Toast.makeText(getApplicationContext(), "Stop recording...",
Toast.LENGTH_SHORT).show();
} catch (IllegalStateException e) {
// it is called before start()
e.printStackTrace();
} catch (RuntimeException e) {
// no valid audio/video data has been received
e.printStackTrace();
}
}
public void play(View view) {
try{
myPlayer = new MediaPlayer();
myPlayer.setDataSource(outputFile);
myPlayer.prepare();
myPlayer.start();
playBtn.setEnabled(false);
stopPlayBtn.setEnabled(true);
text.setText("Recording Point: Playing");
Toast.makeText(getApplicationContext(), "Start play the recording...",
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void stopPlay(View view) {
try {
if (myPlayer != null) {
myPlayer.stop();
myPlayer.release();
myPlayer = null;
playBtn.setEnabled(true);
stopPlayBtn.setEnabled(false);
text.setText("Recording Point: Stop playing");
Toast.makeText(getApplicationContext(), "Stop playing the recording...",
Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
خب همانطور که گفتیم بخش اول outputFile را که محل ذخیره فایلمان است مشخص کردیم.سپس بخش بعدی کدمان که بررسی کردیم را نوشتیم(مشخص کردن منابع و محل ذخیره و..).در مرحله بعدی دکمه هایی را قرار دادیم و برای ان ها رویداد نوشتیم تا کار ضبط و توقف ضبط و پخش و توقف پخشمان را در ان ها بنویسیم.بخش مهم کدمان توابعی است که تعریف کردیم برای انجام عملیاتی که به ان ها اشاره شد.این توابع شامل start() و stop() و play() و stopPlay() هستند که عملکرداشن از نامشان مشخص است.
دستوراتی که در توابع استفاده شده برای کنترل ضبط و پخش شامل موارد زیر هستند:
stop():برای توقف ضبط صدا استفاده می شود
prepare() و start():برای ایجاد و شروع ضبط استفاده می شود
برای پخش صدای ضبط شده از محل مشخص شده هم از کلاس mediaPlayer استفاده شده است که اموزشش قبلا در سایت قرار گرفته است میتوانید از اینجا مطالعه کنید.
بخش main_activity.xml این مثال هم به صورت زیر است:
<RelativeLayout 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"
tools:context=".MainActivity" >
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Recording Point: -"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ImageView
android:id="@+id/micImage"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_below="@+id/text1"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:src="@android:drawable/presence_audio_online" />
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_below="@+id/micImage"
android:id="@+id/linear1"
android:orientation="horizontal" >
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start" />
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:enabled="false"
android:text="stop" />
</LinearLayout>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_below="@+id/linear1"
android:id="@+id/linear2"
android:orientation="horizontal" >
<Button
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="play" />
<Button
android:id="@+id/stopPlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:layout_marginLeft="10dp"
android:text="stop playing" />
</LinearLayout>
</RelativeLayout>
امیدوارم اموزش براتون مفید بوده باشه
موفق باشید..
آموزش برنامه نویسی اندروید |
با استفاده از این روش حجم فایل خروجی خیلی زیاد میشه. حدود یک ثانیه حجمی معادل یک مگابایت اشغال کرد. کدهای دیگه ای که برای ضبط صدا دیدم در اندروید، کلی مفصل بودن! آیا این موردی که فرمودید تنها راه ضبط صدا توی اندروید هست؟
سلام
چطور می تونیم صدایی که از دستگاه خارج میشه رو ضبط کنیم یعنی صدای محیط اطراف ضبط نشه فقط صدایی که در دستگاه پخش میشه ضبط بشه؟؟؟؟