Audio/sound .plist cellforrow discussie in Ontwikkelen voor iOS forum; ( verdwijnt na registratie ) Beste, Ik weet niet of er een mogelijkheid is om een audio/sound van welk bestand dan ook (mp3, wav, etc.) af te spelen uit een ...
|
Registreer | FAQ | Ledenlijst | Kalender | Berichten van vandaag | Zoeken |
#1
|
|||
|
|||
Audio/sound .plist cellforrow
Beste,
Ik weet niet of er een mogelijkheid is om een audio/sound van welk bestand dan ook (mp3, wav, etc.) af te spelen uit een .plist file in combinatie met een geselecteerde Row. v.b. <key>name<key> <string>Eddie<string> <key>sound<key> <string>eddie.mp3<string> Ik gebruik een tableview om de namen te tonen uit een .plist, bij een selectie van een van de namen gaat het naar een detailview met daarbij extra info. Op de achtergrond zou die een sound/audio moeten afspelen die bij die naam hoort. Ik wil graag weten of dit daadwerkelijk kan, heb op internet gekeken maar dat levert tot nu toe niks op. p.s. Het lukt mij wel om foto's te tonen met hetzelfde voorbeeld. groeten! |
|
|
Gesponsorde links (verdwijnt na registratie)
|
#2
|
|||
|
|||
Ja hoor dat kan. Als je gewoon de bestandsnaam hebt kun je die met AVAudioPlayer afspelen.
__________________
Software Engineer iPhone Developer |
#3
|
|||
|
|||
Hoe kan je dat combineren met een .plist file waar de audio file staat 'geregistreerd'. Ik heb hier naar gekeken maar het lijkt net of ik afdwaal.
Wat het ongeveer zou moeten doen is met: .plist audio file tableview Bij het klikken op een cell, dus didselectrow en er wordt genavigeerd naar de detailview pagina. Hierin moet er bij het geselecteerde de audio op de 'achtergrond' afspelen. Ik weet dat je met AVAudio aanstuurt om audio files af te spelen. Dit lukt mij met code en een audio bestand die ik op een normale manier afspeel zonder plist. Het is mij niet gelukt om door de gekozen cell een audio file af te laten spelen door middel van een plist. Komt dit bekend voor? Kan iemand mij ondersteunen? mvg, |
#4
|
|||
|
|||
iemand een idee?
Dit is wat ik nu heb; Code:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { DetailViewController *detailController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]]; [self.navigationController pushViewController:detailController animated:YES]; detailController.titel.text = [[names objectAtIndex:indexPath.row] objectForKey:@"name"]; detailController.omschrijving.text = [[names objectAtIndex:indexPath.row] objectForKey:@"description"]; detailController.title = [[names objectAtIndex:indexPath.row] objectForKey:@"name"]; NSString *filename = [[names objectAtIndex:indexPath.row] objectForKey:@"sound"]; NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"wav"]; AVAudioPlayer * newAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; theAudio = newAudio; // automatically retain audio and dealloc old file if new file is loaded [newAudio release]; // release the audio safely theAudio.delegate = self; [theAudio prepareToPlay]; [theAudio setNumberOfLoops:0]; [theAudio play]; [detailController release]; } |
#5
|
|||
|
|||
Check of alle waarden kloppen die je gebruikt (bijv. de variabelen "file" en "path" NSLog'gen). Verder is de code die je gaf nogal slordig, hier een verbetering:
Code:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //Eerst het audio bestand starten of eerst de nieuwe viewcontroller pushen maakt niet veel uit //Zorg alsjeblieft eerst ervoor dat de property's van detailController geset worden, voordat hij gepusht wordt DetailViewController *detailController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]]; detailController.titel.text = [[names objectAtIndex:indexPath.row] objectForKey:@"name"]; detailController.omschrijving.text = [[names objectAtIndex:indexPath.row] objectForKey:@"description"]; detailController.title = [[names objectAtIndex:indexPath.row] objectForKey:@"name"]; [self.navigationController pushViewController:detailController animated:YES]; [detailController release]; NSString *filename = [[names objectAtIndex:indexPath.row] objectForKey:@"sound"]; NSLog(@"Filename equals: %@", filename); NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"wav"]; NSLog(@"Path equals: %@", path); //Check of de NSLog outputs kloppen!!!! NSError *error = nil; AVAudioPlayer * newAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error]; if(error){ NSLog(@"Error occurred while preparing AVAudioPlayer instance:%@", [error userInfo]"); } theAudio = newAudio; // automatically retain audio and dealloc old file if new file is loaded [newAudio release]; // release the audio safely theAudio.delegate = self; [theAudio prepareToPlay]; [theAudio setNumberOfLoops:0]; [theAudio play]; } |
#6
|
|||
|
|||
Citaat:
Kan je mij vertellen waarom het nodig is om er eerst voor te zorgen dat het eerst geest wordt vervolgens gepusht? Ik wist hier namelijk niet van af. Ik heb vervolgens de code geïmplementeerd in mijn huidige. Heb even de variabelen afgestemd en geprobeerd. De volgende foutmelding komt aan de orde; Code:
2011-09-25 17:00:00.462 Ilahi[9480:c203] Filename equals: Ma.mp3 2011-09-25 17:00:00.464 Ilahi[9480:c203] Path equals: (null) 2011-09-25 17:00:00.472 Ilahi[9480:c203] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter' *** Call stack at first throw: ( 0 CoreFoundation 0x00ef85a9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x0104c313 objc_exception_throw + 44 2 CoreFoundation 0x00eb0ef8 +[NSException raise:format:arguments:] + 136 3 CoreFoundation 0x00eb0e6a +[NSException raise:format:] + 58 4 Foundation 0x008eeab6 -[NSURL(NSURL) initFileURLWithPath:] + 90 5 Foundation 0x008eea44 +[NSURL(NSURL) fileURLWithPath:] + 72 6 Ilahi 0x00003283 -[RootViewController tableView:didSelectRowAtIndexPath:] + 1283 7 UIKit 0x001c1b68 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1140 8 UIKit 0x001b7b05 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 219 9 Foundation 0x008d179e __NSFireDelayedPerform + 441 10 CoreFoundation 0x00ed98c3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19 11 CoreFoundation 0x00edae74 __CFRunLoopDoTimer + 1220 12 CoreFoundation 0x00e372c9 __CFRunLoopRun + 1817 13 CoreFoundation 0x00e36840 CFRunLoopRunSpecific + 208 14 CoreFoundation 0x00e36761 CFRunLoopRunInMode + 97 15 GraphicsServices 0x02cb31c4 GSEventRunModal + 217 16 GraphicsServices 0x02cb3289 GSEventRun + 115 17 UIKit 0x00158c93 UIApplicationMain + 1160 18 Ilahi 0x00002139 main + 121 19 Ilahi 0x000020b5 start + 53 20 ??? 0x00000001 0x0 + 1 ) terminate called throwing an exception NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"mp3"]; Er is toch een mogelijkheid om mp3 met AVFoundation. Laatst gewijzigd door gobelz; 25-09-11 om 18:17. |
#7
|
|||
|
|||
Citaat:
De error vertelt ons dat er gezocht wordt naar een file, maar dat deze niet is gevonden. Dat komt omdat je filepath variabele onjuist is. In je code zoek je namelijk naar het bestand "Ma.mp3.wav" (dubbele extensie doordat de variabele filename de extensie ook bevat). Zorg dat je dat in orde hebt, dus check hoe je bestand heet (Ma.mp3 of Ma.wav) en zorg dat filename alleen de naam van het bestand bevat zonder de extensie. Overigens kun je dat probleem met dubbele extensie ook oplossen door de volgende code te gebruiken, maar dan moet je zeker weten dat het bestand een wav extensie heeft: Code:
fileName = [fileName stringByDeletingPathExtension]; |
#8
|
|||
|
|||
Exact! Gedaan wat er gevraagd wordt. In mijn .plist heb ik de filename gewijzigd in <>Ma<> zonder de extensie .mp3
Vervolgens bij de simulator krijg ik te maken met een vastloper zonder enige reden volgens mij, zie; Code:
2011-09-25 22:12:42.905 Ilahi[9787:c203] Filename equals: Ma 2011-09-25 22:12:42.907 Ilahi[9787:c203] Path equals: /Users/LionJack/Library/Application Support/iPhone Simulator/4.3.2/Applications/B7A53018-8B05-4933-82AB-1CD933A358B2/Ilahi.app/Ma.mp3 |
#9
|
|||
|
|||
Die meldingen uit de console die je hier post zijn niet zomaar geproduceerd door de debugger, maar die had ik er in je code bijgezet (google maar op de NSLog functie). Vreemd dat de console geen details geeft over de crash. Doorloop zelf nog even je didSelectRowAtIndexPath functie en check of je nergens fouten maakt in memory management e.d. Anders vrees ik dat je je hele didSelectRowAtIndexPath functie hier moet posten, zonder dingen weg te laten.
|
#10
|
|||
|
|||
Citaat:
Ik ben nu de didselectrow aan het doornemen inderdaad, ik post morgen wat in de discussie. Als je kijkt; Code:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //Eerst het audio bestand starten of eerst de nieuwe viewcontroller pushen maakt niet veel uit //Zorg alsjeblieft eerst ervoor dat de property's van detailController geset worden, voordat hij gepusht wordt DetailViewController *detailController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]]; detailController.titel.text = [[names objectAtIndex:indexPath.row] objectForKey:@"name"]; detailController.omschrijving.text = [[names objectAtIndex:indexPath.row] objectForKey:@"description"]; detailController.title = [[names objectAtIndex:indexPath.row] objectForKey:@"name"]; [self.navigationController pushViewController:detailController animated:YES]; [detailController release]; NSString *filename = [[names objectAtIndex:indexPath.row] objectForKey:@"sound"]; NSLog(@"Filename equals: %@", filename); NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"mp3"]; NSLog(@"Path equals: %@", path); //Check of de NSLog outputs kloppen!!!! NSError *error = nil; AVAudioPlayer *newAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error]; if(error){ NSLog(@"Error occurred while preparing AVAudioPlayer instance:%@", [error userInfo]); } theAudio = newAudio; // automatically retain audio and dealloc old file if new file is loaded [newAudio release]; // release the audio safely theAudio.delegate = self; [theAudio prepareToPlay]; [theAudio setNumberOfLoops:0]; [theAudio play]; } Mijn plist; Code:
<key>sound</key> <string>Ma</string> |
#11
|
|||
|
|||
Heb er nog even naar gekeken maar kom er niet uit. Ik vul het even aan met code hoe ik mijn .plist ophaal.
Code:
- (void)viewDidLoad { NSString *path = [[NSBundle mainBundle] pathForResource:@"Ila" ofType:@"plist"]; NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:path]; self.names = tmpArray; [tmpArray release]; Code:
#import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @interface RootViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate, AVAudioPlayerDelegate> { NSArray *names; AVAudioPlayer *theAudio; } @property (nonatomic, retain) NSArray *names; Ik zie niet wat er mis gaat en wat ik over het hoofd heb gezien. Iemand een suggestie? oplossing? |
#12
|
|||
|
|||
Iemand een idee? Ik ben er nog steeds niet uit...
|
#13
|
|||
|
|||
De variabelen "theAudio" en "names" worden nergens gealloceerd en geinitieerd. Doe dit eerst eens direct na "[super viewDidLoad]" in je viewDidLoad method. ([super viewDidLoad] dient de eerste regel code in je viewDidLoad method te zijn). Die hele tmpArray kun je trouwens weglaten, gebruik daarvoor gewoon direct de names array.
|
#14
|
|||
|
|||
Citaat:
Verbeter mij als ik het verkeerd heb... ps. dit wordt helaas heel erg langdradig |
#15
|
|||
|
|||
Citaat:
Neen (zelfde verhaal), je alloceert en initieert "tmpArray" wel, maar "names" niet.. |
#16
|
|||
|
|||
@DJ14: Bij names gaat het wel goed omdat hij de setter gebruikt doormiddel van self.names.
@gobelz: Ik zou theAudio ook een property maken van je RootViewController, zodat je makkelijk de getter en setter method kan synthesizen in de .m file. Vergeet dit dus niet. Voor names zou je hetzelfde gedaan moeten hebben. Als je vervolgens de setter gebruikt om newAudio aan theAudio toe te wijzen is de code correct. Dus: Code:
self.theAudio = newAudio; Code:
[self setTheAudio:newAudio]; Code:
theAudio = newAudio; // automatically retain audio and dealloc old file if new file is loaded [newAudio release]; // release the audio safely theAudio.delegate = self; [theAudio prepareToPlay]; [theAudio setNumberOfLoops:0]; [theAudio play]; Laatst gewijzigd door JornZ; 30-09-11 om 15:57. |
#17
|
|||
|
|||
Bedankt voor de hulp, DJ14.
Heb het voor nu opgelost. Misschien kan ik de code nog optimaliseren maar voor nu doet ie wat ik wil. Zie; Code:
NSString *filename = [[nameSection objectAtIndex:row] objectForKey:@"sound"]; NSLog(@"Filename equals: %@", filename); NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"mp3"]; NSLog(@"Path equals: %@", path); //Check of de NSLog outputs kloppen!!!! NSError *error; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error]; audioPlayer.delegate = self; [audioPlayer prepareToPlay]; [audioPlayer setNumberOfLoops:0]; [audioPlayer play]; Code:
-(void)viewWillAppear:(BOOL)animated { [audioPlayer stop]; } Groet, |
#18
|
|||
|
|||
Ik kan natuurlijk niet je volledige code zien, maar ik denk dat je hier wel een memory leak hebt gemaakt. Tenzij je nog ergens audioPlayer released voordat er een volgende keer de didselectrow method wordt gebruikt?
Ik zal even kort uitleggen waarom; Zo te zien is audioPlayer een instance variabele of misschien zelfs een property van je RootViewController (waarin de tableview staat). Omdat je geen setter method gebruikt voor audioPlayer maar directe toewijzing middels: Code:
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error]; Voor dit stukje code raad ik je aan om van audioPlayer dus een property te maken en vervolgens de setter method te gebruiken in didselectrow. Code:
#import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @interface RootViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate, AVAudioPlayerDelegate> { NSArray *names; AVAudioPlayer *audioPlayer; } @property (nonatomic, retain) NSArray *names; @property (nonatomic, retain) AVAudioPlayer *audioPlayer; Code:
synthesize audioPlayer; ... ... NSString *filename = [[nameSection objectAtIndex:row] objectForKey:@"sound"]; NSLog(@"Filename equals: %@", filename); NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"mp3"]; NSLog(@"Path equals: %@", path); //Check of de NSLog outputs kloppen!!!! NSError *error; AVAudioPlayer *newAVAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error]; [self setAudioPlayer:newAVAudioPlayer]; [newAVAudioPlayer release]; audioPlayer.delegate = self; [audioPlayer prepareToPlay]; [audioPlayer setNumberOfLoops:0]; [audioPlayer play]; |
#19
|
|||
|
|||
Citaat:
Ik gebruik nu de extensie .mp3 in mijn project maar dit is gemiddeld een bestand van 3,5mb. Welk ander extensie kan ik het best gebruiken voor het afspelen van audio? En uiteraard de huidige grootte van een bestand reduceren |
#20
|
|||
|
|||
Volgens mij is mp3 wel de beste optie die je hebt. Voor zover ik weet is de iPhone/iPad/iPod hardware ook geoptimaliseerd voor dit formaat. De bestandsgrootte is te beïnvloeden doormiddel van de bitrate van je MP3's, kies je een lagere bitrate of VBR (variabele bitrate, afhankelijk van de dynamiek van de muziek worden er meer of minder bits gebruikt) dan zal je bestand kleiner worden maar mogelijk de kwaliteit van het geluid afnemen.
|
Er zijn 1 actieve gebruikers die momenteel deze discussie bekijken (0 leden en 1 gasten) |
|
Soortgelijke discussies |
||||
Discussie | Auteur | Forum | Reacties | Laatste bericht |
.plist trillen 3.0 | thomas89 | iPhone algemeen | 2 | 25-11-09 11:10 |
Tables vs. plist | JVdV | Ontwikkelen voor iOS | 7 | 22-07-09 21:45 |
gezocht nl.plist & en.plist | Semmm | Jailbreak apps en thema's | 3 | 09-04-09 15:41 |
Windows: .Plist | daanhegman | Desktop-applicaties | 3 | 01-04-08 21:15 |
|
|