Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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é
MediaPlayertřídy k přehrávání zvuku, včetně místních zvukových souborů a streamovaných zvukových souborů sAudioTracktřídou.Záznam zvuku – použití integrované
MediaRecordertří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
AudioTrackpomocí třídy zápisem přímo do vyrovnávací paměti. Nahrávání zvukuAudioRecordpomocí 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. MediaPlayerPodobně 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 StopMediaRecorderna :
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 AudioManagera 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č
AudioManagersystémové služby.Vytvořte instanci třídy zpětného volání.
Požádejte zvukové prostředky zařízení voláním
RequestAudioFocusmetody 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,
playMusicmetoda 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 AudioTrackpouží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. AudioTrackNa 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.