Android Audio
Operační systém Android poskytuje rozsáhlou podporu multimédií, včetně zvuku i videa. Tato příručka se zaměřuje na zvuk v Androidu a zabývá se přehráváním a nahráváním zvuku pomocí integrovaných tříd zvuku a záznamu, stejně jako rozhraní API pro zvuk nízké úrovně. Zabývá se také prací se zvukovými událostmi vysílanými jinými aplikacemi, aby vývojáři mohli vytvářet dobře se chovné aplikace.
Přehled
Moderní mobilní zařízení přijala funkce, které dříve vyžadovaly vyhrazené součásti vybavení – kamery, 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 zkoumá práci se zvukem v Androidu a zabývá se následujícími tématy.
Přehrávání zvuku pomocí MediaPlayeru – Použití integrované
MediaPlayer
třídy k přehrávání zvuku, včetně místních zvukových souborů a streamovaných zvukových souborů sAudioTrack
třídou.Záznam zvuku – použití integrované
MediaRecorder
třídy k záznamu zvuku.Práce se zvukovými oznámeními – Použití zvukových oznámení k vytvoření dobře chovaných aplikací, které správně reagují na události (například příchozí telefonní hovory) pozastavením nebo zrušením jejich zvukových výstupů.
Práce se zvukem nízké úrovně – přehrávání zvuku
AudioTrack
pomocí třídy zápisem přímo do vyrovnávací paměti. Nahrávání zvukuAudioRecord
pomocí třídy a čtení přímo 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 musí být provedeno na zařízení.
Je nutné požádat o RECORD_AUDIO
oprávnění v AndroidManifest.XML:
Přehrávání zvuku pomocí třídy MediaPlayer
Nejjednodušší způsob přehrávání zvuku v Androidu je s integrovanou třídou MediaPlayer .
MediaPlayer
může přehrávat místní nebo vzdálené soubory předáním cesty k souboru. Je ale MediaPlayer
velmi citlivá na stav a volání jedné z jejích metod v nesprávném stavu způsobí vyvolání výjimky. Abyste se vyhnuli chybám, je důležité s nimi pracovat MediaPlayer
v uvedeném pořadí.
Inicializace a přehrávání
Přehrávání zvuku vyžaduje MediaPlayer
následující sekvenci:
Vytvořte instanci nového objektu MediaPlayer .
Nakonfigurujte soubor, který se má přehrát pomocí metody SetDataSource .
Zavolejte metodu Prepare pro inicializaci hráč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í lze pozastavit voláním metody Pause :
player.Pause();
Pokud chcete obnovit pozastavené přehrávání, zavolejte metodu Start . Tím se obnoví z pozastaveného umístění při přehrávání:
player.Start();
Volání metody Stop na přehrávači ukončí probíhající 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 pro MediaPlayer
záznam zvuku v Androidu je MediaRecorder třída. MediaPlayer
Podobně jako v případě , že je citlivá na stav a přechody přes několik stavů, aby se dostaly do bodu, kde může začít zaznamenávat. Aby bylo možné nahrát zvuk, musí být nastaveno RECORD_AUDIO
oprávnění. Pokyny k nastavení oprávnění aplikace najdete v tématu Práce s AndroidManifest.xml.
Inicializace a nahrávání
Záznam zvuku MediaRecorder
pomocí následujících kroků:
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 naleznete v tématu Podporované formáty médií androidu.
Volání SetAudioEncoder metoda nastavit typ kódování zvuku.
Volání SetOutputFile metoda určit název výstupního souboru, do kterého se zapisují zvuková data.
Zavolejte metodu Prepare pro inicializaci záznamu.
Voláním metody Start zahájíte nahrávání.
Následující ukázka kódu znázorňuje tuto sekvenci:
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, zavolejte metodu Stop
MediaRecorder
na :
recorder.Stop();
Vyčištění
MediaRecorder
Po zastavení volejte metodu Reset, která ji vrátí do stavu nečinnosti:
recorder.Reset();
MediaRecorder
Pokud už není potřeba, musí být jeho prostředky uvolněny voláním metody Release:
recorder.Release();
Správa zvukových oznámení
Třída AudioManager
Třída AudioManager poskytuje přístup k zvukovým oznámením, která aplikacím dají vědět, kdy dojde k zvukovým událostem. Tato služba také poskytuje přístup k dalším zvukovým funkcím, jako je ovládání režimu hlasitosti a vyzvánění. Umožňuje AudioManager
aplikaci zpracovávat zvuková oznámení pro ovládání přehrávání zvuku.
Správa zvukového fokusu
Zvukové prostředky zařízení (integrovaný přehrávač a záznam) jsou sdíleny všemi spuštěnými aplikacemi.
Koncepčně se to podobá aplikacím na stolním počítači, kde je fokus klávesnice jenom jedna aplikace: po výběru jedné ze spuštěných aplikací po kliknutí myší přejde vstup klávesnice jenom do této aplikace.
Fokus zvuku je podobný nápad a zabraňuje více aplikacím v přehrávání nebo nahrávání zvuku najednou. Je to složitější než fokus klávesnice, protože je dobrovolné – aplikace může ignorovat skutečnost, že aktuálně nemá fokus zvuku a přehrát bez ohledu na to – a protože existují různé typy zvukového fokusu, který lze požadovat. Pokud se například žadatel očekává, že po velmi krátkou dobu přehraje zvuk, může požádat o přechodný fokus.
Fokus zvuku může být udělen okamžitě nebo původně zamítnut a udělen později. Pokud aplikace například během telefonního hovoru požádá o hlasový fokus, bude odepřen, ale fokus může být po dokončení telefonního hovoru dobře udělen. V tomto případě je naslouchací proces zaregistrován, aby odpovídajícím způsobem reagoval, pokud je fokus zvuku odebrán. Vyžádání zvukového fokusu se používá k určení, jestli je v pořádku přehrávat nebo nahrávat zvuk.
Další informace o zvukovém fokusu najdete v tématu Správa zvukového fokusu.
Registrace zpětného volání pro fokus zvuku
Registrace zpětného FocusChangeListener
volání z centra IOnAudioChangeListener
je důležitou součástí získání a uvolnění zvukového fokusu. Důvodem je, že udělení zvukového fokusu může být odloženo až do pozdějšího času. Aplikace může například požádat o přehrávání hudby, když probíhá telefonní hovor. Fokus zvuku se neudělí, dokud se telefonní hovor nedokončí.
Z tohoto důvodu se objekt zpětného volání předává jako parametr do GetAudioFocus
metody objektu AudioManager
, a to je toto volání, které registruje zpětné volání. Pokud je fokus zvuku původně odepřen, ale později udělen, aplikace je informována vyvoláním OnAudioFocusChange
zpětného volání. Stejná metoda se používá k tomu, aby aplikace řekla, že je fokus zvuku pryč.
Jakmile aplikace dokončí používání zvukových prostředků, zavolá AbandonFocus
metodu AudioManager
a znovu předá zpětné volání. Tím se zruší zpětná volání a uvolní zvukové prostředky, aby ostatní aplikace mohly získat fokus zvuku.
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č
AudioManager
systémové služby.Vytvořte instanci třídy zpětného volání.
Požádejte zvukové prostředky zařízení voláním
RequestAudioFocus
metody na zařízeníAudioManager
. Parametry jsou objekt zpětného volání, typ datového proudu (hudba, hlasový hovor, vyzvánění atd.) a typ požadovaného přístupového práva (zvukové prostředky můžou být požadovány krátkodobě nebo po neomezenou dobu, například).Pokud je žádost udělena,
playMusic
metoda se vyvolá okamžitě a zvuk se začne přehrávat zpět.Pokud je žádost zamítnuta, nebude provedena žádná další akce. V takovém případě se zvuk přehraje jenom v případě, že je žádost udělena 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);
}
Uvolnění zvukového fokusu
Po dokončení AbandonFocus
přehrávání skladby je vyvolána metoda zapnuta AudioManager
. To umožňuje jiné aplikaci získat zvukové prostředky zařízení. Ostatní aplikace obdrží oznámení o této změně zvukového fokusu, pokud si zaregistrovali vlastní naslouchací procesy.
Rozhraní API pro zvuk nízké úrovně
Rozhraní API pro zvuk na nízké úrovni poskytují větší kontrolu nad přehráváním a nahráváním zvuku, protože místo použití identifikátorů URI souborů komunikují přímo s paměťovými vyrovnávacími paměťmi. Existuje několik scénářů, kdy je tento přístup vhodnější. Mezi takové scénáře patří:
Při přehrávání ze šifrovaných zvukových souborů.
Při přehrávání posloupnosti krátkých klipů.
Streamování zvuku
AudioTrack – třída
Třída AudioTrack používá pro záznam rozhraní API pro zvuk nízké úrovně a je ekvivalentem MediaPlayer
třídy nízké úrovně.
Inicializace a přehrávání
Aby bylo možné přehrát zvuk, musí být vytvořena nová instance AudioTrack
instance. Seznam argumentů předaný do konstruktoru určuje, jak přehrát zvukový vzorek obsažený ve vyrovnávací paměti. Argumenty jsou:
Typ streamu – hlas, vyzváněcí tón, hudba, systém nebo alarm.
Frekvence – vzorkovací frekvence vyjádřená v Hz.
Konfigurace kanálu – Mono nebo stereo.
Formát zvuku – 8bitové nebo 16bitové kódování.
Velikost vyrovnávací paměti – v bajtech.
Režim vyrovnávací paměti – streamování nebo statické.
Po konstrukci se vyvolá metoda AudioTrack
Play, která ji nastaví tak, aby začala hrát. Zápis zvukové vyrovnávací paměti do AudioTrack
spuštění 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í
Voláním metody Pause pozastavte přehrávání:
audioTrack.Pause();
Při volání metody Stop se přehrávání trvale ukončí:
audioTrack.Stop();
Vyčištění
AudioTrack
Pokud už není potřeba, musí být jeho prostředky uvolněny voláním verze:
audioTrack.Release();
Třída AudioRecord
AudioRecord třída je ekvivalentem AudioTrack
na straně záznamu. Podobně jako AudioTrack
používá vyrovnávací paměti přímo místo souborů a identifikátorů URI. Vyžaduje, aby RECORD_AUDIO
oprávnění bylo nastaveno v manifestu.
Inicializace a nahrávání
Prvním krokem je vytvoření nového objektu AudioRecord . Seznam argumentů předaný do konstruktoru poskytuje všechny informace potřebné pro záznam. AudioTrack
Na rozdíl od , kde argumenty jsou z velké části výčty, ekvivalentní argumenty v AudioRecord
jsou celá čísla. Tady jsou některé z nich:
Hardwarový zdroj vstupu zvuku, jako je mikrofon.
Typ streamu – hlas, vyzváněcí tón, hudba, systém nebo alarm.
Frekvence – vzorkovací frekvence vyjádřená v Hz.
Konfigurace kanálu – Mono nebo stereo.
Formát zvuku – 8bitové nebo 16bitové kódování.
Bajty velikosti vyrovnávací paměti
Jakmile je vytvořen AudioRecord
, jeho StartRecording metoda je vyvolána. Teď je připravený začít s nahráváním. AudioRecord
Nepřetržitě čte vyrovnávací paměť zvuku 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;
}
}
}
Zastavení záznamu
Volání metody Stop ukončí záznam:
audRecorder.Stop();
Vyčištění
AudioRecord
Pokud už objekt nepotřebujete, voláním metody release uvolníte všechny prostředky přidružené k němu:
audRecorder.Release();
Shrnutí
Operační systém Android poskytuje výkonnou architekturu pro přehrávání, nahrávání a správu zvuku. Tento článek popisuje, jak přehrávat a nahrávat zvuk pomocí vysoké úrovně MediaPlayer
a MediaRecorder
tříd. Dále prozkoumal, jak používat zvuková oznámení ke sdílení zvukových prostředků zařízení mezi různými aplikacemi. Nakonec se zabývá přehráváním a nahráváním zvuku pomocí rozhraní API nízké úrovně, které rozhraní přímo s vyrovnávacími paměťmi.