1

私は、ユーザーがオーディオを録音し、ピッチを変更しながら再生し、別のファイルとして行ったことを記録できるアプリに取り組んでいます。

コードは機能しているように見えますが、新しいファイルの持続時間はわずか 0.37 秒 (元の 5 秒) です。バッファーから書き込むと、それ自体が保存され続けるため、最後のセグメントだけが残っていると思います。これが私の問題である場合、上書きする代わりにファイルを追加するにはどうすればよいですか?

    let recordSettings:[String : AnyObject] = [
        AVFormatIDKey: NSNumber(unsignedInt:kAudioFormatAppleLossless),
        AVEncoderAudioQualityKey : AVAudioQuality.Max.rawValue,
        AVEncoderBitRateKey : 320000,
        AVNumberOfChannelsKey: 2,
        AVSampleRateKey : 44100.0
    ]


    var outputFile = AVAudioFile()

    let format = NSDateFormatter()
    format.dateFormat="dd-HH-mm-ss"
    let currentFileName = "recording-\(format.stringFromDate(NSDate())).m4a"
    print(currentFileName)

    let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
    self.url2 = documentsDirectory.URLByAppendingPathComponent(currentFileName)

    let inputNode = engine.inputNode
    let bus = 0

    engine.mainMixerNode.installTapOnBus(bus, bufferSize: 2048, format: self.engine.mainMixerNode.inputFormatForBus(0)) {
        (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in

        do {

            let outputFile = try AVAudioFile(forWriting: self.url2, settings: recordSettings, commonFormat: AVAudioCommonFormat.PCMFormatFloat32, interleaved: false)

            try outputFile.writeFromBuffer(buffer)
            outputFile.framePosition = outputFile.length

        } catch let error as NSError {
            NSLog("Error writing %@", error.localizedDescription)
        }

    }

デュレーションが 0.0 のファイルを作成する更新されたコード:

func play() {

    let duration = CMTimeGetSeconds(AVAsset(URL: url).duration)
    print("Duration")
    print(duration)

    let file = try! AVAudioFile(forReading: url)

    let buffer = AVAudioPCMBuffer(PCMFormat: file.processingFormat, frameCapacity: AVAudioFrameCount(file.length))
    do {
        try file.readIntoBuffer(buffer)
    } catch _ {
    }

    engine = AVAudioEngine()
    player = AVAudioPlayerNode()

    pitch.pitch = 500


    engine.attachNode(player)
    engine.attachNode(pitch)

    engine.connect(player, to: pitch, format: buffer.format)
    engine.connect(pitch, to: engine.mainMixerNode, format: nil)

    let format = NSDateFormatter()
    format.dateFormat="dd-HH-mm-ss"
    let currentFileName = "recording-\(format.stringFromDate(NSDate())).m4a"
    print(currentFileName)

    let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
    self.url2 = documentsDirectory.URLByAppendingPathComponent(currentFileName)

    let outputFile = try! AVAudioFile(forWriting: url2, settings:  [
        AVFormatIDKey: NSNumber(unsignedInt:kAudioFormatAppleLossless),
        AVEncoderAudioQualityKey : AVAudioQuality.Max.rawValue,
        AVEncoderBitRateKey : 320000,
        AVNumberOfChannelsKey: 2,
        AVSampleRateKey : 44100.0
    ])

    done = false
    distortion.installTapOnBus(0, bufferSize: 2048, format: outputFile.processingFormat) {
        (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) in

        let dataptrptr = buffer.floatChannelData
        let dataptr = dataptrptr.memory
        let datum = dataptr[Int(buffer.frameLength) - 1]
        if self.done && fabs(datum) < 0.000001 {
            print("stopping")
            self.engine.stop()
            return
        }

        do {
            try outputFile.writeFromBuffer(buffer)

        } catch let error as NSError {
            NSLog("Error writing %@", error.localizedDescription)
        }
    }

        player.scheduleBuffer(buffer, atTime: nil, options: AVAudioPlayerNodeBufferOptions.Loops, completionHandler: {
            dispatch_async(dispatch_get_main_queue(),{
            self.done = true
            self.player.stop()
                self.engine.stop()
            print("complete")
            })
        })

    engine.prepare()
    do {
        try engine.start()
        player.play()
    } catch _ {
        print("Play session Error")
    }

}
4

1 に答える 1