【发布时间】:2016-11-02 16:17:31
【问题描述】:
如何在 AVFoundation 中使用此捕获管道在录制期间更新时间标签:
Mic -> AVCaptureDeviceInput -> AVCaptureSession -> AVCaptureAudioDataOutput
AVCaptureAudioDataOutput 具有将 sampleBuffers 写入输出文件的 Delegate 和 AVAssetWritter。在这个解决方案中,我想更新录制时间。当用户点击记录/暂停/恢复/停止按钮时,我可以记录时间,但是苹果有什么官方方法可以在开始时以 00:00:00 时间更新一些 UILabel。我知道我可以使用 NSTimer,但是当我使用 AVAudioRecorder 时,我有财产:
var currentTime: TimeInterval
// The time, in seconds, since the beginning of the recording.
上述属性也适用于暂停/继续按钮。
现在在这个新管道中我没有这个属性,我想知道我是否遗漏了一些东西并且在任何地方都找不到它。我还注意到 AVCaptureSession 具有名为 masterClock 的 CMClock 属性,但我不知道如何使用它来计算时间,因为从录制开始。
我不明白时钟和方法的全部概念,例如:
CMClockGetHostTimeClock()
CMSyncConvertTime
如何在基于sampleBuffer的AVCaptureAudioDataOutputSampleBufferDelegate方法中获取录音开始的秒数?
更新
我发现了一个名为 CMTimebase 的类,我认为这正是我想要的。目前我不知道如何使用它,但我在操场上进行了一些实验后发现。
import CoreMedia
let masterClock = CMClockGetHostTimeClock() // This masterclock should be from captureSession
var timebase: CMTimebase? = nil
CMTimebaseCreateWithMasterClock(kCFAllocatorDefault, masterClock, &timebase)
print(CMTimeGetSeconds(CMTimebaseGetTime(timebase!)))
CMTimebaseSetRate(timebase!, 1.0) // Start/Resume recording
sleep(1)
print(CMTimeGetSeconds(CMTimebaseGetTime(timebase!)))
sleep(1)
CMTimebaseSetRate(timebase!, 0.0) // Pause Recording
print(CMTimeGetSeconds(CMTimebaseGetTime(timebase!)))
sleep(1)
print(CMTimeGetSeconds(CMTimebaseGetTime(timebase!)))
所以这个对象真的很有用。当我将速率设置为 1.0 时,它开始与 masterClock 同步测量时间。当我将速率设置为 0.0 时,它会停止测量时间。我还注意到我可以将 Timer 附加到这个对象上。不幸的是,在 Apple 网站上根本没有关于这个 Core Media 东西的好的教程,只有一些 api 文档。有人知道 WWDC 是否有关于 CoreMedia 框架相关主题的优秀教程/视频?
【问题讨论】:
-
我之前没用过CMTimebase,但是你应该也可以用它来做你想做的事。只需在开始录制时将其附加到 AVCaptureSession 时钟,并在要更新时间时读取 CMTimebase。不过,您仍然需要一个计时器或触发器“经常”缓冲区来获取显示更新。不幸的是,我不熟悉任何文档,快速谷歌也没有显示任何文档。祝你好运!
标签: ios iphone avfoundation avcapturesession avassetwriter