Gunakan SoundPool untuk memainkan kesan bunyi (Duang~)
Pengenalan kepada bahagian ini:
Bab 9 membawakan kepada anda pembangunan multimedia dalam Android Ia bukan pembangunan multimedia seperti API berkaitan multimedia. Penggunaan Untuk memainkan muzik, kami hanya memanggil MediaPlayer dan mencari fail muzik, Kemudian panggil kaedah main untuk bermain... Sudah tentu, pembangunan multimedia sebenar adalah bidang lain, pengekodan dan penyahkodan audio dan video, Saya hanya boleh melihat dan menunggu buat masa ini, jika kita tahu cara memanggil API ini! By the way, kita masih perlu mempopularkan multimedia Android Sedikit akal tentang rangka kerja:
Pada Android, rangka kerja multimedia lalai ialah
OpenCore. Kelebihan OpenCore ialah ia mengambil kira kedua-duanya Ia mudah alih merentas platform dan telah disahkan oleh banyak pihak, jadi ia agak stabil tetapi kelemahannya ialah ia terlalu besar dan kompleks. Ia mengambil banyak masa untuk mengekalkan. Bermula daripada Android 2.0, Google memperkenalkan Stagefright dengan seni bina yang sedikit lebih ringkas, ia tidak sepenuhnya meninggalkan OpenCore, terutamanya lapisan OMX, yang hanya menyokong OpenCore. Bahagian komponen omx dirujuk. Terdapat kecenderungan untuk menggantikan OpenCORE secara beransur-ansur, tetapi pada bulan Ogos tahun ini saya dapati Kerentanan Stagefright yang membenarkan pelaksanaan kod jauh dengan mengeksploitasi mesej MMS yang direka khas. Kerentanan ini menjejaskan Android 2.2 dan versi yang lebih baharu, manakala kesan pada Android 4.1 dan versi yang lebih baharu adalah agak lemah.
Unknown Jueli(Saya pun tak tahu apa yang JB cakapkan), um, okey, popularisasi sains dah tamat... Baru tahu benda ni! Dengan cara ini, rangka kerja multimedia ini terletak dalam
Rangka Kerja Mediayang merupakan lapisan ketiga seni bina Android (Perpustakaan)! Selain itu, jika anda ingin mengetahui jenis data audio dan video yang disokong oleh rangka kerja multimedia Android, sila lihat dokumentasi rasmi:
Format Media yang DisokongMedia dan KameraKemudian lihat dokumen berikut:
Nah, terlalu banyak perkara karut pada mulanya, dan saya hampir terlupa bahawa protagonis hari ini ialah SoundPool Seperti tajuknya, SoundPool biasanya digunakan Mainkan kesan bunyi padat, pantas dan jangka pendek, seperti kesan bunyi lagak ngeri: Duang~, yang sering digunakan dalam permainan Anda juga boleh menambahkannya pada anda APP menambah kesan bunyi ini Contohnya, apabila Muzik Kugou dimainkan, "Hello, Kugou" sebenarnya, idea ini agak bagus. Secara tidak langsung memberitahu pengguna volum semasa pemain, jika tidak, sebaik sahaja pengguna memainkan lagu, epal kecil tiba-tiba muncul, menarik berdekatan Amat buruk jika Mak Cik menari, bukan? Selain menambahkannya dalam pemain muzik, anda juga boleh menambahkannya dalam APP biasa, seperti menerima pemberitahuan tolak. mesej atau mesej sembang baharu, dan kemudian mainkan bunyi gesaan, seperti versi baharu kurikulum super, tambah perkara ini dan terima pemberitahuan tolak Mesej akan memainkan bunyi "meja" pendek! Objek SoundPool boleh dilihat sebagai sumber yang boleh diimport daripada APK Atau muatkan koleksi sampel fail daripada sistem fail. Ia menggunakan perkhidmatan MediaPlayer untuk menyahkod audio menjadi 16-bit mentah aliran PCM. Ciri ini membolehkan aplikasi melakukan pemampatan strim tanpa perlu menanggung beban CPU dan kependaman yang disebabkan oleh penyahmampatan semasa memainkan audio. SoundPool menggunakan konsep Kolam Bunyi untuk mengurus berbilang Strim Main Semula Jika bilangan strim maksimum melebihi, SoundPool secara automatik akan menghentikan strim yang dimainkan sebelum ini berdasarkan keutamaan Selain itu, SoundPool juga menyokong penetapan kualiti bunyi. Kelantangan, nisbah main balik dan parameter lain. Okay, tanpa berlengah lagi, mari kita mulakan bahagian ini: Dokumen API rasmi: SoundPool
1 Pengenalan kaedah berkaitan:
1) Kaedah pembinaan:
<. 🎜>SoundPool(int maxStreams, int streamType, int srcQuality) Parameternya ialah:
①Nyatakan bilangan bunyi yang disokong dan bilangan maksimum strim yang dibenarkan wujud serentak dalam objek SoundPool. ②Nyatakan jenis bunyi. Jenis strim boleh dibahagikan kepada
- PANGGILAN_SUARA_STREAM, SISTEM_STREAM, RING_STREAM,STREAM_STREAM danIC STREAM_ALARMEmpat jenis. Ditakrifkan dalam AudioManager.
- ③Nyatakan kualiti bunyi (kualiti penukaran kadar pensampelan), biasanya ditetapkan kepada 0 terus!
Kaedah pembinaan di atas boleh digunakan dalam versi yang lebih rendah, tetapi kaedah pembinaan ini sudah lapuk selepas API 21 (Android 5.0)! Apabila menggunakan SoundPool.Builder, kami hanya perlu memanggil:
SoundPool.Builder spb = new SoundPool.Builder(); spb.setMaxStreams(10); spb.setAudioAttributes(null); //转换音频格式 SoundPool sp = spb.build(); //创建SoundPool对象
untuk membuat instantiate SoundPool Jika anda ingin menggunakan kod di atas, versi TargetSDK mesti ditetapkan kepada lebih besar daripada atau sama dengan 21! Dan jika versi minSDK kurang daripada 21 Peringatan berikut akan muncul:
2) Pengenalan kepada kaedah biasa:
①Muat sumber bunyi :
- muat(Konteks konteks, int resId, int priority)
- load(String path, int priority)
- muat(FileDescriptor fd, long offset, long length, int priority)
- muat(AssetFileDescriptor afd, int priority) Kaedah di atas semua akan mengembalikan ID bunyi Kemudian kita boleh menggunakan ID ini untuk memainkan bunyi yang ditentukan
Pengenalan parameter:
- konteks: konteks
- resId: id sumber
- keutamaan: parameter yang tidak berguna, adalah disyorkan untuk menetapkannya kepada 1 untuk mengekalkan keserasian dengan masa hadapan
- laluan: laluan fail
- FileDescriptor: Nampaknya ia adalah strim, saya tidak tahu tentang ini
- AssetFileDescriptor: Baca fail sumber daripada direktori aset, penggunaan: AssetFileDescriptor descriptor = assetManager.openFd ("biaobiao.mp3 ");
②Kawalan Main:
main( int soundID, float leftVolume , float rightVolume, int priority, int loop, float rate)
Parameternya ialah:
- soundID: nombor ID bunyi yang dikembalikan oleh Load( )
- leftVolume: Tetapan kelantangan saluran kiri
- kananVolume: Tetapan kelantangan saluran kanan
- keutamaan: Tentukan keutamaan memainkan bunyi, lebih besar keutamaan.
- gelung: Tentukan sama ada hendak gelung: -1 bermaksud gelung tak terhingga, 0 bermakna tiada gelung, nilai lain menunjukkan bilangan kali untuk dimainkan berulang kali
- kadar: Tentukan kadar main balik: kadar main balik 1.0 boleh membuat bunyi mengikut frekuensi asalnya, dan kadar main balik 2.0 boleh membuat bunyi mengikut frekuensinya. Main semula pada dua kali kekerapan asal. Jika ia adalah kadar main balik 0.5, kadar main balik adalah separuh daripada kekerapan asal. Kadar main balik berjulat dari 0.5 hingga 2.0.
③Keluaran Sumber:
Anda boleh memanggil kaedah release() untuk melepaskan memori yang diduduki oleh semua objek dan sumber SoundPool, sudah tentu juga berdasarkan bunyi ID untuk dikeluarkan!
3. Gunakan contoh kod:
Jalankan pemaparan :
Apabila anda mengklik butang, "Duang" akan muncul Berikut adalah dua kaedah pemuatan yang ditunjukkan, iaitu mentah dan aset!
Kod kunci:
MainActivity.java:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button btn_play1; private Button btn_play2; private Button btn_play3; private Button btn_play4; private Button btn_play5; private Button btn_release; private AssetManager aManager; private SoundPool mSoundPool = null; private HashMap soundID = new HashMap(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); aManager = getAssets(); try { initSP(); } catch (Exception e) { e.printStackTrace(); } bindViews(); } private void bindViews() { btn_play1 = (Button) findViewById(R.id.btn_play1); btn_play2 = (Button) findViewById(R.id.btn_play2); btn_play3 = (Button) findViewById(R.id.btn_play3); btn_play4 = (Button) findViewById(R.id.btn_play4); btn_play5 = (Button) findViewById(R.id.btn_play5); btn_release = (Button) findViewById(R.id.btn_release); btn_play1.setOnClickListener(this); btn_play2.setOnClickListener(this); btn_play3.setOnClickListener(this); btn_play4.setOnClickListener(this); btn_play5.setOnClickListener(this); btn_release.setOnClickListener(this); } private void initSP() throws Exception{ //设置最多可容纳5个音频流,音频的品质为5 mSoundPool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 5); soundID.put(1, mSoundPool.load(this, R.raw.duang, 1)); soundID.put(2 , mSoundPool.load(getAssets().openFd("biaobiao.mp3") , 1)); //需要捕获IO异常 soundID.put(3, mSoundPool.load(this, R.raw.duang, 1)); soundID.put(4, mSoundPool.load(this, R.raw.duang, 1)); soundID.put(5, mSoundPool.load(this, R.raw.duang, 1)); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_play1: mSoundPool.play(soundID.get(1), 1, 1, 0, 0, 1); break; case R.id.btn_play2: mSoundPool.play(soundID.get(2), 1, 1, 0, 0, 1); break; case R.id.btn_play3: mSoundPool.play(soundID.get(3), 1, 1, 0, 0, 1); break; case R.id.btn_play4: mSoundPool.play(soundID.get(4), 1, 1, 0, 0, 1); break; case R.id.btn_play5: mSoundPool.play(soundID.get(5), 1, 1, 0, 0, 1); break; case R.id.btn_release: mSoundPool.release(); //回收SoundPool资源 break; } } }
Kod ini sangat mudah, dan jika anda mengklik yang terakhir butang Jika ya, SoundPool akan dikeluarkan, dan kemudian butang lain Ia tidak akan menjadi Duang~
4.OnLoadCompleteListener memantau sama ada fail bunyi telah dimuatkan
Nah, ini adalah sesuatu yang saya fikirkan buat sementara waktu pasal lepas dah habis tetiba teringat cara penggunaannya sangat mudah kita boleh Tambahkan OnLoadCompleteListener pada kod di atas, dan kemudian ganti kaedah onLoadComplete() , dan akhirnya tetapkan perkara ini untuk objek SoundPool!
mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { @Override public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { Toast.makeText(MainActivity.this,"加特技准备完毕~",Toast.LENGTH_SHORT).show(); } });
5. Contoh muat turun kod:
Ringkasan bahagian ini:
Baiklah, bahagian ini akan memberi anda sedikit pengetahuan umum tentang multimedia Andorid dan mengajar anda cara menambah kesan bunyi pada APP anda. Ia boleh dicapai melalui SoundPool yang ringkas Apa lagi yang anda tunggu?