2013-02-26 87 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; 
}