2013-04-26 1 views
2

을 재생하는 동안은 :오디오 플레이어 지속 시간의 변화 나 오디오 파일의 지속 시간을 때 그것을 재생하기 전에

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 
... 
[audioPlayer prepareToPlay]; 
duration = audioPlayer.duration; 

나는 예를 들어 16.71s에 대한 지속 시간을 얻을. 그런 다음 연주하는 동안 0.2 초마다 샘플을 가져 가면 재생 시간이 변경됩니다. 16.71 초, 17.02 초, 17.23 초, 17.33 초, 17.38 초, 17.43 초, 17.38 초, 17.29 초, 17.31 초로 1.2에서 1.6 초마다 변경되고 마지막 2.5 초 동안 17.51 ​​초로 유지됩니다. 그래서 그것은 위아래로갑니다.

I 슬라이더 위치를 업데이트하는 방법으로 샘플링하고 경과 시간과 총 지속 시간도 표시합니다. 연주하는 동안 길이가 (int truncated) 16에서 17로 변하는 것을 보는 것은 정말로 이상하게 보입니다. 또한이 모든 표류와 함께 슬라이더 위치가 꺼집니다.

이유가 누구인지 알고 있습니까?

이제 지속 시간에 대해 이야기했습니다. 누군가 audio player.duration[audioPlayer prepareToPlay]이 생략되었을 때 실제 지속 시간의 약 두 배가되는 값을 반환 할 수있는 이유를 알고 있습니까?

+0

를, 이들은 각 시간을 얻을 같은 숫자? 또는 그들은 변화합니까? – WendiKidd

+0

첫 번째 값은 항상 동일합니다 : 16,71 초. 이후의 값은 새로운 'AVAudioPlayer'로 재생할 때마다 다릅니다. 최종 값도 항상 동일합니다 : 17.51 ​​초. 그러나 동일한 오디오 플레이어로 재생할 때 모든 값은 17.51입니다. –

+1

어떤 유형의 오디오 파일입니까? VBR (가변 비트율)으로 인코딩 된 경우 오디오 플레이어가 파일의 길이를 추정하려고 할 수 있습니다. – batkuip

답변

4

avaudioplayer의 duration 메서드에서 반환되는 기간은 지금까지 디코딩 된 파일의 양을 기준으로 파일의 총 재생 시간을 가장 잘 예측 한 것입니다. 시간이 지남에 따라 계속 확인하면서 지속 시간이 계속 정제되는 이유입니다.

더 나은 시간을 갖기 위해 AVAsset의 duration 메소드를 사용합니다. 그것은 더 나은 조금 여기에 무슨 일이 일어나고 있는지 설명 :

https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVAsset_Class/Reference/Reference.html#//apple_ref/occ/instp/AVAsset/duration

당신이 YES providesPreciseDurationAndTiming = 지정하면 정확도의 지속 시간을 결정하기 위해 필요한 경우, 다음 AVAsset 파일을 디코딩합니다. 디코딩 시간이 너무 길어서 사용하지 못하게 할 수 있습니다. 내 상황에서

, 내가 AVURLAsset 서브 클래스 사용 : 여러 번 실행하는 경우

  AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:localURL options:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]]; 
      float t = CMTimeGetSeconds(asset.duration); 
관련 문제