Ios 如何将UISlider添加到AVPlayer
我想将uislider添加到我的播放器中,以便在AVPlayer中播放音频时实现擦洗。第一首歌一放完,uislider就会回到原来的位置,下一首歌就会开始播放。如果有人帮我,我会很感激的。这是我的密码Ios 如何将UISlider添加到AVPlayer,ios,objective-c,cocoa-touch,avplayer,Ios,Objective C,Cocoa Touch,Avplayer,我想将uislider添加到我的播放器中,以便在AVPlayer中播放音频时实现擦洗。第一首歌一放完,uislider就会回到原来的位置,下一首歌就会开始播放。如果有人帮我,我会很感激的。这是我的密码 -(IBAction)goToiPodLibrary:(UIButton *)sender { // Create picker view MPMediaPickerController* picker = [[MPMediaPickerController alloc] ini
-(IBAction)goToiPodLibrary:(UIButton *)sender
{
// Create picker view
MPMediaPickerController* picker = [[MPMediaPickerController alloc] init];
picker.delegate = self;
if (userMediaItemCollection) {
MusicTableViewController *controller = [[MusicTableViewController alloc] initWithNibName: @"MusicTableView" bundle: nil];
controller.delegate = self;
controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController: controller animated: YES];
// else, if no music is chosen yet, display the media item picker
} else {
MPMediaPickerController *picker =
[[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeMusic];
picker.delegate = self;
picker.allowsPickingMultipleItems = YES;
picker.prompt = NSLocalizedString (@"Add songs to play", "Prompt in media item picker");
// The media item picker uses the default UI style, so it needs a default-style
// status bar to match it visually
[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleDefault animated: YES];
[self presentModalViewController: picker animated: YES];
}
}
-(IBAction)playButtonPressed:(UIButton *)sender
{
[myPlayer play];
}
-(IBAction)pauseButtonPressed:(UIButton *)sender
{
[myPlayer pause];
}
-(void) mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker {
// Dismiss selection view
[self dismissViewControllerAnimated:YES completion:nil];
}
-(void) mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection {
// Dismiss selection view
[self dismissViewControllerAnimated:YES completion:nil];
// Get AVAsset
NSURL* assetUrl = [mediaItemCollection.representativeItem valueForProperty:MPMediaItemPropertyAssetURL];
AVURLAsset* asset = [AVURLAsset URLAssetWithURL:assetUrl options:nil];
// Create player item
AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:asset];
// Play it
myPlayer = [AVPlayer playerWithPlayerItem:playerItem];
[playlistSongsArray addObjectsFromArray:mediaItemCollection.items];
NSLog(@" Playlist songs %@",playlistSongsArray);
[self.myPlaylistTable reloadData];
[myPlayer play];
}
这是我的代码在线播放音频歌曲与音量滑块。您可以轻松地增加和减少音量。使用AvAudioPlayer * * 使用
UISlider
(这里称为timeSlider)和上述方法
以下是播放时如何更新滑块:
self.playbackObserver = [player addPeriodicTimeObserverForInterval:interval queue:NULL usingBlock:^(CMTime time) {
CMTime endTime = CMTimeConvertScale (player.currentItem.asset.duration, player.currentTime.timescale, kCMTimeRoundingMethod_RoundHalfAwayFromZero);
if (CMTimeCompare(endTime, kCMTimeZero) != 0) {
double normalizedTime = (double) player.currentTime.value / (double) endTime.value;
self.timeSlider.value = normalizedTime;
}
Float64 currentSeconds = CMTimeGetSeconds(player.currentTime);
int mins = currentSeconds/60.0;
int secs = fmodf(currentSeconds, 60.0);
NSString *minsString = mins < 10 ? [NSString stringWithFormat:@"0%d", mins] : [NSString stringWithFormat:@"%d", mins];
NSString *secsString = secs < 10 ? [NSString stringWithFormat:@"0%d", secs] : [NSString stringWithFormat:@"%d", secs];
currentTimeLabel.text = [NSString stringWithFormat:@"%@:%@", minsString, secsString];
}];
self.playbackObserver=[player addPeriodicTimeObserverForInterval:interval队列:NULL usingBlock:^(CMTime){
CMTime endTime=CMTimeConvertScale(player.currentItem.asset.duration,player.currentTime.timescale,kCMTimeRoundingMethod\u RoundHalfAway从零开始);
如果(CMTimeCompare(endTime,kCMTimeZero)!=0){
double normalizedTime=(double)player.currentTime.value/(double)endTime.value;
self.timeSlider.value=normalizedTime;
}
Float64 currentSeconds=CMTimeGetSeconds(player.currentTime);
int分钟=当前秒/60.0;
int secs=fmodf(当前秒,60.0);
NSString*MINSTRING=mins<10?[NSString stringWithFormat:@“0%d”,分钟]:[NSString stringWithFormat:@“%d”,分钟];
NSString*secsString=secs<10?[NSString stringWithFormat:@“0%d”,secs]:[NSString stringWithFormat:@“%d”,secs];
currentTimeLabel.text=[NSString stringWithFormat:@“%@:%@”,minsString,secsString];
}];
我制作了自己的播放器来播放视频。这是我制作的UISlider
的代码。
初始化UISlider
self.progressBar = [[[UISlider alloc] init] autorelease];
self.progressBar.frame = CGRectMake(44*frameWidth/240, 6*frameHeight/160, 187*frameWidth/240,33*frameHeight/160);
[self.progressBar addTarget:self action:@selector(progressBarChanged:) forControlEvents:UIControlEventValueChanged];
[self.progressBar addTarget:self action:@selector(proressBarChangeEnded:) forControlEvents:UIControlEventTouchUpInside];
[self.progressBar setThumbImage:[UIImage imageNamed:@"Slider_button"] forState:UIControlStateNormal];
[self.playerManageViewBottom addSubview:self.progressBar];
现在添加一个观察者和函数
CMTime interval = CMTimeMake(33, 1000);
playbackObserver = [self.moviePlayer addPeriodicTimeObserverForInterval:interval queue:dispatch_get_current_queue() usingBlock: ^(CMTime time) {
CMTime endTime = CMTimeConvertScale (self.moviePlayer.currentItem.asset.duration, self.moviePlayer.currentTime.timescale, kCMTimeRoundingMethod_RoundHalfAwayFromZero);
if (CMTimeCompare(endTime, kCMTimeZero) != 0) {
double normalizedTime = (double) self.moviePlayer.currentTime.value / (double) endTime.value;
self.progressBar.value = normalizedTime;
}
self.playBackTime.text = [self getStringFromCMTime:self.moviePlayer.currentTime];
}];
职能:
-(void)progressBarChanged:(UISlider*)sender
{
if (self.isPlaying) {
[self.moviePlayer pause];
}
CMTime seekTime = CMTimeMakeWithSeconds(sender.value * (double)self.moviePlayer.currentItem.asset.duration.value/(double)self.moviePlayer.currentItem.asset.duration.timescale, self.moviePlayer.currentTime.timescale);
[self.moviePlayer seekToTime:seekTime];
}
-(void)proressBarChangeEnded:(UISlider*)sender
{
if (self.isPlaying) {
[self.moviePlayer play];
}
}
-(无效)progressBarChanged:(UISlider*)发送方
{
if(自显示){
[self.moviePlayer暂停];
}
CMTime seekTime=CMTimeMakeWithSeconds(sender.value*(double)self.moviePlayer.currentItem.asset.duration.value/(double)self.moviePlayer.currentItem.asset.duration.timescale,self.moviePlayer.currentTime.timescale);
[self.moviePlayer seekTime:seekTime];
}
-(无效)PropressBarChangeEnded:(UISlider*)发送方
{
if(自显示){
[self.moviePlayer play];
}
}
希望它能帮助您。我尝试了顶级解决方案,对于较长的视频,这是可以的,但当我有一个~4秒的视频时,UISlider非常不稳定。如果需要精度,请尝试以下解决方案:
- (IBAction)sliderSlid:(id)sender {
if ([sender isKindOfClass:[UISlider class]]) {
UISlider *slider = sender;
CMTime playerDuration = player.currentItem.duration;
if (CMTIME_IS_INVALID(playerDuration)) {
return;
}
double duration = CMTimeGetSeconds(playerDuration);
if (isfinite(duration)) {
float minValue = [slider minimumValue];
float maxValue = [slider maximumValue];
float value = [slider value];
double time = duration * (value - minValue) / (maxValue - minValue);
[player seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
}
[player pause];
}
}
伙计,我猜他要的是擦洗器…,不是音量吧我不要音量吧我要的是擦洗器,我用的是AVPlayer不是AvaudioPlayerPath是timeslider是uislider的对象…所以每当一首新歌开始播放时,滑块会自动从头开始播放?pat播放列表中的歌曲在tableview中。。我有一些问题,我可以发电子邮件给你吗?如果可以的话,持续时间是多少秒?我可以给它赋值吗?它是一个浮点数。例如,可以是0.2
-(void)progressBarChanged:(UISlider*)sender
{
if (self.isPlaying) {
[self.moviePlayer pause];
}
CMTime seekTime = CMTimeMakeWithSeconds(sender.value * (double)self.moviePlayer.currentItem.asset.duration.value/(double)self.moviePlayer.currentItem.asset.duration.timescale, self.moviePlayer.currentTime.timescale);
[self.moviePlayer seekToTime:seekTime];
}
-(void)proressBarChangeEnded:(UISlider*)sender
{
if (self.isPlaying) {
[self.moviePlayer play];
}
}
- (IBAction)sliderSlid:(id)sender {
if ([sender isKindOfClass:[UISlider class]]) {
UISlider *slider = sender;
CMTime playerDuration = player.currentItem.duration;
if (CMTIME_IS_INVALID(playerDuration)) {
return;
}
double duration = CMTimeGetSeconds(playerDuration);
if (isfinite(duration)) {
float minValue = [slider minimumValue];
float maxValue = [slider maximumValue];
float value = [slider value];
double time = duration * (value - minValue) / (maxValue - minValue);
[player seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
}
[player pause];
}
}