Воспроизведите аудиофайл, используя Swift для MacOS - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь просто воспроизвести файл (в основном комплекте или на диске), используя AVAudioFile, AVAudioEngine и AVAudioPlayerNode.

Вот что я делаю:

import Foundation
import AppKit
import AudioToolbox
import AVFoundation

struct readFile {
    static var arrayFloatValues:[Float] = []
    static var points:[CGFloat] = []
}

class AudioAnalisys : NSObject {

class func open_audiofile() {
    let audioEngine: AVAudioEngine = AVAudioEngine()
    let audioPlayer: AVAudioPlayerNode = AVAudioPlayerNode()

    //get where the file is
    let url = Bundle.main.url(forResource: "TeamPlaylist", withExtension: "mp3")
    //put it in an AVAudioFile
    let audioFile = try! AVAudioFile(forReading: url!)
    //Get the audio file format
    //let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: file.fileFormat.sampleRate, channels: file.fileFormat.channelCount, interleaved: false)
    let audioFormat = audioFile.processingFormat
    let audioFrameCount = UInt32(audioFile.length)
    //how many channels?
    print(audioFile.fileFormat.channelCount)
    print(audioFrameCount)
    //Setup the buffer for audio data
    let audioFileBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat, frameCapacity: UInt32(audioFile.length))
    //put audio data in the buffer
    try! audioFile.read(into: audioFileBuffer!)
    //readFile.arrayFloatValues = Array(UnsafeBufferPointer(start: audioFileBuffer!.floatChannelData?[0], count:Int(audioFileBuffer!.frameLength)))

    //Init engine and player
    let mainMixer = audioEngine.mainMixerNode
    audioEngine.attach(audioPlayer)
    audioEngine.connect(audioPlayer, to:mainMixer, format: audioFileBuffer!.format)
    audioPlayer.scheduleBuffer(audioFileBuffer!, completionHandler: nil)
    audioEngine.prepare()
    do {
        try audioEngine.start()
        print("engine started")
    } catch let error {
        print(error.localizedDescription)
    }
    audioPlayer.play()

    }
}

Я вижу количество каналов, FrameCount.Я ничего не слышу.Что я делаю неправильно?Вот что я получаю в консоли:

2
17414784
Optional(0x00006080000006c0)

2018-10-09 21:21:02.161593+0200 spectrum[1668:327525] [AudioHAL_Client]    AudioHardware.cpp:666:AudioObjectGetPropertyData:  AudioObjectGetPropertyData: no object with given ID 0

engine started

2018-10-09 21:21:02.594136+0200 spectrum[1668:327593] MessageTracer: Falling back to default whitelist

1 Ответ

0 голосов
/ 09 октября 2018

вот ответ: Невозможно воспроизвести файл из документов в AVAudioPlayer

, что приводит к:

 import Foundation
 import AppKit
 import AudioToolbox
 import AVFoundation

 struct readFile {
    static var arrayFloatValues:[Float] = []
    static var points:[CGFloat] = []
 }

let audioEngine: AVAudioEngine = AVAudioEngine()
let audioPlayer: AVAudioPlayerNode = AVAudioPlayerNode()

class AudioAnalisys : NSObject {

class func open_audiofile() {
    //get where the file is
    let url = Bundle.main.url(forResource: "TeamPlaylist", withExtension: "mp3")
    //put it in an AVAudioFile
    let audioFile = try! AVAudioFile(forReading: url!)
    //Get the audio file format
    //let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: file.fileFormat.sampleRate, channels: file.fileFormat.channelCount, interleaved: false)
    let audioFormat = audioFile.processingFormat
    let audioFrameCount = UInt32(audioFile.length)
    //how many channels?
    print(audioFile.fileFormat.channelCount)
    print(audioFrameCount)
    //Setup the buffer for audio data
    let audioFileBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat, frameCapacity: UInt32(audioFile.length))
    //put audio data in the buffer
    try! audioFile.read(into: audioFileBuffer!)
    //readFile.arrayFloatValues = Array(UnsafeBufferPointer(start: audioFileBuffer!.floatChannelData?[0], count:Int(audioFileBuffer!.frameLength)))

    //Init engine and player
    let mainMixer = audioEngine.mainMixerNode
    audioEngine.attach(audioPlayer)
    audioEngine.connect(audioPlayer, to:mainMixer, format: audioFileBuffer!.format)
    audioPlayer.scheduleBuffer(audioFileBuffer!, completionHandler: nil)
    audioEngine.prepare()
    do {
        try audioEngine.start()
        print("engine started")
    } catch let error {
        print(error.localizedDescription)
    }
    audioPlayer.play()

   }
}
...