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 in Android und befasst sich mit der Wiedergabe und Aufzeichnung von Audio mithilfe der integrierten Audioplayer- und Recorderklassen sowie der Audio-API mit niedriger Ebene. 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ötigten – Kameras, Musikplayer und Videorekorder. Aus diesem Hintergrund sind Multimediaframeworks zu einem erstklassigen Feature in mobilen APIs geworden.

Android bietet umfassende 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 anwendungen, die ordnungsgemäß auf Ereignisse reagieren (z. B. eingehende Telefonanrufe), indem sie ihre Audioausgabe anhalten oder abbrechen.

  4. Arbeiten mit Audio auf niedriger Ebene – Wiedergeben von Audio mithilfe der AudioTrack Klasse durch direktes Schreiben in Speicherpuffer. Aufzeichnen von Audio mithilfe der AudioRecord Klasse und direktes Lesen aus Speicherpuffern.

Anforderungen

Dieses Handbuch erfordert Android 2.0 (API-Ebene 5) oder höher. Bitte beachten Sie, dass das Debuggen von Audio auf Android auf einem Gerät erfolgen muss.

Es ist erforderlich, die RECORD_AUDIO Berechtigungen in AndroidManifest.XML anzufordern:

Abschnitt

Wiedergeben von Audio mit der MediaPlayer-Klasse

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

Initialisieren und Wiedergeben

MediaPlayer Für die Audiowiedergabe 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 Spieler zu initialisieren.

  4. Rufen Sie die Startmethode auf, um die Audiowiedergabe zu starten.

Das folgende Codebeispiel veranschaulicht diese Verwendung:

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

Rufen Sie die Startmethode auf, um die angehaltene Wiedergabe fortzusetzen. Dies wird von der angehaltenen Position in der Wiedergabe fortgesetzt:

player.Start();

Das Aufrufen der Stop-Methode für den Player beendet eine fortlaufende Wiedergabe:

player.Stop();

Wenn der Spieler 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 Korollary MediaPlayer für die Aufzeichnung von Audio in Android ist die MediaRecorder-Klasse . Wie dies der MediaPlayerZustandsempfindlich ist und über mehrere Zustände wechselt, um an den Punkt zu gelangen, an dem die Aufzeichnung gestartet werden kann. Um Audio aufzuzeichnen, 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 den MediaRecorder folgenden Schritten ist erforderlich:

  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 Android Supported Media Formats.

  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 Startmethode auf, um die Aufzeichnung zu starten.

Das folgende Codebeispiel veranschaulicht diese Sequenz:

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

Rufen Sie Stop die Methode auf MediaRecorder, um die Aufzeichnung zu beenden:

recorder.Stop();

Bereinigung

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

recorder.Reset();

Wenn die MediaRecorder Ressource nicht mehr benötigt wird, müssen ihre 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 Audiofunktionen, z. B. Lautstärke- und Klingelmodussteuerung. Die AudioManager Anwendung ermöglicht es einer Anwendung, Audiobenachrichtigungen zum Steuern der Audiowiedergabe zu verarbeiten.

Verwalten des Audiofokus

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

Konzeptionell ähnelt dies Anwendungen auf einem Desktopcomputer, auf denen nur eine Anwendung den Tastaturfokus hat: Nachdem Sie eine der ausgeführten Anwendungen ausgewählt haben, indem Sie mit der Maus darauf klicken, wechselt die Tastatureingabe nur zu dieser Anwendung.

Der Audiofokus ist ähnlich und verhindert, dass mehrere Anwendungen gleichzeitig Audio wiedergeben oder aufzeichnen. Es ist komplizierter als der Tastaturfokus, da sie freiwillig ist – die Anwendung kann ignorieren, dass sie derzeit keinen Audiofokus hat und unabhängig davon wiedergegeben wird , und weil es verschiedene Arten von Audiofokus gibt, die angefordert werden können. Wenn der Anforderer z. B. nur für einen sehr kurzen Zeitraum Audio wiedergeben soll, kann er vorübergehenden Fokus anfordern.

Der Audiofokus kann sofort gewährt oder später verweigert und gewährt werden. Wenn eine Anwendung z. B. während eines Telefonanrufs den Audiofokus anfordert, wird sie verweigert, der Fokus kann jedoch gut gewährt werden, sobald der Telefonanruf abgeschlossen ist. 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 es ok ist, Audio wiederzugeben oder aufzuzeichnen.

Weitere Informationen zum Audiofokus finden Sie unter Verwalten des Audiofokus.

Registrieren des Rückrufs für den Audiofokus

Das Registrieren des FocusChangeListener Rückrufs aus dem IOnAudioChangeListener Bereich ist ein wichtiger Bestandteil des Abrufens und Freigebens des Audiofokus. Dies liegt daran, dass die Gewährung des Audiofokus bis zu einem späteren Zeitpunkt zurückgestellt 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 des AudioManager, und es ist dieser Aufruf, der den Rückruf registriert. Wenn der Audiofokus anfänglich 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 des AudioManagerAufrufs auf und übergibt erneut den Rückruf. Dadurch wird der Rückruf aufgehoben und die Audioressourcen freigegeben, sodass andere Anwendungen möglicherweise den Audiofokus erhalten.

Anfordern des Audiofokus

Die zum Anfordern der Audioressourcen des Geräts erforderlichen Schritte lauten wie folgt:

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

  2. Erstellen Sie eine Instanz der Rückrufklasse.

  3. Fordern Sie die Audioressourcen des Geräts an, indem Sie die RequestAudioFocus Methode für das Gerät AudioManager aufrufen. Die Parameter sind das Rückrufobjekt, der Datenstromtyp (Musik, Sprachanruf, Klingeln usw.) und der Typ des angeforderten Zugriffsrechts (die Audioressourcen können z. B. für einen unbegrenzten Zeitraum angefordert werden).

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

  5. Wenn die Anforderung verweigert wird, wird keine weitere Aktion ausgeführt. In diesem Fall wird die Audiowiedergabe 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 On-Methode AudioManager aufgerufen. Auf diese Weise kann eine andere Anwendung die Audioressourcen des Geräts erhalten. Andere Anwendungen erhalten eine Benachrichtigung über diese Audiofokusänderung, wenn sie ihre eigenen Listener registriert haben.

Audio-API auf niedriger Ebene

Die Audio-APIs auf niedriger Ebene 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 bevorzugt wird. Zu diesen Szenarien zählen:

  1. Beim Wiedergeben von verschlüsselten Audiodateien.

  2. Beim Wiedergeben einer Folge kurzer Clips.

  3. Audiostreaming.

AudioTrack-Klasse

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

Initialisieren und Wiedergeben

Um Audio wiederzugeben, muss eine neue Instanz AudioTrack instanziiert werden. Die an den Konstruktor übergebene Argumentliste gibt an, wie das im Puffer enthaltene Audiobeispiel wiedergegeben wird. Die Argumente sind:

  1. Streamtyp – Sprache, Klingelton, Musik, System oder Alarm.

  2. Frequenz – Die in Hz ausgedrückte Samplingrate.

  3. Kanalkonfiguration – Mono oder Stereo.

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

  5. Puffergröße – in Byte.

  6. Puffermodus – Streaming oder statisch.

Nach der Konstruktion wird die Play-MethodeAudioTrack aufgerufen, um sie so einzurichten, dass sie mit dem Spielen beginnt. Schreiben des Audiopuffers in den AudioTrack Start der 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 das Aufrufen der Stop-Methode wird die Wiedergabe dauerhaft beendet:

audioTrack.Stop();

Bereinigung

Wenn die AudioTrack Ressource nicht mehr benötigt wird, müssen ihre Ressourcen durch Aufrufen von Release freigegeben werden:

audioTrack.Release();

Die AudioRecord-Klasse

Die AudioRecord-Klasse entspricht auf AudioTrack der Aufzeichnungsseite. Wie AudioTrack, verwendet es Speicherpuffer direkt anstelle von Dateien und URIs. Sie erfordert, dass die RECORD_AUDIO Berechtigung im Manifest festgelegt wird.

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, in dem die Argumente weitgehend Aufzählungen sind, sind die entsprechenden Argumente ganze AudioRecord Zahlen. Dazu gehören:

  1. Hardwareaudioeingabequelle wie Mikrofon.

  2. Streamtyp – Sprache, Klingelton, Musik, System oder Alarm.

  3. Frequenz – Die in Hz ausgedrückte Samplingrate.

  4. Kanalkonfiguration – Mono oder Stereo.

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

  6. Puffergröße in Byte

Nachdem die AudioRecord Methode erstellt wurde, wird die StartRecording-Methode aufgerufen. Es ist jetzt bereit, mit der Aufzeichnung zu beginnen. Der AudioRecord Audiopuffer 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();

Bereinigung

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

audRecorder.Release();

Zusammenfassung

Das Android-Betriebssystem bietet ein leistungsfähiges Framework zum Wiedergeben, Aufzeichnen und Verwalten von Audio. In diesem Artikel wird beschrieben, wie Sie Audio mithilfe der high-level MediaPlayer - und Klassen wiedergeben und MediaRecorder aufzeichnen. Als Nächstes wurde erläutert, wie Sie Audiobenachrichtigungen verwenden, um die Audioressourcen des Geräts zwischen verschiedenen Anwendungen freizugeben. Schließlich ging es um die Wiedergabe und Aufzeichnung von Audio mithilfe der APIs auf niedriger Ebene, die direkt mit Speicherpuffern verbunden sind.