在 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 4中重新排序单元格后保存tableView顺序
如何将完整的 UserDefaults 列表放入 tableview - Swift 3