Android Audio
Operační systém Android poskytuje rozsáhlou podporu multimédií, která zahrnuje zvuk i video. Tato příručka se zaměřuje na zvuk v Androidu a věnuje se přehrávání a záznamu zvuku pomocí integrovaných tříd přehrávače zvuku a záznamníku a také rozhraní API pro zvuk nízké úrovně. Zabývá se také prací se zvukovými událostmi, které vysílají jiné aplikace, aby vývojáři mohli vytvářet dobře fungující aplikace.
Přehled
Moderní mobilní zařízení mají funkce, které dříve vyžadovaly vyhrazené vybavení – fotoaparáty, hudební přehrávače a videorekordéry. Z tohoto důvodu se multimediální architektury staly prvotřídní funkcí v mobilních rozhraních API.
Android poskytuje rozsáhlou podporu multimédií. Tento článek se zabývá prací se zvukem v Androidu a zabývá se následujícími tématy.
Přehrávání zvuku pomocí MediaPlayeru – použití integrované třídy k přehrávání zvuku, včetně místních zvukových souborů a streamovaných zvukových souborů pomocí
AudioTracktřídy .Záznam zvuku – použití integrované třídy k záznamu zvuku.
Práce se zvukovými oznámeními – pomocí zvukových oznámení můžete vytvářet dobře fungující aplikace, které správně reagují na události (například příchozí telefonní hovory) pozastavením nebo rušijícím zvukové výstupy.
Práce s Low-Level Audio – přehrávání zvuku pomocí třídy zápisem přímo do vyrovnávací paměti. Záznam zvuku pomocí
AudioRecordtřídy a přímé čtení z vyrovnávací paměti.
Požadavky
Tato příručka vyžaduje Android 2.0 (úroveň rozhraní API 5) nebo vyšší. Upozorňujeme, že ladění zvuku v Androidu se musí provést na zařízení.
Je potřeba požádat o RECORD_AUDIO oprávnění v RECORD_AUDIO

Přehrávání zvuku pomocí třídy MediaPlayer
Nejjednodušším způsobem, jak přehrát zvuk v Androidu, je integrovaná třída MediaPlayer.
MediaPlayer může přehrát místní nebo vzdálené soubory předáním cesty k souboru. Je však velmi citlivá na stav a volání jedné z jejích metod v nesprávném stavu způsobí vyvolání MediaPlayer výjimky. Pokud se chcete vyhnout chybám, je důležité s aplikací pracovat v MediaPlayer pořadí popsaném níže.
Inicializace a přehrávání
Přehrávání zvuku pomocí MediaPlayer vyžaduje následující sekvenci:
Vytvořte instanci nového objektu MediaPlayer.
Nakonfigurujte soubor tak, aby se přehrál prostřednictvím metody SetDataSource.
Volejte metodu Prepare pro inicializaci přehrávače.
Voláním metody Start spusťte přehrávání zvuku.
Následující ukázka kódu ilustruje toto použití:
protected MediaPlayer player;
public void StartPlayer(String filePath)
{
if (player == null) {
player = new MediaPlayer();
} else {
player.Reset();
player.SetDataSource(filePath);
player.Prepare();
player.Start();
}
}
Pozastavení a obnovení přehrávání
Přehrávání je možné pozastavit voláním metody Pause:
player.Pause();
Pokud chcete obnovit pozastavené přehrávání, zavolejte metodu Start. Tím se obnoví pozastavení z pozastaveného umístění v přehrávání:
player.Start();
Volání metody Stop v přehrávači ukončí průběžné přehrávání:
player.Stop();
Pokud už přehrávač nepotřebujete, musí být prostředky uvolněny voláním metody Release:
player.Release();
Použití třídy MediaRecorder k záznamu zvuku
Corollary to for MediaPlayer recording audio in Android is the MediaPlayer class. Podobně jako v případě , je i třída citlivá na stav a prochází několika stavy, aby se dostal do bodu, kdy může MediaPlayer zahájit nahrávání. Aby bylo možné zaznamenávat zvuk, RECORD_AUDIO musí být oprávnění nastaveno. Pokyny k nastavení oprávnění aplikace najdete v tématu Práce s AndroidManifest.xml.
Inicializace a nahrávání
Záznam zvuku pomocí MediaRecorder vyžaduje následující kroky:
Vytvořte instanci nového objektu MediaRecorder.
Určete, které hardwarové zařízení se má použít k zachycení zvukového vstupu prostřednictvím metody SetAudioSource.
Nastavte formát zvuku výstupního souboru pomocí metody SetOutputFormat. Seznam podporovaných typů zvuku najdete v tématu Podporované formáty médií pro Android.
Voláním metody SetAudioEncoder nastavte typ kódování zvuku.
Voláním metody SetOutputFile zadejte název výstupního souboru, do které se zapisou zvuková data.
Volejte metodu Prepare pro inicializaci záznamníku.
Pokud chcete zahájit nahrávání, zavolejte metodu Start.
Tuto sekvenci znázorňuje následující ukázka kódu:
protected MediaRecorder recorder;
void RecordAudio (String filePath)
{
try {
if (File.Exists (filePath)) {
File.Delete (filePath);
}
if (recorder == null) {
recorder = new MediaRecorder (); // Initial state.
} else {
recorder.Reset ();
recorder.SetAudioSource (AudioSource.Mic);
recorder.SetOutputFormat (OutputFormat.ThreeGpp);
recorder.SetAudioEncoder (AudioEncoder.AmrNb);
// Initialized state.
recorder.SetOutputFile (filePath);
// DataSourceConfigured state.
recorder.Prepare (); // Prepared state
recorder.Start (); // Recording state.
}
} catch (Exception ex) {
Console.Out.WriteLine( ex.StackTrace);
}
}
Zastavení nahrávání
Pokud chcete záznam zastavit, Stop zavolejte metodu na MediaRecorder :
recorder.Stop();
Vyčištění
Po MediaRecorder zastavení volejte metodu MediaRecorder která ji vrátí do stavu nečinnosti:
recorder.Reset();
Pokud MediaRecorder už není potřeba, musí být jeho prostředky uvolněny voláním MediaRecorder
recorder.Release();
Správa zvukových oznámení
Třída AudioManager
Třída AudioManager poskytuje přístup ke zvukovým oznámením, která aplikacím upozorní, když dojde k zvukovým událostem. Tato služba také poskytuje přístup k dalším zvukovým funkcím, jako je řízení hlasitosti a režimu zvonku. Umožňuje AudioManager aplikaci zpracovávat zvuková oznámení pro řízení přehrávání zvuku.
Správa zvukového fokusu
Zvukové prostředky zařízení (integrovaný přehrávač a záznamník) sdílí všechny spuštěné aplikace.
Koncepčně se to podobá aplikacím na stolním počítači, kde fokus klávesnice má jenom jedna aplikace: po výběru jedné ze spuštěných aplikací kliknutím myší se vstup z klávesnice dostane jenom do této aplikace.
Podobným nápadem je i fokus zvuku, který brání tomu, aby najednou přehrává nebo nahrává zvuk více než jedna aplikace. Je složitější než fokus na klávesnici, protože je dobrovolný – aplikace může ignorovat skutečnost, že aktuálně nemá fokus na zvuk a nehraje bez ohledu na to – a protože existují různé typy zvukového fokusu, o které je možné požádat. Pokud se například od uživatele očekává, že bude přehrávat zvuk jen velmi krátce, může požádat o přechodný fokus.
Zvukový fokus se může udělit okamžitě nebo zpočátku odepřen a udělit později. Pokud například aplikace požaduje během telefonního hovoru zvukový fokus, bude zamítnut, ale po dokončení telefonního hovoru se může fokus udělit. V takovém případě je naslouchací proces zaregistrovaný, aby mohl odpovídajícím způsobem reagovat, pokud se fokus zvuku odebral. Vyžádání zvukového fokusu slouží k určení, jestli je nebo není v pořádku přehrát nebo nahrát zvuk.
Další informace o fokusu zvuku najdete v tématu Správa zvukového fokusu.
Registrace zpětného volání pro fokus zvuku
Registrace FocusChangeListener zpětného volání z je IOnAudioChangeListener důležitou součástí získání a vydání zvukového fokusu. Je to proto, že udělení zvukového fokusu může být odloženo až později. Aplikace může například požádat o přehrání hudby, zatímco probíhá telefonní hovor. Zvukový fokus nebude udělen, dokud se telefonní hovor nedokončí.
Z tohoto důvodu je objekt zpětného volání předán jako parametr do metody a zpětné volání je zaregistrováno tímto GetAudioFocusAudioManager voláním. Pokud je fokus zvuku zpočátku odepřen, ale později udělen, je aplikace informována vyvoláním OnAudioFocusChange zpětného volání. Stejná metoda se používá k tomu, aby aplikaci řekli, že se odebrala zvuková fokus.
Po dokončení aplikace pomocí zvukových prostředků volá metodu AbandonFocusAudioManager a znovu předá zpětné volání. Tím se zruší registrace zpětného volání a uvolní se zvukové prostředky, aby ostatní aplikace získaly zvukový fokus.
Vyžádání zvukového fokusu
Kroky potřebné k vyžádání zvukových prostředků zařízení jsou následující:
Získejte popisovač systémové
AudioManagerslužby.Vytvořte instanci třídy zpětného volání.
Vyžádejte si zvukové prostředky zařízení voláním
RequestAudioFocusmetody naAudioManager. Parametry jsou objekt zpětného volání, typ streamu (hudba, hlasový hovor, okruh atd.). a typ požadovaného přístupového práva (zvukové prostředky je možné vyžádat za chvíli nebo třeba po neurčitou dobu).Pokud je požadavek udělen, metoda se vyvolá okamžitě a
playMusiczvuk se začne přehrávat.Pokud je žádost zamítnuta, žádná další akce nebude přijata. V takovém případě se zvuk přehraje jenom v případě, že se žádost udělí později.
Následující ukázka kódu ukazuje tyto kroky:
Boolean RequestAudioResources(INotificationReceiver parent)
{
AudioManager audioMan = (AudioManager) GetSystemService(Context.AudioService);
AudioManager.IOnAudioFocusChangeListener listener = new MyAudioListener(this);
var ret = audioMan.RequestAudioFocus (listener, Stream.Music, AudioFocus.Gain );
if (ret == AudioFocusRequest.Granted) {
playMusic();
return (true);
} else if (ret == AudioFocusRequest.Failed) {
return (false);
}
return (false);
}
Vydání zvukového fokusu
Po dokončení přehrávání stopy je AbandonFocus vyvolána metoda na AudioManager . To umožňuje, aby jiná aplikace získala zvukové prostředky zařízení. Ostatní aplikace obdrží oznámení o změně tohoto zvukového výběru, pokud zaregistrovali vlastní naslouchací procesy.
Zvukové rozhraní API nízké úrovně
Zvuková rozhraní API nízké úrovně poskytují lepší kontrolu nad přehráváním a záznamem zvuku, protože přímo komunikují s vyrovnávacími paměťmi paměti namísto použití identifikátorů URI souborů. Existují některé scénáře, kdy je tento přístup vhodnější. Mezi takové scénáře patří:
Při přehrávání ze zašifrovaných audio souborů.
Při přehrávání pokusů krátkých klipů.
Streamování zvuku.
AudioTrack – třída
Třída AudioTrack používá ke zaznamenávání zvukové rozhraní API nízké úrovně a je ekvivalentem třídy v nižší úrovni .
Inicializace a přehrávání
Chcete-li přehrát zvuk, je nutné vytvořit instanci nové instance AudioTrack . Seznam argumentů předaných do konstruktoru určuje, jak se má přehrát ukázka zvuku obsažená ve vyrovnávací paměti. Argumenty jsou:
Typ datového proudu – hlas, vyzváněcí melodie, hudba, systém nebo alarm.
Frekvence – vzorkovací frekvence vyjádřená v Hz.
Konfigurace kanálu – mono nebo stereo.
Formát zvuku – 8 bitů nebo 16bitové kódování.
Velikost vyrovnávací paměti – v bajtech
Režim vyrovnávací paměti – streamování nebo statický.
Po dokončení konstrukce je vyvolána metoda Play , aby bylo možné ji nastavit tak, aby se mohla začít přehrávat. Zápis zvukové vyrovnávací paměti do AudioTrack spustí přehrávání:
void PlayAudioTrack(byte[] audioBuffer)
{
AudioTrack audioTrack = new AudioTrack(
// Stream type
Stream.Music,
// Frequency
11025,
// Mono or stereo
ChannelOut.Mono,
// Audio encoding
Android.Media.Encoding.Pcm16bit,
// Length of the audio clip.
audioBuffer.Length,
// Mode. Stream or static.
AudioTrackMode.Stream);
audioTrack.Play();
audioTrack.Write(audioBuffer, 0, audioBuffer.Length);
}
Pozastavení a zastavení přehrávání
Zavolejte metodu Pause pro pozastavení přehrávání:
audioTrack.Pause();
Voláním metody stop se trvale ukončí přehrávání:
audioTrack.Stop();
Vyčištění
Pokud AudioTrack už ho nepotřebujete, musí se prostředky uvolnit voláním vydaných AudioTrack:
audioTrack.Release();
Třída AudioRecord
Třída AudioRecord je ekvivalentem na straně záznamu. Například AudioTrack používá vyrovnávací paměti přímo místo souborů a identifikátorů URI. Vyžaduje, aby RECORD_AUDIO bylo nastaveno oprávnění v manifestu.
Inicializace a záznam
Prvním krokem je vytvoření nového objektu AudioRecord . Seznam argumentů předaných do konstruktoru poskytuje všechny informace vyžadované pro záznam. Na rozdíl od AudioTrack , kde jsou argumenty z velké části výčtů, ekvivalentní argumenty v AudioRecord jsou celá čísla. Tady jsou některé z nich:
Zdroj hardwarového vstupu zvukového zvuku, jako je třeba mikrofon.
Typ datového proudu – hlas, vyzváněcí melodie, hudba, systém nebo alarm.
Frekvence – vzorkovací frekvence vyjádřená v Hz.
Konfigurace kanálu – mono nebo stereo.
Formát zvuku – 8 bitů nebo 16bitové kódování.
Velikost vyrovnávací paměti – bajty
Po AudioRecord sestavení je vyvolána jeho metoda AudioRecord . Teď je připravené začít nahrávat. AudioRecordNepřetržitě přečte zvukovou vyrovnávací paměť pro vstup a zapíše tento vstup do zvukového souboru.
void RecordAudio()
{
byte[] audioBuffer = new byte[100000];
var audRecorder = new AudioRecord(
// Hardware source of recording.
AudioSource.Mic,
// Frequency
11025,
// Mono or stereo
ChannelIn.Mono,
// Audio encoding
Android.Media.Encoding.Pcm16bit,
// Length of the audio clip.
audioBuffer.Length
);
audRecorder.StartRecording();
while (true) {
try
{
// Keep reading the buffer while there is audio input.
audRecorder.Read(audioBuffer, 0, audioBuffer.Length);
// Write out the audio file.
} catch (Exception ex) {
Console.Out.WriteLine(ex.Message);
break;
}
}
}
Zastavování záznamu
Volání metody stop ukončí záznam:
audRecorder.Stop();
Vyčištění
Pokud AudioRecord objekt již není potřeba, voláním metody AudioRecord uvolní všechny prostředky, které jsou k němu přidruženy:
audRecorder.Release();
Souhrn
Operační systém Android nabízí výkonnou architekturu pro přehrávání, zaznamenávání a správu zvuku. Tento článek pojednává o tom, jak přehrát a nahrávat zvuk pomocí vysoké úrovně MediaPlayer a MediaRecorder tříd. V dalším kroku se prozkoumalo, jak používat Zvuková oznámení ke sdílení zvukových prostředků zařízení mezi různými aplikacemi. Nakonec se zabývá tím, jak přehrávat a nahrávat zvuk pomocí rozhraní API nízké úrovně, které rozhraní přímo ukládá do vyrovnávací paměti.