【问题标题】:append or concatenate audio files in swift快速附加或连接音频文件
【发布时间】:2015-03-31 20:59:40
【问题描述】:

您好,我想附加语音文件。

我正在用 AVAudioRecorder 录制声音,但要播放录音我需要调用“停止”,但播放后我想继续录音。就像原生 iOS 语音备忘录应用一样。

我应该使用 AVMutableCompositionTrack 吗?如何快速做到这一点?谢谢!

【问题讨论】:

    标签: ios swift audio-recording


    【解决方案1】:

    如果您只想暂停录制并稍后继续录制,您可以使用 AVAudioRecorder 的 pause() 函数而不是 stop(),当您再次使用 play() 时它将继续录制。

    但是,如果您想要真正连接音频文件,您可以这样做:

    func concatenateFiles(audioFiles: [NSURL], completion: (concatenatedFile: NSURL?) -> ()) {
        guard audioFiles.count > 0 else {
            completion(concatenatedFile: nil)
            return
        }
    
        if audioFiles.count == 1 {
            completion(concatenatedFile: audioFiles.first)
            return
        }
    
        // Concatenate audio files into one file
        var nextClipStartTime = kCMTimeZero
        let composition = AVMutableComposition()
        let track = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
    
        // Add each track
        for recording in audioFiles {
            let asset = AVURLAsset(URL: NSURL(fileURLWithPath: recording.path!), options: nil)
            if let assetTrack = asset.tracksWithMediaType(AVMediaTypeAudio).first {
                let timeRange = CMTimeRange(start: kCMTimeZero, duration: asset.duration)
                do {
                    try track.insertTimeRange(timeRange, ofTrack: assetTrack, atTime: nextClipStartTime)
                    nextClipStartTime = CMTimeAdd(nextClipStartTime, timeRange.duration)
                } catch {
                    print("Error concatenating file - \(error)")
                    completion(concatenatedFile: nil)
                    return
                }
            }
        }
    
        // Export the new file
        if let exportSession = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetPassthrough) {
            let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
            let documents = NSURL(string: paths.first!)
    
            if let fileURL = documents?.URLByAppendingPathComponent("file_name.caf") {
                // Remove existing file
                do {
                    try NSFileManager.defaultManager().removeItemAtPath(fileURL.path!)
                    print("Removed \(fileURL)")
                } catch {
                    print("Could not remove file - \(error)")
                }
    
                // Configure export session output
                exportSession.outputURL = NSURL.fileURLWithPath(fileURL.path!)
                exportSession.outputFileType = AVFileTypeCoreAudioFormat
    
                // Perform the export
                exportSession.exportAsynchronouslyWithCompletionHandler() { handler -> Void in
                    if exportSession.status == .Completed {
                        print("Export complete")
                        dispatch_async(dispatch_get_main_queue(), {
                            completion(file: fileURL)
                        })
                        return
                    } else if exportSession.status == .Failed {
                        print("Export failed - \(exportSession.error)")
                    }
    
                    completion(concatenatedFile: nil)
                    return
                }
            }
        }
    }
    

    【讨论】:

    • 当我尝试将多个音频连接到同一个文件时出现以下错误,例如录制 -> 停止 -> 播放 -> 录制 -> 停止 -> 播放 -> 重复。 FigFormatReaderCreateForStreamReturningResults 在 /Library/Caches/com.apple.xbs/Sources/EmbeddedCoreMedia_Sim/EmbeddedCoreMedia-2765.6/Prototypes/FormatHandlers/FigFormatReader_Common.c:2870 发出 err=-12848 (instantiation.firstFailedAttempt.error) (创建 FormatReader 时出错) >
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 2016-09-06
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多