ضبط صدا در اندروید
سلام امروز میخواهیم به اموزش ضبط صدا در اندروید بپردازیم.همه گوشی های اندروید دارای میکروفون هستند که ما میتوانیم از ان برای ضبط صدا استفاده کنیم.خب ابتدا باید اجازه دسترسی به برناممان بدهیم برای اینکار به فایل AndroidManifest.xml می رویم و permission های زیر را در ان مینویسیم:
1 2 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO" /> |
حالا سراغ بخش اصلی برناممان یعنی ضبط صدا و پخش و بقیه کار ها میرویم برای اینکار ما از کلاس MediaRecorder استفاده میکنیم و سپس لازم است که مشخصات ضبط صدا مانند منبع صدا را مشخص کنیم:
1 2 3 4 5 | 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 که یک مسیر از قبل تایین شدست که در ادامه ان را میبینید
خب حالا به طور کامل کدمان را مینویسیم و به اموزش ان میپردازیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | @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 این مثال هم به صورت زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <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> |
امیدوارم اموزش براتون مفید بوده باشه
موفق باشید..
با استفاده از این روش حجم فایل خروجی خیلی زیاد میشه. حدود یک ثانیه حجمی معادل یک مگابایت اشغال کرد. کدهای دیگه ای که برای ضبط صدا دیدم در اندروید، کلی مفصل بودن! آیا این موردی که فرمودید تنها راه ضبط صدا توی اندروید هست؟
سلام
چطور می تونیم صدایی که از دستگاه خارج میشه رو ضبط کنیم یعنی صدای محیط اطراف ضبط نشه فقط صدایی که در دستگاه پخش میشه ضبط بشه؟؟؟؟