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! |
Ja hoor dat kan. Als je gewoon de bestandsnaam hebt kun je die met AVAudioPlayer afspelen.
|
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, |
iemand een idee?
Dit is wat ik nu heb; Code:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
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 { |
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 NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"mp3"]; Er is toch een mogelijkheid om mp3 met AVFoundation. |
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]; |
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 |
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.
|
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 { Mijn plist; Code:
<key>sound</key> |
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 { Code:
#import <UIKit/UIKit.h> Ik zie niet wat er mis gaat en wat ik over het hoofd heb gezien. Iemand een suggestie? oplossing? |
Iemand een idee? Ik ben er nog steeds niet uit...
|
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.
|
Citaat:
Verbeter mij als ik het verkeerd heb... ps. dit wordt helaas heel erg langdradig |
Citaat:
Citaat:
|
@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 |
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"]; Code:
-(void)viewWillAppear:(BOOL)animated { Groet, |
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> Code:
|
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 |
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.
|
Alle tijden zijn GMT +2. Het is nu 18:39. |