Sdílet prostřednictvím


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.

  1. 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ů s AudioTrack třídou.

  2. Záznam zvuku – použití integrované MediaRecorder třídy k záznamu zvuku.

  3. 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ů.

  4. 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í zvuku AudioRecord 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:

Oddíl Požadovaná oprávnění v manifestu Androidu s povoleným RECORD_AUDIO

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:

  1. Vytvořte instanci nového objektu MediaPlayer .

  2. Nakonfigurujte soubor, který se má přehrát pomocí metody SetDataSource .

  3. Zavolejte metodu Prepare pro inicializaci hráče.

  4. 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ů:

  1. Vytvořte instanci nového objektu MediaRecorder .

  2. Určete, které hardwarové zařízení se má použít k zachycení zvukového vstupu prostřednictvím metody SetAudioSource .

  3. 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.

  4. Volání SetAudioEncoder metoda nastavit typ kódování zvuku.

  5. Volání SetOutputFile metoda určit název výstupního souboru, do kterého se zapisují zvuková data.

  6. Zavolejte metodu Prepare pro inicializaci záznamu.

  7. 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í:

  1. Získejte popisovač AudioManager systémové služby.

  2. Vytvořte instanci třídy zpětného volání.

  3. 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).

  4. Pokud je žádost udělena, playMusic metoda se vyvolá okamžitě a zvuk se začne přehrávat zpět.

  5. 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ří:

  1. Při přehrávání ze šifrovaných zvukových souborů.

  2. Při přehrávání posloupnosti krátkých klipů.

  3. 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:

  1. Typ streamu – hlas, vyzváněcí tón, hudba, systém nebo alarm.

  2. Frekvence – vzorkovací frekvence vyjádřená v Hz.

  3. Konfigurace kanálu – Mono nebo stereo.

  4. Formát zvuku – 8bitové nebo 16bitové kódování.

  5. Velikost vyrovnávací paměti – v bajtech.

  6. 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:

  1. Hardwarový zdroj vstupu zvuku, jako je mikrofon.

  2. Typ streamu – hlas, vyzváněcí tón, hudba, systém nebo alarm.

  3. Frekvence – vzorkovací frekvence vyjádřená v Hz.

  4. Konfigurace kanálu – Mono nebo stereo.

  5. Formát zvuku – 8bitové nebo 16bitové kódování.

  6. 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.