Android-Audio

Das Android-Betriebssystem bietet umfassende Unterstützung für Multimedia, die sowohl Audio als auch Video umfasst. Dieser Leitfaden konzentriert sich auf Audio unter Android und behandelt die Wiedergabe und Aufzeichnung von Audio mithilfe der integrierten Audioplayer- und Recorderklassen sowie der Low-Level-Audio-API. Außerdem wird die Arbeit mit Audioereignissen behandelt, die von anderen Anwendungen übertragen werden, sodass Entwickler gut verhaltene Anwendungen erstellen können.

Übersicht

Moderne mobile Geräte haben Funktionen übernommen, die früher dedizierte Geräte benötigt hätten – Kameras, Musikplayer und Videorekorder. Aus diesem Hintergrund sind Multimediaframeworks zu einem erstklassigen Feature in mobilen APIs geworden.

Android bietet umfangreiche Unterstützung für Multimedia. In diesem Artikel wird die Arbeit mit Audio in Android untersucht und die folgenden Themen behandelt.

  1. Wiedergeben von Audio mit MediaPlayer : Verwenden der integrierten MediaPlayer Klasse zum Wiedergeben von Audio, einschließlich lokaler Audiodateien und gestreamter Audiodateien mit der AudioTrack Klasse.

  2. Aufzeichnen von Audio – Verwenden der integrierten MediaRecorder Klasse zum Aufzeichnen von Audio.

  3. Arbeiten mit Audiobenachrichtigungen : Verwenden von Audiobenachrichtigungen zum Erstellen von gut verhaltenen Anwendungen, die ordnungsgemäß auf Ereignisse reagieren (z. B. eingehende Telefonanrufe), indem ihre Audioausgaben angehalten oder abgebrochen werden.

  4. Arbeiten mit Low-Level Audio : Audiowiedergabe mithilfe der AudioTrack -Klasse durch direktes Schreiben in Speicherpuffer. Aufzeichnen von Audio mithilfe der AudioRecord -Klasse und Direktes Lesen aus Speicherpuffern.

Anforderungen

Für diese Anleitung ist Android 2.0 (API-Ebene 5) oder höher erforderlich. Beachten Sie, dass das Debuggen von Audiodaten unter Android auf einem Gerät erfolgen muss.

Es ist erforderlich, die RECORD_AUDIO Berechtigungen in AndroidManifest.XMLanzufordern:

Abschnitt

Wiedergeben von Audio mit der MediaPlayer-Klasse

Die einfachste Möglichkeit, Audio in Android wiederzugeben, ist die integrierte MediaPlayer-Klasse . MediaPlayer kann entweder lokale Dateien oder Remotedateien wiedergeben, indem sie den Dateipfad übergeben. Ist jedoch sehr zustandsabhängig, und das Aufrufen einer seiner Methoden im falschen Zustand führt dazu, MediaPlayer dass eine Ausnahme ausgelöst wird. Es ist wichtig, in MediaPlayer der unten beschriebenen Reihenfolge mit zu interagieren, um Fehler zu vermeiden.

Initialisieren und Wiedergeben

Für die Wiedergabe von Audio mit MediaPlayer ist die folgende Sequenz erforderlich:

  1. Instanziieren Sie ein neues MediaPlayer-Objekt .

  2. Konfigurieren Sie die Datei für die Wiedergabe über die SetDataSource-Methode .

  3. Rufen Sie die Prepare-Methode auf, um den Player zu initialisieren.

  4. Rufen Sie die Start-Methode auf, um die Audiowiedergabe zu starten.

Im folgenden Codebeispiel wird diese Verwendung veranschaulicht:

protected MediaPlayer player;
public void StartPlayer(String  filePath)
{
  if (player == null) {
    player = new MediaPlayer();
  } else {
    player.Reset();
    player.SetDataSource(filePath);
    player.Prepare();
    player.Start();
  }
}

Anhalten und Fortsetzen der Wiedergabe

Die Wiedergabe kann durch Aufrufen der Pause-Methode angehalten werden:

player.Pause();

Um die angehaltene Wiedergabe fortzusetzen, rufen Sie die Start-Methode auf. Dies wird von der angehaltenen Position in der Wiedergabe fortgesetzt:

player.Start();

Durch Aufrufen der Stop-Methode auf dem Player wird eine fortlaufende Wiedergabe beendet:

player.Stop();

Wenn der Player nicht mehr benötigt wird, müssen die Ressourcen durch Aufrufen der Release-Methode freigegeben werden:

player.Release();

Verwenden der MediaRecorder-Klasse zum Aufzeichnen von Audio

Die Folge von zum MediaPlayer Aufzeichnen von Audiodaten in Android ist die MediaRecorder-Klasse . Wie der ist es MediaPlayerzustandsabhängig und durchläuft mehrere Zustände, um zu dem Punkt zu gelangen, an dem die Aufzeichnung beginnen kann. Um Audio aufzunehmen, muss die RECORD_AUDIO Berechtigung festgelegt werden. Anweisungen zum Festlegen von Anwendungsberechtigungen finden Sie unter Arbeiten mit AndroidManifest.xml.

Initialisieren und Aufzeichnen

Das Aufzeichnen von Audio mit dem MediaRecorder erfordert die folgenden Schritte:

  1. Instanziieren Sie ein neues MediaRecorder-Objekt .

  2. Geben Sie an, welches Hardwaregerät zum Erfassen der Audioeingabe über die SetAudioSource-Methode verwendet werden soll.

  3. Legen Sie das Audioformat der Ausgabedatei mithilfe der SetOutputFormat-Methode fest. Eine Liste der unterstützten Audiotypen finden Sie unter Unterstützte Android-Medienformate.

  4. Rufen Sie die SetAudioEncoder-Methode auf, um den Audiocodierungstyp festzulegen.

  5. Rufen Sie die SetOutputFile-Methode auf, um den Namen der Ausgabedatei anzugeben, in die die Audiodaten geschrieben werden.

  6. Rufen Sie die Prepare-Methode auf, um den Recorder zu initialisieren.

  7. Rufen Sie die Start-Methode auf, um die Aufzeichnung zu starten.

Im folgenden Codebeispiel wird diese Sequenz veranschaulicht:

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);
  }
}

Beenden der Aufzeichnung

Um die Aufzeichnung zu beenden, rufen Sie die Stop -Methode für auf MediaRecorder:

recorder.Stop();

Bereinigen

Nachdem die MediaRecorder beendet wurde, rufen Sie die Reset-Methode auf, um es wieder in den Leerlaufzustand zu versetzen:

recorder.Reset();

Wenn nicht MediaRecorder mehr benötigt wird, müssen seine Ressourcen durch Aufrufen der Release-Methode freigegeben werden:

recorder.Release();

Verwalten von Audiobenachrichtigungen

Die AudioManager-Klasse

Die AudioManager-Klasse bietet Zugriff auf Audiobenachrichtigungen, die Anwendungen darüber informieren, wann Audioereignisse auftreten. Dieser Dienst bietet auch Zugriff auf andere Audiofeatures, z. B. die Steuerung des Lautstärke- und Klingelmodus. Ermöglicht AudioManager es einer Anwendung, Audiobenachrichtigungen zu verarbeiten, um die Audiowiedergabe zu steuern.

Verwalten des Audiofokus

Die Audioressourcen des Geräts (der integrierte Player und der Recorder) werden von allen ausgeführten Anwendungen gemeinsam genutzt.

Konzeptionell ähnelt dies Anwendungen auf einem Desktopcomputer, bei denen nur eine Anwendung den Tastaturfokus hat: Nachdem Sie eine der ausgeführten Anwendungen ausgewählt haben, indem Sie darauf klicken, wird die Tastatureingabe nur an diese Anwendung übergeben.

Audiofokus ist eine ähnliche Idee und verhindert, dass mehrere Anwendungen gleichzeitig Audio wiedergeben oder aufzeichnen können. Es ist komplizierter als der Tastaturfokus, da er freiwillig ist – die Anwendung kann diese Tatsache ignorieren, dass sie derzeit nicht über Audiofokus und Wiedergabe verfügt , unabhängig davon, weil es verschiedene Arten von Audiofokus gibt, die angefordert werden können. Wenn beispielsweise erwartet wird, dass der Anforderer nur sehr kurze Zeit Audio wiedergibt, kann er den vorübergehenden Fokus anfordern.

Der Audiofokus kann sofort oder zunächst verweigert und später gewährt werden. Wenn eine Anwendung beispielsweise den Audiofokus während eines Telefonanrufs anfordert, wird dieser verweigert, aber der Fokus kann nach Abschluss des Telefonanrufs gewährt werden. In diesem Fall wird ein Listener registriert, um entsprechend zu reagieren, wenn der Audiofokus entfernt wird. Das Anfordern des Audiofokus wird verwendet, um zu bestimmen, ob die Wiedergabe oder Aufzeichnung von Audio in Ordnung ist.

Weitere Informationen zum Audiofokus finden Sie unter Verwalten des Audiofokus.

Registrieren des Rückrufs für den Audiofokus

Das Registrieren des FocusChangeListener Rückrufs von IOnAudioChangeListener ist ein wichtiger Teil des Abrufens und Freigebens des Audiofokus. Dies liegt daran, dass die Gewährung des Audiofokus bis zu einem späteren Zeitpunkt verzögert werden kann. Beispielsweise kann eine Anwendung die Wiedergabe von Musik anfordern, während ein Telefonanruf ausgeführt wird. Der Audiofokus wird erst gewährt, wenn der Telefonanruf abgeschlossen ist.

Aus diesem Grund wird das Rückrufobjekt als Parameter an die GetAudioFocus -Methode von AudioManagerübergeben, und es ist dieser Aufruf, der den Rückruf registriert. Wenn der Audiofokus zunächst verweigert, aber später gewährt wird, wird die Anwendung durch Aufrufen OnAudioFocusChange des Rückrufs informiert. Die gleiche Methode wird verwendet, um der Anwendung mitzuteilen, dass der Audiofokus entfernt wird.

Wenn die Anwendung die Verwendung der Audioressourcen abgeschlossen hat, ruft sie die AbandonFocus -Methode von AudioManagerauf und übergibt den Rückruf erneut. Dadurch wird die Registrierung des Rückrufs aufgehoben und die Audioressourcen freigegeben, sodass andere Anwendungen den Audiofokus erhalten können.

Anfordern des Audiofokus

Zum Anfordern der Audioressourcen des Geräts sind die folgenden Schritte erforderlich:

  1. Rufen Sie ein Handle für den AudioManager Systemdienst ab.

  2. Erstellen Sie eine instance der Rückrufklasse.

  3. Fordern Sie die Audioressourcen des Geräts an, indem Sie die RequestAudioFocus -Methode für aufrufen AudioManager . Die Parameter sind das Rückrufobjekt, der Streamtyp (Musik, Sprachanruf, Klingeln usw.) und der Typ des angeforderten Zugriffsrechts (die Audioressourcen können z. B. vorübergehend oder auf unbestimmte Zeit angefordert werden).

  4. Wenn die Anforderung gewährt wird, wird die playMusic -Methode sofort aufgerufen, und die Audiowiedergabe beginnt.

  5. Wenn die Anforderung abgelehnt wird, wird keine weitere Aktion ausgeführt. In diesem Fall wird das Audio nur wiedergegeben, wenn die Anforderung zu einem späteren Zeitpunkt erteilt wird.

Das folgende Codebeispiel zeigt die folgenden Schritte:

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);
}

Freigeben des Audiofokus

Wenn die Wiedergabe des Titels abgeschlossen ist, wird die AbandonFocus -Methode für AudioManager aufgerufen. Dadurch kann eine andere Anwendung die Audioressourcen des Geräts gewinnen. Andere Anwendungen erhalten eine Benachrichtigung über diese Änderung des Audiofokus, wenn sie ihre eigenen Listener registriert haben.

Audio-API auf niedriger Ebene

Die Low-Level-Audio-APIs bieten eine bessere Kontrolle über die Audiowiedergabe und -aufzeichnung, da sie direkt mit Speicherpuffern interagieren, anstatt Datei-URIs zu verwenden. Es gibt einige Szenarien, in denen dieser Ansatz vorzuziehen ist. Zu diesen Szenarien zählen:

  1. Bei der Wiedergabe von verschlüsselten Audiodateien.

  2. Bei der Wiedergabe einer Reihe von kurzen Clips.

  3. Audiostreaming.

AudioTrack-Klasse

Die AudioTrack-Klasse verwendet die Audio-APIs auf niedriger Ebene für die Aufzeichnung und ist das Low-Level-Äquivalent der MediaPlayer -Klasse.

Initialisieren und Wiedergeben

Zum Wiedergeben von Audio muss eine neue instance von AudioTrack instanziiert werden. Die an den Konstruktor übergebene Argumentliste gibt an, wie das im Puffer enthaltene Audiobeispiel wiedergegeben werden soll. Die Argumente sind:

  1. Streamtyp: Stimme, Klingelton, Musik, System oder Alarm.

  2. Häufigkeit: Die In Hz ausgedrückte Samplingrate.

  3. Kanalkonfiguration – Mono oder Stereo.

  4. Audioformat – 8-Bit- oder 16-Bit-Codierung.

  5. Puffergröße – in Bytes.

  6. Puffermodus – Streaming oder statisch.

Nach der Konstruktion wird die Play-Methode von AudioTrack aufgerufen, um sie so einzurichten, dass sie mit der Wiedergabe beginnt. Das Schreiben des Audiopuffers in den AudioTrack startet die Wiedergabe:

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);
}

Anhalten und Beenden der Wiedergabe

Rufen Sie die Pause-Methode auf, um die Wiedergabe anzuhalten:

audioTrack.Pause();

Durch Aufrufen der Stop-Methode wird die Wiedergabe dauerhaft beendet:

audioTrack.Stop();

Bereinigen

Wenn der AudioTrack nicht mehr benötigt wird, müssen seine Ressourcen freigegeben werden, indem Sie Release aufrufen:

audioTrack.Release();

Die AudioRecord-Klasse

Die AudioRecord-Klasse entspricht auf der Aufzeichnungsseite AudioTrack . Wie AudioTrackverwendet es Speicherpuffer direkt anstelle von Dateien und URIs. Dazu muss die RECORD_AUDIO Berechtigung im Manifest festgelegt werden.

Initialisieren und Aufzeichnen

Der erste Schritt besteht darin, ein neues AudioRecord-Objekt zu erstellen. Die an den Konstruktor übergebene Argumentliste enthält alle informationen, die für die Aufzeichnung erforderlich sind. Anders als in AudioTrack, wo die Argumente größtenteils Enumerationen sind, sind die entsprechenden Argumente in AudioRecord ganze Zahlen. Dazu zählen unter anderem folgende Einstellungen:

  1. Hardware-Audioeingabequelle wie Mikrofon.

  2. Streamtyp: Stimme, Klingelton, Musik, System oder Alarm.

  3. Häufigkeit: Die In Hz ausgedrückte Samplingrate.

  4. Kanalkonfiguration – Mono oder Stereo.

  5. Audioformat – 8-Bit- oder 16-Bit-Codierung.

  6. Puffergröße in Bytes

Sobald die AudioRecord erstellt wurde, wird die StartRecording-Methode aufgerufen. Sie kann jetzt mit der Aufzeichnung beginnen. Der AudioRecord liest kontinuierlich den Audiopuffer für die Eingabe und schreibt diese Eingabe in eine Audiodatei.

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;
    }
  }
}

Beenden der Aufzeichnung

Durch Aufrufen der Stop-Methode wird die Aufzeichnung beendet:

audRecorder.Stop();

Bereinigen

Wenn das Objekt nicht mehr benötigt wird, gibt das AudioRecord Aufrufen der Release-Methode alle ihm zugeordneten Ressourcen frei:

audRecorder.Release();

Zusammenfassung

Das Android-Betriebssystem bietet ein leistungsstarkes Framework zum Wiedergeben, Aufzeichnen und Verwalten von Audio. In diesem Artikel wurde beschrieben, wie Sie Audio mit der Allgemeinen Ebene MediaPlayer und den Klassen wiedergeben und MediaRecorder aufzeichnen. Als Nächstes wurde untersucht, wie Sie Audiobenachrichtigungen verwenden, um die Audioressourcen des Geräts zwischen verschiedenen Anwendungen zu teilen. Schließlich ging es um die Wiedergabe und Aufzeichnung von Audio mit den Low-Level-APIs, die direkt mit Speicherpuffern zusammenarbeiten.