在 tableview Swift 3 中保存并显示录制的语音笔记

Posted

技术标签:

【中文标题】在 tableview Swift 3 中保存并显示录制的语音笔记【英文标题】:Save and show recorded voice notes in tableview Swift 3 【发布时间】:2017-06-21 21:06:24 【问题描述】:

我是 Swift 的新手,因此我们将不胜感激。我正在创建这个项目来记录、保存记录的数据并在表格视图中显示数据。现在我只能录制和播放当前的录音。如果我再次按下录制,之前录制的音频将被删除。但我想永久保存录制的音频并显示在表格视图中。这是我到目前为止得到的。提前致谢!

import UIKit
import AVFoundation

class ViewController: UIViewController, AVAudioPlayerDelegate, 
AVAudioRecorderDelegate 


    var audioPlayer: AVAudioPlayer?
    var audioRecorder: AVAudioRecorder?

    @IBOutlet weak var recordAudio: UIButton!
    @IBOutlet weak var stopAudio: UIButton!
    @IBOutlet weak var playAudio: UIButton!

    var arrayData: [FileManager] = []

    override func viewDidLoad() 
        super.viewDidLoad()

     playAudio.isEnabled = false
    stopAudio.isEnabled = false

    // Creating File Manager

        let fileMgr = FileManager.default

        let dirPath = fileMgr.urls(for: .documentDirectory, in: .userDomainMask)
        let soundFileUrl = dirPath[0].appendingPathComponent("sound.caf")

        let recordSettings = [AVEncoderAudioQualityKey: AVAudioQuality.min.rawValue,
                              AVEncoderBitRateKey: 16,
                              AVNumberOfChannelsKey: 2,
                              AVSampleRateKey: 44100.0 ] as [String:Any]

        let audiosession = AVAudioSession.sharedInstance()

        do 
                try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)

         catch 

                   print(error.localizedDescription)

        

        do 
                try audioRecorder = AVAudioRecorder(url: soundFileUrl, settings: recordSettings as [String : Any])

        audioRecorder?.prepareToRecord()

         catch 

            print(error.localizedDescription)
        


    @IBAction func recordButton(_ sender: Any) 

        if audioRecorder?.isRecording == false 

        playAudio.isEnabled = false
        stopAudio.isEnabled = true
        audioRecorder?.record()
  

    

    @IBAction func stopButton(_ sender: Any) 

        stopAudio.isEnabled = false
        playAudio.isEnabled = true
        recordAudio.isEnabled = true

        if audioRecorder?.isRecording == true

            audioRecorder?.stop()

          else 

                audioPlayer?.stop()

        



@IBAction func playButton(_ sender: Any) 

    if audioRecorder?.isRecording == false

        stopAudio.isEnabled = true
        recordAudio.isEnabled = true

        do 
                try audioPlayer = AVAudioPlayer(contentsOf: (audioRecorder?.url)!)

            audioPlayer!.delegate = self
            audioPlayer!.prepareToPlay()
            audioPlayer!.play()

         catch 

                print(error.localizedDescription)

        
    


func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) 
    recordAudio.isEnabled = true
    stopAudio.isEnabled = false


func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) 
    print("Audio Player Error")


func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) 



func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) 
        print("Audio Recorder Error")

【问题讨论】:

保存录制文件后,您必须将其打包并通过 UITableView 的委托和数据源方法将其插入到表格视图中。我想说弄清楚如何保存记录首先编写该方法,然后如果您在创建数据模型或将项目插入 UITableView 时遇到问题,那么只需提出一个新问题。查看此帖子以保存录音:***.com/questions/39433639/… @buttler_baby 感谢您的回复,该链接对我帮助很大。但是一旦数据被保存,我就知道如何在 tableview 中显示数据。只是不知道如何实际保存多个录音。有什么建议吗? 更改soundFileUrl 名称,您将创建一个新的音频文件。例如 sound1.caf、sound2.caf、sound3.caf @IamWayne 您将不断覆盖您保存的同一个文件,因为它一直以相同的名称保存。所以我建议你这样做:让 audioRecording = NSUUID().UUIDString + ".m4a" 这样你总能得到一个唯一的文件名。 @zsteed 感谢您的回复,但是如何为每个录制的音频创建不同的文件名?如果我可以创建一个数组来保存记录的文件会更好吗? 【参考方案1】:

您只能保存一个视频的原因是您只指定了一个文件名。如果要保留多个视频,则必须使用不同的文件名。您可以要求用户输入视频文件名,然后存储它们。您可以检查是否存在同名视频in this way。

您必须将所有视频文件存储到文档文件夹中,以便当用户关闭并重新打开应用程序时,视频文件仍然存在。一系列视频存储在您手机的内存中,当应用关闭时,您将失去一切。

在您将所有视频文件存储在文件夹中后,在启动视频列表视图控制器时,您可以use this method 从文件夹中获取视频名称列表,然后在表格视图中显示名称。

【讨论】:

以上是关于在 tableview Swift 3 中保存并显示录制的语音笔记的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将绘图保存到 tableview?

如何在swift 4中重新排序单元格后保存tableView顺序

Swift - 保存核心数据后更新 Tableview

如何将完整的 UserDefaults 列表放入 tableview - Swift 3

Swift - 多个 TableView 复选标记 - 保存和加载选择

如何在 iOS Swift 中将选定的 tableView 单元格保存到数组中?