2011-09-27 34 views
23

Tôi đang tìm cách để được thông báo chính xác thời điểm khi AVPlayer bắt đầu phát. Có thuộc tính "tỷ lệ", nhưng hiện tại tôi đang kiểm tra định kỳ với một số NSTimer để nhận thông tin cập nhật.AVPlayer, thông báo cho trạng thái phát/tạm dừng?

Tôi đã thử KVO, nhưng dường như nó không tuân thủ KVO.

Tôi biết rằng có events khi trình phát ENDED. Nhưng tôi đang nói về tạm dừng ở đây.

Tôi cũng KVO đã đăng ký trạng thái "AVPlayerItem's", nhưng nó hiển thị cho tôi khi nội dung HTTP đã kết thúc bộ nhớ đệm, không phát/tạm dừng. Tôi cũng bắt đầu thu thập tất cả các cuộc gọi phát/tạm dừng, yêu cầu cập nhật giao diện người dùng ngay lập tức sau đó, nhưng phải mất một số runloops khác trước khi AVPlayer thực sự bắt đầu phát. Tôi chỉ muốn cập nhật nút của tôi ngay lập tức.

+0

Có cách để theo dõi xem AVPlayer có đang được liệt kê ở đây hay không: http://stackoverflow.com/a/9288642/2383604 –

Trả lời

5

Đối với tôi OS 10 trở đi Bạn có thể kiểm tra tài sản mới của AVPlayer timeControlStatus.

if(avplayerObject.timeControlStatus == AVPlayerTimeControlStatusPaused) 
{ 
//Paused mode 
} 
else if(aavplayerObject.timeControlStatus==AVPlayerTimeControlStatusPlaying) 
{ 
//Play mode 
} 
46

Tại sao bạn nói rằng "tỷ lệ" không phải là khiếu nại của KVO? Nó phù hợp với tôi.

Dưới đây là những gì tôi đã làm:

- (void)viewDidLoad 
{ 
    ... 

    [self.player addObserver:self forKeyPath:@"rate" options:0 context:nil]; 
} 

Và sau đó:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
if ([keyPath isEqualToString:@"rate"]) { 
    if ([self.player rate]) { 
     [self changeToPause]; // This changes the button to Pause 
    } 
    else { 
     [self changeToPlay]; // This changes the button to Play 
    } 
} 
} 
+0

thực sự? bạn đã thử trên iOS4 hay iOS5 chưa? Sẽ làm lại các thử nghiệm của tôi; có lẽ đó chỉ là sai lầm của tôi sau tất cả. – steipete

+0

Tôi đã thử trên iOS4. Chưa thử iOS5. – raixer

+3

Tôi đã thử trong iOS5. Để người quan sát của tôi được gọi, tôi phải thêm người quan sát với các tùy chọn: 'NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew'. –

6

AVPalyer như quan sát viên mặc định để theo dõi trong suốt thời gian hiện tại của video, khi bạn tạm dừng hoặc tiếp tục video bạn có thể nhận thời gian bị tạm dừng bằng cách sử dụng một biến toàn cầu (bên trong người quan sát cập nhật biến đó)

Khoảng thời gian CM = = CMTimeMake (1, 1);

//The capture of self here is coming in with your implicit property access of self.currentduration - you can't refer to self or properties on self from within a block that will be strongly retained by self. 

//You can get around this by creating a weak reference to self before accessing timerDisp inside your block 
__weak typeof(self) weakSelf = self; 

self.timeObserverToken = [_player addPeriodicTimeObserverForInterval:interval queue:NULL usingBlock: ^(CMTime time) 
{ 
    _currentDuration = (int)CMTimeGetSeconds (_player.currentTime); 

    if(!_isPlaying) 
    { 
     _pausedDuration = _currentDuration; 
    } 
} 
Các vấn đề liên quan