Comment append UISlider à AVPlayer

Je veux append uislider à mon lecteur afin que je puisse mettre en place le scrubbing tout en jouant de l'audio dans AVPlayer. dès que la première chanson sera jouée, l'uislider returnnera à la position originale et la chanson suivante commencera à jouer. Si quelqu'un m'aide je l'apprécierais. C'est mon code.

-(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 = NSLocalizedSsortingng (@"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]; } 

 - (void)sliderValueChanged:(id)sender { CMTime newTime = CMTimeMakeWithSeconds(timeSlider.value * durationSeconds, player.currentTime.timescale); [self.player seekToTime:newTime]; } 

Utilisez un UISlider (ici appelé timeSlider) et la méthode ci-dessus

Voici comment mettre à jour le slider lors de la lecture:

 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); NSSsortingng *minsSsortingng = mins < 10 ? [NSSsortingng ssortingngWithFormat:@"0%d", mins] : [NSSsortingng ssortingngWithFormat:@"%d", mins]; NSSsortingng *secsSsortingng = secs < 10 ? [NSSsortingng ssortingngWithFormat:@"0%d", secs] : [NSSsortingng ssortingngWithFormat:@"%d", secs]; currentTimeLabel.text = [NSSsortingng ssortingngWithFormat:@"%@:%@", minsSsortingng, secsSsortingng]; }]; 

J'ai essayé la meilleure solution, et pour les videos plus longues c'était correct, mais quand j'avais une video de ~ 4 secondes, l'UISlider était très agité. Si vous voulez de la précision, essayez cette solution:

 - (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]; } } 

Ce code est en ligne. Jouez le slider Audio Song with Volume. Vous pouvez facilement augmenter et diminuer le volume. En utilisant AvAudioPlayer …

*

 AudioPlayerController.h @interface AudioPlayerController : UIViewController{ AVAudioPlayer *audioPlayer; NSMutableData *data; NSURLConnection *connection; UIView *myView; IBOutlet UISlider *volumeSlider1; IBOutlet UIView *volumeSlider; } @property (retain, nonatomic) IBOutlet UIActivityIndicatorView *activity; @property (retain ,nonatomic) AVAudioPlayer *audioPlayer; - (IBAction)pause:(id)sender; - (IBAction)play:(id)sender; - (IBAction)stop:(id)sender; @end AudioPlayerController.m - (void)viewDidLoad { //JD... [super viewDidLoad]; volumeSlider1.minimumValue = 0; volumeSlider1.maximumValue = 10; volumeSlider1.value = [[[NSUserDefaults standardUserDefaults] valueForKey:@"volume"] intValue]; self.navigationController.navigationBarHidden = NO; [self getAudioFromNet]; } - (void)getAudioFromNet { NSURL *url = [NSURL URLWithSsortingng:@"http://sound17.mp3pk.com/indian/cocktail/[Songs.PK]%20Cocktail%20-%2001%20-%20Tum%20Hi%20Ho%20Bandhu.mp3"]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; } - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData { if (data==nil) { data = [[NSMutableData alloc] initWithCapacity:2048]; } [data appendData:incrementalData]; } - (void)connectionDidFinishLoading:(NSURLConnection*)theConnection { audioPlayer = [[AVAudioPlayer alloc] initWithData:data error: nil]; [audioPlayer setVolume:3]; [audioPlayer play]; } - (IBAction)play:(id)sender{ [audioPlayer play]; } - (IBAction)pause:(id)sender{ [audioPlayer pause]; } - (IBAction)stop:(id)sender{ [audioPlayer stop]; } //This Method is Used for Volume... - (IBAction)sliderMoved:(UISlider *)aSlider { audioPlayer.volume = volumeSlider1.value; int valumeInt = volumeSlider1.value; [[NSUserDefaults standardUserDefaults] setValue:[NSSsortingng ssortingngWithFormat:@"%d",valumeInt] forKey:@"volume"]; audioPlayer.volume = [[[NSUserDefaults standardUserDefaults] valueForKey:@"volume"] intValue]; } @end 

*

J'ai fait mon propre joueur pour jouer à la video. Voici le code pour UISlider j'ai fait. Initialiser l'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]; 

Maintenant, ajoutez un observateur et les fonctions.

 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 getSsortingngFromCMTime:self.moviePlayer.currentTime]; }]; 

Les fonctions :

 -(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)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 *) expéditeur
{
if (self.isPlaying) {
[lecture de self.moviePlayer];
}
}

Espérons que cela peut vous aider.