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:
Wiedergeben von Audio mit MediaPlayer – Verwenden der integrierten
MediaPlayer
Klasse zum Wiedergeben von Audio, einschließlich lokaler Audiodateien und gestreamter Audiodateien mit derAudioTrack
Klasse.Aufzeichnen von Audio – Verwenden der integrierten
MediaRecorder
Klasse zum Aufzeichnen von Audio.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.
Arbeiten mit Audio auf niedriger Ebene – Wiedergeben von Audio mithilfe der
AudioTrack
Klasse durch direktes Schreiben in Speicherpuffer. Aufzeichnen von Audio mithilfe derAudioRecord
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:
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:
Instanziieren Sie ein neues MediaPlayer-Objekt .
Konfigurieren Sie die Datei für die Wiedergabe über die SetDataSource-Methode .
Rufen Sie die Prepare-Methode auf, um den Spieler zu initialisieren.
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 MediaPlayer
Zustandsempfindlich 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:
Instanziieren Sie ein neues MediaRecorder-Objekt .
Geben Sie an, welches Hardwaregerät zum Erfassen der Audioeingabe über die SetAudioSource-Methode verwendet werden soll.
Legen Sie das Audioformat der Ausgabedatei mithilfe der SetOutputFormat-Methode fest. Eine Liste der unterstützten Audiotypen finden Sie unter Android Supported Media Formats.
Rufen Sie die SetAudioEncoder-Methode auf, um den Audiocodierungstyp festzulegen.
Rufen Sie die SetOutputFile-Methode auf, um den Namen der Ausgabedatei anzugeben, in die die Audiodaten geschrieben werden.
Rufen Sie die Prepare-Methode auf, um den Recorder zu initialisieren.
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 AudioManager
Aufrufs 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:
Rufen Sie ein Handle für den
AudioManager
Systemdienst ab.Erstellen Sie eine Instanz der Rückrufklasse.
Fordern Sie die Audioressourcen des Geräts an, indem Sie die
RequestAudioFocus
Methode für das GerätAudioManager
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).Wenn die Anforderung gewährt wird, wird die
playMusic
Methode sofort aufgerufen, und die Audiowiedergabe wird gestartet.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:
Beim Wiedergeben von verschlüsselten Audiodateien.
Beim Wiedergeben einer Folge kurzer Clips.
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:
Streamtyp – Sprache, Klingelton, Musik, System oder Alarm.
Frequenz – Die in Hz ausgedrückte Samplingrate.
Kanalkonfiguration – Mono oder Stereo.
Audioformat – 8 Bit- oder 16-Bit-Codierung.
Puffergröße – in Byte.
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:
Hardwareaudioeingabequelle wie Mikrofon.
Streamtyp – Sprache, Klingelton, Musik, System oder Alarm.
Frequenz – Die in Hz ausgedrückte Samplingrate.
Kanalkonfiguration – Mono oder Stereo.
Audioformat – 8 Bit- oder 16-Bit-Codierung.
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.