Lecture de fichiers audio avec les contrôles de iOS
J'ai fait une application avec tab bar,nav bar and table view
.
Dans le tableau d'affichage vous pouvez choisir d'écouter de l'audio.
Nouvelle vue s'ouvre et là, j'ai quelques commandes comme: lecture,pause,volume curseur, curseur de progression, étiquette, à l'heure actuelle.
Il fonctionne, mais n'est pas parfait.
Je peux jouer de l'audio, je peux mettre en pause l'audio, je peux également utiliser le curseur pour sauter en avant ou en arrière. Mais maintenant:
, Quand j'appuie sur le bouton précédent de la barre de navigation, la chanson continue à jouer. C'est ok, mais lorsque je retourne à la vue encore une fois, la minuterie et le curseur de revenir d'elles-mêmes. Je ne peux pas mettre en pause la chanson, faut juste attendre util il s'arrête de jouer.
Aussi, quand j'appuie sur play, revenez à la vue de la table, choisir un autre fichier pour le lire, le premier fichier ne sera pas arrêter de jouer.
Ici est la Audio1DetailViewController.h code:
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface Audio1DetailViewController: UIViewController <AVAudioPlayerDelegate> {
IBOutlet UISlider *volumeControl;
IBOutlet UILabel *timerLabel;
IBOutlet UISlider *progressBar;
AVAudioPlayer *audioPlayer;
NSTimer *playbackTimer;
}
@property (nonatomic, retain) IBOutlet UISlider *volumeControl;
@property (nonatomic, retain) IBOutlet UILabel *timerLabel;
@property (nonatomic, retain) IBOutlet UISlider *progressBar;
@property (nonatomic, retain) NSTimer *playbackTimer;
@property (nonatomic, retain) AVAudioPlayer *audioPlayer;
-(IBAction) playAudio;
-(IBAction) stopAudio;
-(IBAction) adjustVolume;
-(IBAction) sliderChanged;
@end
Ici est la Audio1DetailViewController.m code:
#import "Audio1DetailViewController.h"
@implementation Audio1DetailViewController
@synthesize volumeControl, timerLabel, playbackTimer, progressBar, audioPlayer;
-(void)playAudio
{
playbackTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(updateTime)
userInfo:nil
repeats:YES];
[audioPlayer play];
}
-(void)stopAudio
{
[playbackTimer invalidate];
[audioPlayer stop];
}
-(void)adjustVolume
{
if (audioPlayer != nil)
{
audioPlayer.volume = volumeControl.value;
}
}
-(void)updateTime
{
float minutes = floor(audioPlayer.currentTime/60);
float seconds = audioPlayer.currentTime - (minutes * 60);
float duration_minutes = floor(audioPlayer.duration/60);
float duration_seconds =
audioPlayer.duration - (duration_minutes * 60);
NSString *timeInfoString = [[NSString alloc]
initWithFormat:@"%0.0f.%0.0f /%0.0f.%0.0f",
minutes, seconds,
duration_minutes, duration_seconds];
timerLabel.text = timeInfoString;
[timeInfoString release];
}
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"001Fatiha"
ofType:@"MP3"]];
NSError *error;
audioPlayer = [[AVAudioPlayer alloc]
initWithContentsOfURL:url
error:&error];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
if (error)
{
NSLog(@"Error in audioPlayer: %@",
[error localizedDescription]);
} else {
audioPlayer.delegate = self;
[audioPlayer prepareToPlay];
}
playbackTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self
selector:@selector(updateSlider) userInfo:nil repeats:YES];
progressBar.maximumValue = audioPlayer.duration;
//Set the valueChanged target
[progressBar addTarget:self action:@selector(sliderChanged:) forControlEvents:
UIControl EventValueChanged];
}
- (void)updateSlider {
//Update the slider about the music time
progressBar.value = audioPlayer.currentTime;
}
- (IBAction)sliderChanged:(UISlider *)sender {
//Fast skip the music when user scroll the UISlider
[audioPlayer stop];
[audioPlayer setCurrentTime:progressBar.value];
[audioPlayer prepareToPlay];
[audioPlayer play];
}
-(void)audioPlayerDidFinishPlaying:
(AVAudioPlayer *)player successfully:(BOOL)flag
{
}
-(void)audioPlayerDecodeErrorDidOccur:
(AVAudioPlayer *)player error:(NSError *)error
{
}
-(void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
{
}
-(void)audioPlayerEndInterruption:(AVAudioPlayer *)player
{
}
-(void)viewDidUnload {
audioPlayer = nil;
volumeControl = nil;
}
-(void)dealloc {
[audioPlayer release];
[volumeControl release];
[playbackTimer release];
[super dealloc];
}
@end
Ici est la AudioTableViewController.h
#import <UIKit/UIKit.h>
@class Audio1DetailViewController;
@interface AudioTableViewController : UITableViewController
<UITableViewDelegate,UITableViewDataSource>{
IBOutlet UITableView *audioTableView;
NSMutableArray *audioArray;
Audio1DetailViewController *audio1DetailViewController;
}
@property (nonatomic, retain) NSMutableArray *audioArray;
@property (nonatomic, retain) Audio1DetailViewController *audio1DetailViewController;
@end
Et la AudioTableViewController.m
#import "AudioTableViewController.h"
#import "Audio1DetailViewController.h"
#import "DEQAppDelegate.h"
@implementation AudioTableViewController
@synthesize audioArray;
@synthesize audio1DetailViewController;
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
//Custom initialization
{
return self;
}
- (void)didReceiveMemoryWarning
{
//Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
//Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad{
[super viewDidLoad];
self.title = NSLocalizedString(@"Audio", @"Audio");
self.audioArray = [[NSArray alloc] initWithObjects:
@"1. Het Begin", @"2. De Mensen", //etcetera
nil];
//Uncomment the following line to preserve selection between presentations.
self.clearsSelectionOnViewWillAppear = NO;
//Uncomment the following line to display an Edit button in the navigation bar for this
view controller.
//self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
- (void)viewDidUnload
{
[super viewDidUnload];
//Release any retained subviews of the main view.
self.audioArray = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
//Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
//Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
//Return the number of rows in the section.
return [self.audioArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:
UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier] autorelease];
}
//Configure the cell...
cell.textLabel.text = [self.audioArray objectAtIndex:[indexPath row]];
return cell;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Navigation logic may go here. Create and push another view controller.
NSUInteger row = indexPath.row;
if (row == 0)
{
Audio1DetailViewController *audio1DetailViewController =[[Audio1DetailViewController alloc]
initWithNibName:@"Audio1DetailViewController" bundle:nil];
audio1DetailViewController.title = @"Audio";
[self.navigationController pushViewController:audio1DetailViewController animated:YES];
[audio1DetailViewController release];
}
if (row == 1)
{
//etcetera
}
}
- (void)dealloc{
[audioArray release];
[super dealloc];
}
@end
OriginalL'auteur iHilas | 2011-11-23
Vous devez vous connecter pour publier un commentaire.
Je vous suggère de créer un acteur mondial de l'objet. Parce que maintenant, chaque fois que vous appuyez sur la manette de navigation vous en créer un nouveau. Cela signifie également que vous n'avez pas de toute référence à l'ancien joueur (et ne peut pas l'arrêter). Donc: déclarer le AVAudioPlayer une étape supérieur (dans le tableview). Maintenant, lorsque vous sélectionnez une ligne dans, l'attribuer à une propriété de ce nouveau point de vue (celui que vous avez mis en lien).
Vous travaillez avec le storyboard? Ensuite, vous avez à mettre en œuvre la méthode
prepareForSegue:
. Donner votre enchaîner sur le storyboard d'un identifiant (commeshowPlayer
et vérifier que avecif (segue.identifier isEqualToString:@"showPlayer")
).Maintenant dans votre
viewDidLoad
faire une vérification siaudioPlayer
est nul. Si vousEspère que cela vous aide.
Aussi: Ne pas poster des images de code. Il suffit d'insérer le code dans votre réponse ou la publier sur un site comme pastebin.com et le lien de cette page dans votre question. Cela rend plus facile pour les autres de réagir et de faire des suggestions sur comment modifier votre code.
En réponse à votre commentaire:
Pertinentes truc devrait être:
Dans AudioTableViewController.h:
Dans AudioTableViewController.m:
Audio1DetailViewController.m
Mh, ok. Sans regarder ton code je ne peux pas vraiment vous aider beaucoup. Pouvez-vous modifier votre question initiale et ajouter un peu de code (surtout que le code que vous avez déjà posté une image, mais cette fois en tant que texte s'il vous plaît 🙂 ). Oh, et encore une chose: je ne pense pas que vous ayez à changer à ce point. Tout reste le même, mais vous changez le "propriétaire" de votre audioPlayer pour que superview (dans le sens que ce contrôleur dispose d'un <code>strong</code> propriété). Lorsque vous traversez à nouveau contrôleur à la main, de la référence audioPlayer pour le nouveau contrôleur.
J'ai ajouté le code de l'
Toujours pas de succès. J'ai fait ce que vous m'avez dit, mais il continue à jouer 2 morceaux dans le même temps, la minuterie et le curseur également garder la réinitialisation d'eux-mêmes. Je ne peux pas le comprendre!
OriginalL'auteur David Langer
arrêter 2 chansons en même temps que vous devriez faire ceci:
pour obtenir de l'aide dans la lecture des données audio, vous pouvez utiliser apple exemple de code:
http://developer.apple.com/library/ios/#samplecode/avTouch/Introduction/Intro.html
OriginalL'auteur Hashem Aboonajmi
Étonnamment, les MPMoviePlayerController joue également un lecteur MP3 avec commandes!!!
OriginalL'auteur Vishal Shah