Я создаю приложение iOS в swift, и клиент возвратил проблему с записью звука, в основном ничего не записывает. Он тестировал iPhone 5/5 с ios 9.x. Проверено на наличие разрешений, и если у него достаточно места на телефоне, это не проблема.Быстрая и аудиозапись
Лично протестирован с устройством iphone 6s с ios 10.x и iphone 5 на симуляторе, и запись работает. Кто-нибудь сталкивался с этим раньше или, может быть, я сделал что-то неправильно, что ускользало от меня.
Добавлены комментарии к различным функциям, которые говорят, что делает приложение.
protocol RecordAndPlayManagerDelegate : class{
func recorderDidStopRecording()
}
class RecordAndPlayManager: NSObject, AVAudioRecorderDelegate {
var soundRecorder: AVAudioRecorder!
let recordSettings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
class func directoryURL() -> URL? {
let fileManager = FileManager.default
let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
let documentDirectory = urls[0] as URL
let soundURL = documentDirectory.appendingPathComponent("recording.m4a")
return soundURL
}
//calling this from outside to get the audio
class func getLocalOrRemoteRecording(_ recordingID : String!) -> URL?{
let fileManager = FileManager.default
let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
let documentDirectory = urls[0] as URL
let soundURL = documentDirectory.appendingPathComponent(recordingID)
if (fileManager.fileExists(atPath: soundURL.path)){
return soundURL
}
let path = kBaseServerURLNOPORT + "data/" + recordingID
let url = URL(string: path)
return url
}
//called from outside, recordingID -> name of the file
class func storeRecording(_ recordingID : String!) -> URL? {
let fileManager = FileManager.default
let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
let documentDirectory = urls[0] as URL
let soundURL = documentDirectory.appendingPathComponent("recording.m4a")
let data = try? Data(contentsOf: soundURL)
//data here has only 28bytes and from this I know it didn't record. In my tests, I always get at least 20000 bytes.
let newSoundURL = documentDirectory.appendingPathComponent(recordingID)
try? data?.write(to: newSoundURL, options: [.atomic])
do {
try FileManager.default.removeItem(at: soundURL)
} catch _ {
print("failed to delete file")
return newSoundURL
}
return newSoundURL
}
//called on viewDidLoad in another screen
func setupRecorder() {
let url = DRMessageRecordAndPlayManager.directoryURL()!
do {
try self.soundRecorder = AVAudioRecorder(url: url, settings: self.recordSettings)
} catch _ {
return
}
soundRecorder.delegate = self
soundRecorder.prepareToRecord()
}
//calling this from outside to start recording
func startRecording() {
if !self.soundRecorder.isRecording {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try audioSession.setActive(true)
soundRecorder.record(forDuration: 15)
} catch {
}
}
}
//called from outside when I hit stop
func stopRecording() {
self.soundRecorder.stop()
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setActive(false)
} catch {
}
}
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
self.delegate?.recorderDidStopRecording()
}
}
Аудиозапись Лучший учебник в Swift 3.0: https://iosdevcenters.blogspot.com/2016/05/audio-recording-and-playing-in-swift-30.html –