Ich möchte eine Sounddatei aus dem Anwendungspaket lesen, kopieren, mit der maximalen Lautstärke abspielen (Verstärkungswert oder Spitzenleistung, ich bin mir nicht sicher über den technischen Namen), und schreiben Sie es dann erneut als eine andere Datei in das Bundle.Audio Processing: Wiedergabe mit Lautstärkepegel
Ich habe das Kopieren und Schreiben Teil. Die resultierende Datei ist identisch mit der Eingabedatei. Ich verwende AudioFileReadBytes() und AudioFileWriteBytes() - Funktionen von AudioFile-Diensten im AudioToolbox-Framework, um dies zu tun.
So habe ich die Bytes der Eingabedatei und auch sein 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.
mein Ziel Um zu klären, ich versuche, einen anderen Sound-Datei von dem Lautstärkepegel verringert wird, erhöht zu produzieren oder zu dem ursprünglichen Verwandten, so dass ich kümmere mich nicht um die Lautstärke des Systems, die vom Benutzer eingestellt oder iOS.
Ist das möglich mit dem Framework, das ich erwähnt habe? Wenn nicht, gibt es alternative Vorschläge?
Dank
edit: durch Antwort in Bezug auf einigen Audio-Grundlagen Sam Gehen, habe ich beschlossen, die Frage mit einer anderen Alternative zu erweitern.
Kann ich AudioQueue-Dienste verwenden, um eine vorhandene Audiodatei (die im Paket enthalten ist) in eine andere Datei aufzunehmen und während der Aufnahme mit der Lautstärke (mit Hilfe von Framework) zu spielen?
Update: Hier ist, wie ich die Eingabedatei zu lesen und die Ausgabe zu schreiben. 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.
AudioFileID inFileID;
CFURLRef inURL = [self inSoundURL];
AudioFileOpenURL(inURL, kAudioFileReadPermission, kAudioFileWAVEType, &inFileID)
UInt32 fileSize = [self audioFileSize:inFileID];
Float32 *inData = malloc(fileSize * sizeof(Float32)); //I used Float32 type with jv42's suggestion
AudioFileReadBytes(inFileID, false, 0, &fileSize, inData);
Float32 *outData = malloc(fileSize * sizeof(Float32));
//Art's suggestion, if I've correctly understood him
float ampScale = 0.5f; //this will reduce the 'volume' by -6db
for (int i = 0; i < fileSize; i++) {
outData[i] = (Float32)(inData[i] * ampScale);
}
AudioStreamBasicDescription outDataFormat = {0};
[self audioDataFormat:inFileID];
AudioFileID outFileID;
CFURLRef outURL = [self outSoundURL];
AudioFileCreateWithURL(outURL, kAudioFileWAVEType, &outDataFormat, kAudioFileFlags_EraseFile, &outFileID)
AudioFileWriteBytes(outFileID, false, 0, &fileSize, outData);
AudioFileClose(outFileID);
AudioFileClose(inFileID);
Danke Kunst, ich habe sowohl meinen Code als auch die Frage entsprechend Ihrem Vorschlag aktualisiert, aber das verursachte andere Probleme. Vielleicht habe ich dich falsch verstanden, aber es ist perfekt, wenn du dir die aktualisierte Frage mit Codeausschnitt ansehen kannst. – cocoatoucher
Ich habe meine Antwort mit einer Erklärung, warum Ihr Code nicht funktioniert, und ein Beispiel für Code, der das tut, bearbeitet. –
Kunst, ich bin dankbar für diese Antwort. Sie haben mir nicht nur den Code zur Verfügung gestellt, sondern mir auch geholfen zu verstehen, was vor sich geht. Danke vielmals! Bitte teilen Sie weiter. Danke auch an andere Leute. – cocoatoucher