2013-02-26 45 views
2

這是我在viewDidLoad中代碼:AVPlayer - 快退/前進流

AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://groove.wavestreamer.com:7321/listen.pls?sid=1"]]; 

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil]; 

music = [[AVPlayer playerWithPlayerItem:playerItem] retain]; 
[music play]; 

我的問題:
如何創建一個按鈕,在快進/快向後流5秒,當它被按下時?

謝謝您的解答... :)

編輯:我怎樣才能添加到我的當前時間...

CMTime currentTime = music.currentTime; 

... 5秒了嗎?

+0

這是正確的方法嗎? CMTime currentTime = music.currentTime; float audioCurrentSeconds = CMTimeGetSeconds(currentTime); audioCurrentSeconds + = 5.0; [music seekToTime:audioCurrentSeconds toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; – 2013-02-26 18:01:34

回答

1

使用AVPlayer方法seekToTime

AVPlayer *player=..; 
[player seekToTime:time toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; 

這裏是一個reference

希望它可以幫助

+0

轉發工作正常,但我不能用這種方法倒帶。你知道爲什麼嗎? – 2013-02-27 13:06:08

+0

當你嘗試倒帶會發生什麼? – Daniel 2013-02-27 15:57:25

+0

什麼都沒有發生。 – 2013-02-27 17:30:06

3

在斯威夫特

fileprivate let seekDuration: Float64 = 5 


@IBAction func doForwardJump(_ sender: Any) { 
    guard let duration = player.currentItem?.duration else{ 
     return 
    } 
    let playerCurrentTime = CMTimeGetSeconds(player.currentTime()) 
    let newTime = playerCurrentTime + seekDuration 

    if newTime < CMTimeGetSeconds(duration) { 

     let time2: CMTime = CMTimeMake(Int64(newTime * 1000 as Float64), 1000) 
     player.seek(to: time2) 
    } 
} 
@IBAction func doBackwardJump(_ sender: Any) { 

    let playerCurrentTime = CMTimeGetSeconds(player.currentTime()) 
    var newTime = playerCurrentTime - seekDuration 

    if newTime < 0 { 
     newTime = 0 
    } 
    let time2: CMTime = CMTimeMake(Int64(newTime * 1000 as Float64), 1000) 
    player.seek(to: time2) 

} 

在Objective-C,

#define seekDuration (float)5 

- (IBAction)backwardButtonAction:(UIButton *)sender { 
    float playerCurrentTime = [self getCurrentTime]; 
    float newTime = playerCurrentTime - seekDuration; 

    if (newTime < 0) { 
     newTime = 0; 
    } 
    CMTime time = CMTimeMake(newTime*1000, 1000); 
    [self.player seekToTime:time completionHandler:^(BOOL finished) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      playerSliderisScrubbing = NO; 
     }); 
    }]; 
} 
- (IBAction)forwardButtonAction:(UIButton *)sender { 
    float duration = [self getPlayerDuration]; 
    float playerCurrentTime = [self getCurrentTime]; 
    float newTime = playerCurrentTime + seekDuration; 

    if (newTime < duration) { 
     CMTime time = CMTimeMake(newTime*1000, 1000); 
     [self.player seekToTime:time completionHandler:^(BOOL finished) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       playerSliderisScrubbing = NO; 
      }); 
     }]; 

    } 
} 
- (float)getCurrentTime { 
    float seconds = 0; 
    if (_player) { 
     seconds = CMTimeGetSeconds([_player currentTime]); 
    } 
    return seconds; 
} 
- (float)getPlayerDuration { 
    float seconds = 0; 
    if (_player) { 
     seconds = CMTimeGetSeconds([[_player currentItem] duration]); 
    } 
    return seconds; 
}