یه تابستون متفاوت با یه تصمیم هوشمندانه! دوره هوش مصنوعی یه تابستون متفاوت با یه تصمیم هوشمندانه! دوره هوش مصنوعی
🎯 ثبت نام

آموزش مدیریت فایل های صوتی در اندروید / پیاده سازی توابع کتابخانه ی Media API جهت پخش و ضبط صدا

مدیریت صدا در محیط اندروید (Android Sound)

پخش صدا

اندروید دو مجموعه توابع کتابخانه ای یا API برای پخش صدا در اختیار توسعه دهندگان قرار می دهد. اولین مجموعه از این توابع کلاس SoundPool و دیگری کلاس MediaPlayer می باشد.

SoundPool را می توان برای کلیپ های کوچک صوتی مورد استفاده قرار داد. این کلاس قادر است صداها را تکرار کرده و همچنین به طور همزمان چندین صدا را بخش کند. فایل های صوتی که توسط کلاس SoundPool پخش می شوند نباید از نظر حجم از مرز 1 مگابایت فراتر روند.

لازم به ذکر است که SoundPool فایل صوتی مربوطه را به صورت ناهمزمان (asynchronously) بارگذاری می کند. از ورژن 8 کتابخانه های اندروید (API 8) این امکان وجود دارد که از اتمام بارگذاری فایل و اطلاعات مورد نظر اطمینان حاصل نمایید. برای این منظور کافی است از OnLoadCompleteListener استفاده نمایید.

سیستم اندروید برای اهداف مختلف، از audio stream های (جریانی از بیت ها که حامل اطلاعات صوتی بوده و یک فایل صوتی را تشکیل می دهند) مختلف پشتیبانی می کند. می توان دکمه ی افزایش و کاهش میزان صدای دستگاه را طوری تنظیم کرد که برای مثال در حین دریافت تماس، میزان صدای تماس گیرنده را کاهش یا افزایش دهد. جهت تنظیم دکمه برای کنترل media stream و اطلاعات صوتی (جریانی از بیت ها و اطلاعات که تشکیل دهنده ی فایل صوتی هستند)، کافی است audio type را در اپلیکیشن خود مقداری دهی و مشخص نمایید.

1
context.setVolumeControlStream(AudioManager.STREAM_MUSIC);<button></button>

کلاس MediaPlayer گزینه ی بهتری جهت پخش موسیقی های طولانی تر و فایل های تصویری حجیم نظیر فیلم ها می باشد.


کلاس MediaRecorder

با استفاده از کلاس MediaRecorder می توان به راحتی اطلاعات مربوط به صدا و تصویر را ضبط کرد. جهت استفاده از کلاس نام برده لازم است دستگاه منبع (source device) و فرمت را مشخص نمایید.


افزودن Media جدید به Media library

این امکان برای شما وجود دارد که Media (فایل و داده های صوتی) جدید به media library (مجموعه فایل های صوتی) اندروید اضافه نمایید. برای نیل به این هدف کافی است یک آبجکت Intent ایجاد نموده و سپس از طریق آن media application (اپلیکیشن پخش و ضبط صدا) مستقر بر روی دستگاه، به آن اطلاع دهید که محتوای جدید در دسترس می باشد. کد زیر نحوه ی پیاده سازی آن را به نمایش می گذارد.

1
2
3
4
5
6
7
8
9
10
11
12
13
// add new file to your media library
ContentValues values = new ContentValues(4);
long current = System.currentTimeMillis();
values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName());
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000));
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp");
values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath());
ContentResolver contentResolver = getContentResolver();
Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Uri newUri = contentResolver.insert(base, values);
// Notifiy the media application on the device
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri));
<button></button>

فرمت های مورد پشتیبانی

اندروید از فرمت های مختلف پشتیبانی می کند. جهت مشاهده ی فرمت های مورد پشتیبانی اندروید می توانید به آدرس http://developer.android.com/guide/appendix/media-formats.html مراجعه نمایید.


آموزش کاربردی: پخش صدا به وسیله ی کلاس SoundPool

در بخش حاضر یک اپلیکیشن خواهیم نوشت که به مجرد برخورد انگشت کاربر با سطح نمایشگر، یک آهنگ یا صدا را بخش خواهد کرد. ابتدا یک پروژه و activity جدید اندروید به ترتیب به نام های "de.vogella.android.soundpool" و PlaySound ایجاد نمایید.

محتوای فایل main.xml که ظاهر اپلیکیشن را تعریف می کند، به صورت زیر ویرایش نمایید.

1
2
3
4
5
6
<!--?xml version="1.0" encoding="utf-8" ?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<textview android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="match_parent" android:text="Click on the screen to start playing">
</textview>
</linearlayout>
<button></button>

فایل صوتی مورد نظر را دانلود نمایید. در صورت تمایل می توانید فایل صوتی آزمایشی خود را از آدرس http://hamsterrepublic.com/ohrrpgce/Free_Sound_Effects.html بارگیری کنید. این سایت تعداد زیادی فایل صوتی کم حجم به صورت رایگان در اختیار شما قرار می دهد.

فایل صوتی دریافت شده را داخل پوشه ی "res/raw" تحت نام "sound1.ogg" ذخیره نمایید. با انتخاب این پسوند برای نام فایل شما به سیستم اعلان می کنید که یک فایل با فرمت ogg از اینترنت بارگیری کرده اید.

کلاس activity خود را به صورت زیر پیاده سازی نمایید.

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
package de.vogella.android.soundpool;
import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class PlaySound extends Activity implements OnTouchListener {
private SoundPool soundPool;
private int soundID;
boolean loaded = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    View view = findViewById(R.id.textView1);
    view.setOnTouchListener(this);
    // Set the hardware buttons to control the music
    this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
    // Load the sound
    soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId,
                            int status) {
                    loaded = true;
            }
    });
    soundID = soundPool.load(this, R.raw.sound1, 1);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
            // Getting the user sound settings
            AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
            float actualVolume = (float) audioManager
                            .getStreamVolume(AudioManager.STREAM_MUSIC);
            float maxVolume = (float) audioManager
                            .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
            float volume = actualVolume / maxVolume;
            // Is the sound loaded already?
            if (loaded) {
                    soundPool.play(soundID, volume, volume, 1, 0, 1f);
                    Log.e("Test", "Played sound");
            }
    }
    return false;
}
}
<button></button>

حال زمانی که کاربر سطح نمایشگر، activity اپلیکیشن، را لمس می کند، فایل صوتی پخش خواهد شد. لازم به ذکر است که صدا بر اساس تنظیمات صوتی جاری پخش خواهد شد.


آموزش کاربردی: ضبط صدا (media) با استفاده از کلاس MediaRecorder

در بخش آموزشی حاضر یک اپلیکیشن طراحی می کنیم که به مجرد برخورد انگشت کاربر با سطح نمایشگر، یک فایل صوتی را پخش خواهد می کند. یک پروژه و activity اندروید به ترتیب به نام های "de.vogella.android.media.soundrecording" و RecordSound ایجاد نمایید.

مجوز درج اطلاعات در حافظه خارجی (SD) و ضبط اطلاعات صوتی را در فایل تنظیمات اپلیکیشن AndroidManifest.xml اعلان نمایید.

1
2
3
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
<button></button>

محتوای فایل main.xml را به صورت زیر اصلاح نمایید.

1
2
3
4
5
6
<!--?xml version="1.0" encoding="utf-8" ?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal">
<button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Recording" android:onclick="startRecording"></button>
<button android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop Recording" android:enabled="false" android:onclick="stopRecording"></button>
</linearlayout>
<button></button>

کد کلاس activity اپلیکیشن را نیز به صورت زیر ویرایش نمایید.

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
package de.vogella.android.media.soundrecording;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class SoundRecordingActivity extends Activity {
MediaRecorder recorder;
File audiofile = null;
private static final String TAG = "SoundRecordingActivity";
private View startButton;
private View stopButton;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    startButton = findViewById(R.id.start);
    stopButton = findViewById(R.id.stop);
}
public void startRecording(View view) throws IOException {
    startButton.setEnabled(false);
    stopButton.setEnabled(true);
    File sampleDir = Environment.getExternalStorageDirectory();
    try {
            audiofile = File.createTempFile("sound", ".3gp", sampleDir);
    } catch (IOException e) {
            Log.e(TAG, "sdcard access error");
            return;
    }
    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(audiofile.getAbsolutePath());
    recorder.prepare();
    recorder.start();
}
public void stopRecording(View view) {
    startButton.setEnabled(true);
    stopButton.setEnabled(false);
    recorder.stop();
    recorder.release();
    addRecordingToMediaLibrary();
}
protected void addRecordingToMediaLibrary() {
    ContentValues values = new ContentValues(4);
    long current = System.currentTimeMillis();
    values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName());
    values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000));
    values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp");
    values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath());
    ContentResolver contentResolver = getContentResolver();
    Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Uri newUri = contentResolver.insert(base, values);
    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri));
    Toast.makeText(this, "Added File " + newUri, Toast.LENGTH_LONG).show();
}
}
<button></button>

حال زمانی که کاربر دکمه ی "Start Recording" را فشار می دهد، دستگاه شروع به ضبط صدا می نماید. با فشردن دکمه ی stop recording، می بینید که فرایند ضبط صدا متوقف شده و اطلاعات ذخیره شده متعاقبا به media library (مجموعه فایل های صوتی) شما اضافه می گردد.


1403/03/07 11425 1930
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...