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.
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 gut verhaltenen Anwendungen, die ordnungsgemäß auf Ereignisse reagieren (z. B. eingehende Telefonanrufe), indem ihre Audioausgaben angehalten oder abgebrochen werden.
Arbeiten mit Low-Level Audio : Audiowiedergabe mithilfe der
AudioTrack
-Klasse durch direktes Schreiben in Speicherpuffer. Aufzeichnen von Audio mithilfe derAudioRecord
-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:
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:
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 Player zu initialisieren.
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 MediaPlayer
zustandsabhä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:
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 Unterstützte Android-Medienformate.
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 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 AudioManager
auf 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:
Rufen Sie ein Handle für den
AudioManager
Systemdienst ab.Erstellen Sie eine instance der Rückrufklasse.
Fordern Sie die Audioressourcen des Geräts an, indem Sie die
RequestAudioFocus
-Methode für aufrufenAudioManager
. 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).Wenn die Anforderung gewährt wird, wird die
playMusic
-Methode sofort aufgerufen, und die Audiowiedergabe beginnt.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:
Bei der Wiedergabe von verschlüsselten Audiodateien.
Bei der Wiedergabe einer Reihe von kurzen Clips.
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:
Streamtyp: Stimme, Klingelton, Musik, System oder Alarm.
Häufigkeit: Die In Hz ausgedrückte Samplingrate.
Kanalkonfiguration – Mono oder Stereo.
Audioformat – 8-Bit- oder 16-Bit-Codierung.
Puffergröße – in Bytes.
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 AudioTrack
verwendet 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:
Hardware-Audioeingabequelle wie Mikrofon.
Streamtyp: Stimme, Klingelton, Musik, System oder Alarm.
Häufigkeit: Die In Hz ausgedrückte Samplingrate.
Kanalkonfiguration – Mono oder Stereo.
Audioformat – 8-Bit- oder 16-Bit-Codierung.
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.