Audio Processing: Mit der Lautstärke spielen

8

Ich möchte eine Sounddatei aus dem Anwendungs-Bundle lesen, sie kopieren, mit ihrer maximalen Lautstärke spielen (Verstärkungswert oder Spitzenleistung, ich bin mir nicht sicher über den technischen Namen) und sie dann als eine andere Datei schreiben wieder zum Bündel.

Ich habe den Kopier- und Schreibteil gemacht. Die resultierende Datei ist identisch mit der Eingabedatei. Ich verwende AudioFileReadBytes () und AudioFileWriteBytes () - Funktionen von AudioFile-Diensten im AudioToolbox-Framework, um dies zu tun.

Also habe ich die Bytes der Eingabedatei und auch ihr Audiodatenformat (über die Verwendung von AudioFileGetProperty () mit kAudioFilePropertyDataFormat), aber ich kann keine Variable in diesen finden, um mit der maximalen Lautstärke der ursprünglichen Datei zu spielen.

Um meinen Zweck zu verdeutlichen, versuche ich, eine andere Sounddatei zu erzeugen, deren Lautstärkepegel relativ zum Originalpegel erhöht oder verringert ist. Daher ist mir die Lautstärke des Systems, die vom Benutzer oder iOS eingestellt wird, egal .

Ist das mit dem von mir erwähnten Rahmen möglich? Wenn nicht, gibt es alternative Vorschläge?

Danke

bearbeiten: Als ich Sams Antwort zu einigen Audio-Grundlagen durchging, entschied ich mich, die Frage um eine weitere Alternative zu erweitern.

Kann ich AudioQueue-Dienste verwenden, um eine vorhandene Sounddatei (die im Bundle enthalten ist) in eine andere Datei aufzunehmen und während der Aufnahme mit der Lautstärke (mit Hilfe von Framework) zu spielen?

Aktualisierung: Hier ist, wie ich die Eingabedatei lese und die Ausgabe schreibe. Der folgende Code senkt den Lautstärkepegel für "einige" der Amplitudenwerte, jedoch mit viel Rauschen. Interessant ist, wenn ich 0,5 als Amplitudenwert wähle, erhöht sich der Schallpegel, anstatt ihn zu verringern, aber wenn ich 0,1 als Amplitudenwert verwende, wird der Ton gesenkt. In beiden Fällen treten störende Geräusche auf. Ich denke, deshalb spricht Art über Normalisierung, aber ich habe keine Ahnung von Normalisierung.

%Vor%     
cocoatoucher 20.10.2010, 22:04
quelle

4 Antworten

13

Sie finden keine Amplitudenskalierung in (Ext) AudioFile, da es sich um die einfachste DSP handelt, die Sie ausführen können.

Nehmen wir an, Sie verwenden ExtAudioFile, um das, was Sie lesen, in 32-Bit-Floats zu konvertieren. Um die Amplitude zu ändern, multiplizieren Sie einfach:

%Vor%

Um die Verstärkung zu erhöhen, verwenden Sie einfach eine Skala & gt; 1.f. Zum Beispiel würde eine AmpScale von 2.f + 6dB Verstärkung bringen.

Wenn Sie normalisieren möchten, müssen Sie zwei Übergänge über das Audio machen: Eines, um das Sample mit der größten Amplitude zu bestimmen. Dann eine andere, um Ihren berechneten Gewinn tatsächlich anzuwenden.

Die Verwendung von AudioQueue-Diensten, nur um Zugriff auf die Volume-Eigenschaft zu erhalten, ist ein ernsthafter, ernster Overkill.

UPDATE:

In Ihrem aktualisierten Code multiplizieren Sie jedes Byte mit 0,5 anstelle jedes Beispiels. Hier ist eine schnelle und dreckige Lösung für Ihren Code, aber sehen Sie sich meine Notizen unten an . Ich würde nicht tun, was du tust.

%Vor%

Natürlich ist dies nicht der beste Weg, um Dinge zu tun: Es geht davon aus, dass Ihre Datei 16-Bit-PCM mit Little-Endian-Zeichen ist. (Die meisten WAV-Dateien sind, aber nicht AIFF, m4a, mp3 usw.) Ich würde die ExtAudioFile-API anstelle der AudioFile-API verwenden, da dies jedes Format, das Sie lesen, in das Format konvertiert, mit dem Sie im Code arbeiten möchten. Normalerweise ist es am einfachsten, Ihre Samples als 32-Bit-Float zu lesen. Hier ist ein Beispiel für Ihren Code, der ExtAudioAPI verwendet, um jedes Eingabedateiformat zu verarbeiten, einschließlich Stereo v. Mono

%Vor%     
Art Gillespie 20.10.2010, 23:10
quelle
1

Ich denke, Sie sollten es vermeiden, mit nicht signierten 8-Bit-Zeichen für Audio zu arbeiten, wenn Sie können. Versuchen Sie, die Daten als 16 Bit oder 32 Bit zu erhalten, das würde einige Probleme mit Rauschen / schlechter Qualität vermeiden.

    
jv42 21.10.2010 14:14
quelle
0

Für die gebräuchlichsten Audiodateiformate gibt es keine einzige Hauptlautstärkenvariable. Stattdessen müssen Sie die PCM-Sound-Samples nehmen (oder konvertieren) und mindestens eine minimale digitale Signalverarbeitung (Multiplizieren, Sättigen / Begrenzen / AGC, Quantisierungs-Noise-Shaping usw.) für jede Probe durchführen.

    
hotpaw2 20.10.2010 22:17
quelle
0

Wenn die Audiodatei normalisiert ist, können Sie nichts tun, um die Datei lauter zu machen. Abgesehen von schlecht kodiertem Audio ist die Lautstärke fast ausschließlich der Bereich der Wiedergabe-Engine.

Ссылка

Richtig gespeicherte Audiodateien haben eine maximale Lautstärke bei oder in der Nähe des für die Bittiefe der Datei verfügbaren Maximalwerts. Wenn Sie versuchen, die Lautstärke einer Audiodatei zu verringern, verschlechtern Sie die Klangqualität.

    
Sam Dufel 20.10.2010 22:18
quelle