0

每当我播放像下面这样的音频文件时,开始播放音频需要几秒钟。我从一些论坛上看到并理解,如果我们在其中分配对象,AVAudioPlayer 将需要几秒钟才能开始播放。我想在我想玩之前更早地分配这个对象(可能是 Appdelegate 本身),这样当我想玩它时,它会立即播放。

NSURL *audioPathURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:audioName ofType:@"wav"]];

audioP = [[AVAudioPlayer alloc]initWithContentsOfURL:audioPathURL error:NULL];
[appDelegate.audioP play];

但是,我在运行时动态传递音频 url,所以我想知道如何更早地分配对象,然后能够稍后传递动态音频 url 路径?

请注意,我的问题与第一次播放声音时 AVAudioPlayer 的慢启动 在现有问题中,他们正在讲述一个音频文件并在需要时播放它。但是,我有许多不同的音频文件,并且 url 路径是在运行时随机生成的,所以我不知道要设置和播放的实际 url 路径是什么。所以,这里提到的答案->第一次播放声音时 AVAudioPlayer 的慢启动 对我的问题没有帮助。我不能使用prepareToPlay,因为音频路径url是在运行时设置的,而不是一直使用一个音频来播放,会随机选择20多个音频文件并设置一次播放一个。所以,我需要正确的答案,这不是一个重复的问题。

谢谢!

4

2 回答 2

0

为了减少第一次加载+播放的延迟,您可以做的一件事是在您需要它之前通过加载和播放虚拟文件来“启动”底层音频系统。例如,在application:didFinishLaunchingWithOptions:添加一些这样的代码:

// this won't effect the problem you're seeing, but it's good practice to explicitly
// set your app's audio session category
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
NSURL *audioURL = [[NSBundle mainBundle] URLForResource:@"dummy.wav" withExtension:nil];
AVAudioPlayer *dplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:nil];
// we don't want to hear it (alternatively, the audiofile you use for this purpose can be silence.)
dplayer.volume = 0.f;
[dplayer prepareToPlay];
[dplayer play];
[dplayer stop];

这段代码完成后,实例的后续实例化和回放AVAudioPlayer应该具有相当低的延迟(当然远低于 1 秒)

于 2013-08-04T19:05:27.590 回答
0

对于此处的单个文件,解决方案:

在你的file.h

#import <AVFoundation/AVFoundation.h>

@interface AudioPlayer : UIViewController <AVAudioPlayerDelegate> {


}

要与按钮一起使用,- (IBAction)Sound:(id)sender;请在您的file.h

现在在你的file.m

//这是一个动作,但您可以在 void 内使用来启动自动

@implementation AudioPlayer {

    SystemSoundID soundID;
}

- (IBAction)Sound:(id)sender {

    AudioServicesDisposeSystemSoundID(soundID);
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;

//you can use here extension .mp3 / .wav / .aif / .ogg / .caf / and more

    soundFileURLRef =  CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"sound" ,CFSTR ("mp3") , NULL);
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);

}

如果你想使用你的代码从 URL 播放音频,你可以使用这个:

#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>

@interface AudioPlayer : UIViewController <AVAudioPlayerDelegate> {

AVPlayer *mySound;

}

@property (strong, nonatomic) AVPlayer *mySound;
@end

file.m

- (IBAction)playPause:(id)sender {

 if (mySound.rate == 0){

    NSURL *url = [NSURL URLWithString:@"http://link.mp3"];
    mySound = [[AVPlayer alloc] initWithURL:url];
    [mySound setAllowsExternalPlayback:YES];
    [mySound setUsesExternalPlaybackWhileExternalScreenIsActive: YES];
    [mySound play];

} else {

[mySound pause];

}

}

希望这可以帮到你!

于 2013-08-02T12:49:29.343 回答