ios - 在 swift 中附加或连接音频文件

标签 ios swift audio-recording

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

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

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

最佳答案

如果您只是想暂停录音并稍后继续,您可以使用 AVAudioRecorder 的暂停()函数而不是 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
            }
        }
    }
}

关于ios - 在 swift 中附加或连接音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29378472/

相关文章:

IOS swift 我可以消除 TableView 中未使用的行吗

android - 如何使用 Android Studio 录制带有声音的视频?

c# - 内部录音程序

shell - FFMPEG:向以前的 amix 输出添加更多轨道

ios - 水平旋转(翻转)一个按钮

ios - 在没有 NavigationBar 的情况下将数据从 AppDelegate 传递到 TableViewController

ios - 如何以编程方式更改在 IB 中设置的自动布局约束?

swift - 屏幕截图 - 奇怪的灰色区域

ios - RACObserve 不工作

ios - 为什么打开控制中心时 swift 应用程序进入后台?