J2J.RU - cовременная система продвижения сайтов
Меню сайта

Категории раздела

Наш опрос
Какой у Вас Андроид
Всего ответов: 192

Файлы
Новые Популярные Лучшие


Теги
Android (34)
uCoz (8)
mobile (3)
sistem (3)
xml (3)
google (2)
html (2)
Oboi (2)
opera (2)
Rest (2)
soap (2)
action (1)
ajax (1)
App2SD (1)
apps (1)
CSS (1)
Ddms (1)
editor (1)
gmail (1)
gobook (1)
java (1)
legend (1)
Lite (1)
live (1)
mp3 (1)
mrtm (1)
Muse (1)
ninja (1)
pdf (1)
php (1)
Root (1)
sensor (1)
shazam (1)
sql (1)
thread (1)
touch (1)
UI (1)
Widget (1)
Worms (1)
Xplore (1)
Zirco (1)

RSS
  
Новостная лента.

Форумная лента.

Файловая лента.  

Главная » Статьи » Программинг » Программирование [ Добавить статью ]

Программирование звука в Android - SoundPool и MediaPlayer

Перед любым разработчиком, занимающимся созданием красивых интерактивных приложений, рано или поздно встает вопрос об использовании мультимедийных возможностей телефона. Для работы со звуком в Android программисты активно используют две библиотеки. Первая из них предоставляет класс SoundPool, вторая - MediaPlayer.

Класс SoundPool удобно использовать для проигрывания коротких аудиоклипов. С его помощью можно проигрывать несколько звуков одновременно, при этом размер звукового файла не должен превышать 1 Mb. Класс MediaPlayer лучше подходит для воспроизведения долгих аудио и видеороликов.

Android управление звуком

Android поддерживает различные аудиопотоки для разных целей. Регулятор расположенная на торце телефона качелька для регулирования громкости управляет только одним аудиопотоком. Для того, чтобы привязать эту кнопку к аудиопотоку необходимо указать его тип в приложении

context.setVolumeControlStream(AudioManager.STREAM_MUSIC);


Как проиграть звук через SoundPool

Напишем приложение, которое будет проигрывать звук при касании экрана. Создадим новый проект с именем CrazySong, пакет назовем
 ru.mobilab.crazysong, в качестве главной Activity укажем CrazySongActivity.

Приведем main.xml к виду

xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
 
<TextView
 android:id="@+id/textView1"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:text="Click on the screen to start playing" >
</TextView>
 
</LinearLayout>


Давайте рассмотрим последовательность действий, которую необходимо выполнить для того, чтобы воспроизвести звуковой файл. Прежде всего мы должны создать объект soundPool. Его конструктор имеет несколько параметров. Первый параметр задает максимальное число одновременно проигрываемых файлов. Второй параметр задает тип аудиопотока. В большинстве случаев здесь подойдет значение soundPool STREAM_MUSIC, хотя возможно использование и других аудиопотоков. Их назначение довольно очевидно. (STREAM_ALARM, STREAM_DTMF, STREAM_NOTIFICATION, STREAM_RING,STREAM_SYSTEM, STREAM_VOICE_CALL). Третий параметр задает sample-rate. В настоящее время он ни на что не влияет, поэтому здесь устанавливаем 0.

После того, как мы создали объект для SoundPool, с помощью setOnLoadCompleteListener добавим к нему OnLoadCompleteListener, который будет отслеживать завершение загрузки файлов. В качестве параметров метод onLoadComplete принимает объект SoundPool, номер загруженного сэмпла и статус завершения операции. В случае, если все прошло успешно, статус равен нулю.

Прежде чем проигрывать звуковые файлы их необходимо загрузить в SoundPool. Сделать это можно с помощью метода load. Метод имеет несколько реализаций, различающихся набором параметров и источником, поставляющим звуковые файлы. Можно загружать файлы из папки asset, можно из APK ресурсов, можно из файла, указав к нему путь, можно из FileDescriptor. Мы будем рассматривать ситуацию, когда звуковые сэмплы входят в состав APK пакета, то есть лежат в папке res/raw вашего проекта. Для загрузки нам понадобятся три параметра: ссылка на контекст из которого мы получаем доступ к ресурсам программы (в большинстве случаев подойдет this), ссылка на ресурс, полученная через объект R, и приоритет, который пока ни на что не влияет, и в документации рекомендуется устанавливать значение 1. Загруженные ресурсы можно выгрузить с помощью методов unload, если требуется удалить один сэмпл, и release - если нужно полностью очистить SoundPool. 

Для проигрывания сэмпла используется метод play, имеющий следующие параметры:

  • soundID     переменная с номером сэмпла. Этот номер возвращается в результате выполнения метода load.
  • leftVolume     значение громкости левого канала (от 0.0 до 1.0)
  • rightVolume     значение громкости правого канала (от 0.0 до 1.0)
  • priority     приоритет потока (0 - самый низкий приоритет)
  • loop     сколько раз нужно повторить сэмпл (0 не повторять, -1 - зациклить)
  • rate     скорость воспроизведения (может изменяться от 0.5 до 2.0, 1 - нормальная скорость)


В результате выполнения метода play возвращается номер streamID (или 0 в случае ошибки), который можно использовать для управления воспроизведением. Например это значение используется при вызове методов pause и resume, stop, setVolume, setLoop. Если число максимально проигрываемых файлов превышено, то вызов очередного метода play приведет к завершению воспроизведения одного из проигрываемых в данный момент сэмплов.
 
 Код нашего класса приведен ниже
 package ru.mobilab.crazysong;

import java.io.IOException;
 
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 CrazySongActivity extends Activity implements OnTouchListener {
 private SoundPool soundPool;
 private int soundID1;
 private int soundID2;
 boolean loaded = false;
 int num=0;
 
 
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 
 //Устанавливаем прослушивальшик нажатий на Textview
 View view = findViewById(R.id.textView1);
 view.setOnTouchListener(this); 
 // Связываем кнопку громкости с нашим приложением
 this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
 
 //Создаем soundPool.
 soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
 
 //устанавливаем call-back функцию, которая вызывается по
 //завершению загрузки файла в память
 soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
 @Override
 public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
 loaded = true;
 Log.e("Test", "sampleId="+sampleId+" status="+status);
 }
 });
 
 //Загружаем звуки в память
 soundID1 = soundPool.load(this, R.raw.sound1, 1);
 soundID2 = soundPool.load(this, R.raw.sound2, 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) {
 num=num+1;
 //если переменная num четная, то играем один звук, если нечетная - другой
 if (num % 2==0){ 
 soundPool.play(soundID1, volume, volume, 1, 0, 1f);
 } else {
 soundPool.play(soundID2, volume, volume, 1, 0, 1f);
 }
 }
 }
 return false;
 }
}


SoundPool и утечка памяти

На форумах встречаются сообщения о том, что использование SoundPool вызывает проблему утечки памяти. Какой-то внятной и проверенной информацию по этому поводу найти не удалось. Если вы не собираетесь больше проигрывать звуки, рекомендуется выполнить код

soundPool.release();
soundPool = null;

но похоже, что этот метод не решает проблему в Android 2.1. Если Вы располагаете информацией об этой проблеме и ее решении, просьба отписаться в комментариях.

Воспроизведение фоновой музыки в Android с помощью MediaPlayer

SoundPool отлично подходит для озвучивания различных игровых событий: выстрелов, взрывов, реплик. Однако для проигрывания фоновой музыки нужно использовать класс MediaPlayer. Метод create этого класса имеет два параметра: контекст и ссылку на ресурс или URI адрес музыкального файла. Для запуска/паузы/остановки воспроизведения служат методы start(), pause() и stop() соответственно. Все просто.

MediaPlayer mediaPlayer;
mediaPlayer = MediaPlayer.create(this, R.raw.mediatest); 
mediaPlayer.start()

В случае, если Вы собираетесь подгружать файл из интернета, последовательность действий будет немного другая. Метод create использовать не нужно. Источник аудиоданных задается с помощью метода setDataSource, после которого нужно вызвать метод prepare(), блокирующий выполнение потока до тех пор, пока медиаплеер не будет готов к воспроизведению музыки. Метод prepareAsync() выполняет те же действия в асинхронном режиме, то есть не блокирует вызвавший его поток. В случае использования prepareAsync нужно использовать OnPreparedListener для определения момента, когда MediaPlayer готов к проигрыванию файла. Заметим, что при использовании метода create метод prepare вызывать не нужно, поскольку он вызывается внутри create.

MediaPlayer mediaPlayer;
mediaPlayer = new MediaPlayer();
 
 
mediaPlayer.setOnPreparedListener(new OnPreparedListener(){
 @Override
 public void onPrepared(MediaPlayer arg0) {
 // TODO Auto-generated method stub
 arg0.start(); //Запускаем на воспроизведение
 } 
});
//Загрузка файла из внешнего источника 
 try { 
 mediaPlayer.setDataSource("http://www.tamgdesvet.ru/music/TamGdeSvet-Proshay.mp3");
 //Кстати, я играю в этой группе на басу.
 } catch (IllegalArgumentException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (IllegalStateException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } 
 catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 //Не блокировать этот поток, выполняя подготовку в асинхронном режиме
 mediaPlayer.prepareAsync();

Остался еще один актуальный вопрос: как определить, что воспроизведение файла закончилось? Для этой цели служит функция обратного вызова onCompletion. Чтобы привязать ее к нашему медиаплееру нужно выполнить следующий код:

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
 
 public void onCompletion(MediaPlayer arg0) {
 arg0.start(); //Запускаем воспроизведение заново
 }
 
});

Вот собственно и все. 

Взято с  http://www.mobilab.ru

Категория: Программирование | Добавил: Virus (29.11.2012)

Похожие темы на пост "Программирование звука в Android - SoundPool и MediaPlayer"

Схожие темы выбранные по тегам : Mediaplayer, программирование, Android, SoundPool, звука
  
Просмотров: 2899 | Рейтинг: 0.0/0

Дорогие пользователи и гости сайта!!! Пожалуйста, если вам не сложно, оставте комментарий или ваше мнение о портале в Гостевой книге. Ваше мнение очень важно для нас и очень поможет в поиске дальнейшего пути развития сайта. С уважением, Администрация сайта AndroBum!



Так же рекомендуем:
Всего комментариев: 0
Информация:
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

[ Регистрация | Вход ]
Поиск

Мини-чат

Block title
Virus
файлов: 69
Постов: 38
Комментов: 1005
Репутация: 0
Ранг:

droid
файлов: 3
Постов: 0
Комментов: 0
Репутация: 100
Ранг:

Serge
файлов: 1
Постов: 0
Комментов: 0
Репутация: 0
Ранг:

Sergey
файлов: 1
Постов: 0
Комментов: 0
Репутация: 0
Ранг:

Аватар не установлен! Blackfoxxx
файлов: 0
Постов: 0
Комментов: 0
Репутация: 0
Ранг:


Друзья сайта
  • Официальный блог
  • скрипты, шаблоны, html, css
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz

  • Статистика Сайта
    Статистика сайта как на сайте

    Пользователей всего: +0
    Материалов всего [?]: +
    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Гости сайта Пользователи

    Яндекс.Метрика




    Пользователи онлайн:


    Flag Counter



    Все материалы размещенные на сайте принадлежат их владельцам.
    Copyright dodomo.do.am © 2010-2012