Tôi có thiết lập như sau, thử nghiệm trên iPhone 5s với iOS 10.3, cả trong lẫn ngoài gỡ lỗi.AVAudioRecorder currentTime cho các giá trị xấu
- Một
AVAudioRecorder
cháyrecord(forDuration: 5.0)
- Một
CADisplayLink
đồng hồ mức độ ghi (ghi làmeteringEnabled
), đồng bộ hóa một hình ảnh động, và theo dõirecorder.currentTime
(nhưng vấn đề có thể được sao chép bằng cách tối thiểu theo dõi thời gian trong liên kết hiển thị) - Báo cáo của
recorder.currentTime
liên tục đạt đến giá trị> 5 (thường là 5,2 đến 5,5). Kết quả về cơ bản phù hợp với các giá trị củarecorder.deviceTime
vàCFAbsoluteTimeGetCurrent
- Tôi khởi tạo số
AVAudioPlayer
và xác minh rằng nội dung âm thanh có thời lượng chính xác là 5,0 giây.
Từ hiểu biết của tôi, của currentTime
ghi được đo bằng giây, và resets đến 0.0 khi recorder.isRecording trở lại trạng sai sự thật, mà xảy ra ngay lập tức khi máy ghi âm dừng lại (điều này là phù hợp với những gì tôi nhìn thấy trong audioRecorderDidFinishRecording
) .. Vì vậy, việc quan sát với CADisplayLink
sẽ tạo ra giá trị thời gian hiện tại dưới 5.0?
Câu hỏi đặt ra là: điều gì có thể xảy ra ở đây? Máy ghi âm dừng lại sau khi nó chính xác sau 5 giây, nhưng nội bộ nó nghĩ rằng nó được ghi lại trong hơn 5 giây? Tôi đang nghe tất cả các bản thu âm của mình và chúng nghe rất hay.
Tôi không chắc chắn nếu nó có liên quan, nhưng tôi AVAudioSession
là loại AVAudioSessionCategoryPlayAndRecord
, và cài đặt âm thanh của tôi là như sau (tất cả các tỷ lệ mẫu ngoại trừ là cần thiết để phân tích sau):
audioSettings = [
AVFormatIDKey: Int(kAudioFormatLinearPCM),
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 2,
AVLinearPCMIsBigEndianKey: 0,
AVLinearPCMIsFloatKey: 0,
AVLinearPCMBitDepthKey: 16,
AVLinearPCMIsNonInterleaved: 0
]
tôi đã thử thách với tất cả những điều này và không thấy bất kỳ hành vi thay đổi nào.
Các CADisplayLink
được bổ sung từ các chủ đề chính qua
recorderDisplayLink?.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
Các câu hỏi tương tự duy nhất tôi có thể tìm thấy trên trao đổi stack là this, nhưng câu hỏi là underspecified và câu trả lời vô ích (cho tôi ít nhất). Lúc đầu, tôi nghĩ có lẽ vấn đề là quá tải hàng đợi chính, do đó cảm giác thời gian của người ghi trở nên cồng kềnh (mà tôi nghĩ rằng vẫn sẽ cấu thành hành vi xấu), nhưng sau khi vô hiệu hóa hoạt ảnh (và cũng thử nghiệm với Bộ hẹn giờ thay vì một CADisplayLink), vấn đề vẫn tồn tại !!! Có lẽ nó vẫn là một vấn đề về luồng, nhưng tôi không hiểu tại sao lại như vậy. Và nếu tôi cần phải đa thread, tôi có thể sử dụng một số trợ giúp cả với sự hiểu biết và thực hiện :) Bất kỳ ý tưởng đánh giá cao.
Vì vậy, là câu hỏi tại sao bạn nhận được từ 0,2 đến 0,5 giây thêm so với thời lượng được yêu cầu với 'recordForDuration:'? –
Câu hỏi là, hai câu lệnh sau đây tương thích đồng thời như thế nào: (1) bản ghi (forDuration: 5.0) tạo bản ghi hợp lệ chính xác 5,0 giây (2) Bộ đếm thời gian quan sát thuộc tính currentTime của máy ghi trong báo cáo hành động giá trị đáng kể > 5.0 –
TL; DR 'AVAudioRecorder' không phải là rất tốt, thay thế nó. xem câu trả lời của tôi cho một phiên bản sắc thái hơn về điều này. –