2017-08-19 4 views
0

Der folgende Code funktioniert für Audio-Dateien nur von kurzer Dauer auf alle meine Geräte (iPhone, Apple Watch, Simulator):AVAudioPCMBuffer - Lesen (in den Puffer: AVAudioPCMBuffer) Speicherabsturz? (Pufferüberlauf)

let file = try! AVAudioFile(forReading: url!) let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: file.fileFormat.sampleRate, channels: file.fileFormat.channelCount, interleaved: false) let buf = AVAudioPCMBuffer(pcmFormat: format!, frameCapacity: UInt32(file.length)) try! file.read(into: buf!)

Der Absturz tritt bei try! file.read(into: buf!) jedoch versuchen, eine 5 zu lesen Zum Beispiel verursacht eine lange Audiodatei einen Absturz auf meiner Apple Watch (funktioniert aber auf dem Apple Watch Simulator). Mit Program ended with exit code: 0.

Beobachten Sie die Debug-Tools, offensichtlich ist dieser Prozess auf der Apple Watch viel mehr als ein iPhone. Ich habe versucht, es auf verschiedenen Threads, Hintergrund usw. ohne Erfolg laufen zu lassen.

Ich weiß, ich könnte den Puffer an das iPhone zur Verarbeitung senden, aber ich würde gerne sehen (auch wenn es ein wenig länger dauert), wenn ich in den Puffer ausschließlich von der Uhr lesen kann.

Antwort

0

5 Minuten mono LPCM float32 Audio bei 44,1 kHz wäre 5 * 60 * 44100 * 4 Bytes oder etwa 53 MB. Verdoppeln Sie das für Stereo. Ich weiß nicht, was die Speichergrenzen der Uhr sind, aber ich denke, dass Sie sie überschreiten.

+0

Ja ist es tatsächlich 2-Kanal-Audio, im Debugger trifft die Uhr etwa 70-80 MB Speicherverbrauch, stürzt dann ab. Kann ich die Last auf der Apple Watch irgendwie abmildern? – devone

+0

Was versuchst du zu tun? Müssen Sie wirklich 5 Minuten Audio auf einmal laden? Oder dekomprimiere es? –

+0

Ich lade den Puffer in - readFile.arrayValues ​​= Array (UnsafeBufferPointer (Start: buf! .floatChannelData? [0], Anzahl: Int (buf! .frameLength))) Von dort aus verarbeite ich die Punkte, um ein Audio-Signal zu erzeugen . Ich muss es auf diese Weise tun, weil einfachere Möglichkeiten, dies zu tun, keine Frameworks auf watchOS sind. – devone