2017-04-11 17 views
8

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áy record(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õi recorder.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ủa recorder.deviceTimeCFAbsoluteTimeGetCurrent
  • 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.

+0

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:'? –

+0

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 –

+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. –

Trả lời

0

Trong tất cả các lần tôi đã sử dụng AVAudioRecorder, cuối cùng tôi đã phải thay thế nó. AVAudioRecorder là một lớp học ghi mục đích chung, vì vậy một khi yêu cầu của bạn có được một chút chuyên ngành, nó sẽ làm bạn thất vọng.

Tuy nhiên, nó thực hiện đo sáng, đó là điều thu hút nhiều người đến đó. Vì vậy, có thể tình hình có thể được tận dụng.

Khả năng:

a.nếu currentTime không đáng tin cậy, thì đừng quan sát nó! Bạn có 5 tệp thứ hai, vì vậy có thể tìm một số cách khác để đánh dấu khoảng thời gian đó trong ứng dụng của bạn.

b. tài sản currentTime, các tập tin tiêu đề nói:

only valid while recording 

Bạn đang lấy mẫu currentTime chỉ khi ghi? Nếu vậy thì đó có thể là vấn đề. Trong trường hợp đó, bạn có thể sử dụng thuộc tính deviceCurrentTime, giá trị này luôn hợp lệ, mặc dù bạn sẽ phải trừ đi số deviceCurrentTime ban đầu.

Nếu tình huống không thể được khắc phục, bạn có thể thay thế nhanh chóng AVAudioRecorder bằng AVAudioEngineAVAudioFile, nhưng đó là câu hỏi cho một ngày khác.

+0

Yea Tôi đã suy nghĩ về việc thay thế nó, nhưng không muốn nếu có thể ... và đó là đo lường đã thu hút tôi. Về cơ bản, tôi đang xem sức mạnh trung bình của người ghi cả để nuôi một hoạt hình và đánh giá sự im lặng. Đó là phần thứ hai mà tôi cần thuộc tính 'currentTime'. Nhưng tôi cần những thời gian này để phù hợp với nhận thức của 'AVAudioPlayer' và' AVReader' về thời gian. –

+0

Oh và tôi cũng nên làm rõ: Tôi chỉ báo cáo các giá trị của 'currentTime' khi' isRecording' là đúng. Điều đó có nghĩa là máy ghi vẫn đang ghi khi 'currentTime' vượt quá thời lượng âm thanh thực tế hoặc' isRecording' không thực sự cho biết máy ghi đang làm gì. Nhưng có lẽ tiêu đề nói lên tất cả. "' Chỉ có giá trị trong khi ghi âm (nhưng không đặt cược vào nó) '" –

+0

Tôi đã cố gắng sử dụng thuộc tính 'deviceCurrentTime' của máy ghi âm, nhưng thấy nó hoạt động giống như kỳ lạ. Có lẽ tôi nên sử dụng một thước đo khác về thời gian của thiết bị, bên ngoài máy ghi âm? –

Các vấn đề liên quan