我在iOS 4.2 XCode项目的.mp3
文件夹中有一千个Resources
个文件。
现在我可以在我的.m
文件中使用以下代码从文件夹中选择一个文件(并播放它):(给定文件名“AFile.mp3”)
-(IBAction)playSound {
NSString *path = [[NSBundle mainBundle] pathForResource:@"AFile"ofType:@"mp3"];
AVAudioPLayer* theAudio =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
theAudio.delegate = self;
[theAudio play];
}
我希望能够让代码随机选择一个.mp3
,播放它,然后选择另一个文件并播放它们,直到它们至少播放一次。我假设我需要使用NSArray,但不确定如何处理。
我将代码更改为以下内容,并且在iOS模拟器中运行时没有出现任何错误。虽然我运行它时没有文件播放?当我启动应用程序时,它会退出,但不会在调试器中记录任何错误..
更新代码:
-(IBAction)playSound {
NSArray *array = [[NSBundle mainBundle] pathsForResourcesOfType:@".mp3" inDirectory:@"Resources"];
NSString *randomPath = [array objectAtIndex:arc4random() % [array count]];
AVAudioPlayer* theAudio =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: randomPath] error: NULL;
theAudio.delegate = self;
[theAudio play];
}
我如何设置1000个.mp3
文件的简单数组,并让方法随机播放?
答案 0 :(得分:3)
AVAudioPlayer* theAudio=[[AVAudioPlayer alloc]initWithContentsofURL: [NSURL arrayURLWithPath:array] error:NULL];
应该是:
AVAudioPlayer* theAudio=[[AVAudioPlayer alloc]initWithContentsofURL: [NSURL URLWithString:[array objectAtIndex:11]] error:NULL];
因此数字'11'是随机文件路径。要获得随机性,您可以使用:
int randomNumber = random()%1000; // random number between 0 and 1000
然后使用randomNumber
代替11
要播放每个文件只有一次你可以播放让我们说一次第四首歌曲,然后从你的阵列中删除这个项目。下次生成随机数时,请使用999而不是1000,依此类推,直到达到1。
//编辑:尝试以下:
-(IBAction)playSound {
NSArray *array = [[NSBundle mainBundle] pathsForResourcesOfType:@".mp3" inDirectory:@"Resources"];
int rndm = arc4random() % [array count];
if (rndm<0) rndm*=-1;
NSString *randomPath = [array objectAtIndex:rndm];
AVAudioPlayer* theAudio =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: randomPath] error: NULL;
theAudio.delegate = self;
[theAudio play];
}
答案 1 :(得分:3)
使用此代码段。来自a previous SO answer
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager] directoryContentsAtPath:bundleRoot];
NSArray *onlyJPGs = [dirContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.jpg'"]];
然后获取数组计数..并使用随机获取随机整数和文件。
答案 2 :(得分:1)
好吧,如果您已经有一个对要从中检索随机元素的数组的引用,那么它很简单:
NSString *randomPath = [array objectAtIndex:arc4random_uniform([array count])];
答案 3 :(得分:1)
在查看苹果文档后,这是错误的。不知怎的,即使我们指定一个自定义目录,它似乎只是供参考。我发现的另一个错误是我们只需要指定没有“。”的扩展名。
NSArray * audioPathArray = [[NSBundle mainBundle] pathsForResourcesOfType:@“mp3”inDirectory:nil];
NSLog(@"%d",[audioPathArray count]);
NSString *path = [audioPathArray objectAtIndex:arc4random() % [audioPathArray count]];
NSURL *randomPath = [[NSURL alloc]initFileURLWithPath:path];
AVAudioPlayer *theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:randomPath error:NULL];
[theAudio play];
这对我有用。希望它可以帮助你。
答案 4 :(得分:0)
了解我的项目
将Resources文件夹导入项目时,选择“为任何添加的文件夹创建文件夹引用”。这实际上将维护[NSBundle mainBundle]中的目录结构。
然后您可以像这样拉出内容:
NSString * bundlePath = [NSBundle mainBundle] bundlePath];
NSString * resourceFolderPath = [NSString stringWithFormat:@"%@/Resources", bundlePath];
NSArray * resourceFiles = [[NSFileManager defaultManager] directoryContentsAtPath:resourceFolderPath error:nil];
resourceFiles应该包含Resources目录的内容列表。
NSInteger randomFileIndex = arc4random() % [resourceFiles count];
NSString * randomFile = [resourceFiles objectAtIndex:randomFileIndex];