我正在使用AVAudioRecorder
录制音频,现在我想获得录制音频的确切持续时间,我该怎么做呢。
我试过这个:
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:avAudioRecorder.url options:nil];
CMTime time = asset.duration;
double durationInSeconds = CMTimeGetSeconds(time);
但我的time
变量返回NULL并且durationInSeconds
返回' nan' nan,这意味着什么。
更新
user1903074
回答已经解决了我的问题,但仅仅是为了好奇,无论如何都可以在没有AVAudioplayer
的情况下解决问题。
答案 0 :(得分:13)
如果您使用AVAudioPlayer
AVAudioRecorder
而不是audioPlayer.duration
并获得时间。
NSError *playerError;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:yoururl error:&playerError];
NSlog(@"%@",audioPlayer.duration);
但仅当您将AVAudioPlayer
与AVAudioRecorder
一起使用时才会使用。
<强>更新强>
或者你可以这样做。
//put this where you start recording
myTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
// a method for update
- (void)updateTime {
if([recorder isRecording])
{
float minutes = floor(recorder.currentTime/60);
float seconds = recorder.currentTime - (minutes * 60);
NSString *time = [[NSString alloc]
initWithFormat:@"%0.0f.%0.0f",
minutes, seconds];
}
}
钢铁你可以得到一些延迟,因为它们是一些微秒值,我不知道如何剪辑它。但就是这样。
答案 1 :(得分:1)
我的解决方案只是跟踪开始日期,最后计算通过的时间。 它对我有用,因为用户正在启动和停止录音机。
在录音机课程中
NSDate* startTime;
NSTimeInterval duration;
-(void) startRecording
{
//start the recorder
...
duration = 0;
startTime = [NSDate date];
}
-(void) stopRecording
{
//stop the recorder
...
duration = [[NSDate date] timeIntervalSinceDate:startRecording];
}
答案 2 :(得分:1)
这里的几个答案使用相同的非常糟糕的时间格式,其结果是“0.1”持续 1 秒或“0.60”持续 1 分钟。如果你想要一些让你看起来像 0:01 或 1:00 这样的正常时间的东西,那么使用这个:
let minutes = Int(audioRecorder.currentTime / 60)
let seconds = Int(audioRecorder.currentTime) - (minutes * 60)
let timeInfo = String(format: "%d:%@%d", minutes, seconds < 10 ? "0" : "", seconds)
答案 3 :(得分:0)
我知道最初的问题是在Objective-C中寻找答案,但对于那些希望在Swift中这样做的人来说,这适用于Swift 4.0:
let recorder = // Your instance of an AVAudioRecorder
let player = try? AVAudioPlayer(contentsOf: recorder.url)
let duration = player?.duration ?? 0.0
假设您有一个有效的记录器,那么您将获得一个持续时间值,该值为TimeInterval
。
答案 4 :(得分:0)
更新@Dilip对Swift 5.3的出色回答:
//put this where you start recording
myTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
// a method for update
@objc func updateTime(){
if recorder.isRecording{
let minutes = floor(recorder.currentTime/60)
let seconds = recorder.currentTime - (minutes * 60)
let timeInfo = String(format: "%0.0f.%0.0f", minutes, seconds)
}
}