61

サウンドを再生するために使用できると思いますAVAudioPlayerが、必要なのは短いサウンドを再生することだけであり、ループやボリュームなどのきめ細かい制御は必要ありません。

これを行う簡単な方法はありますか?

4

13 に答える 13

88

他の回答のすべてがメモリをリークします (回答の1 つでARC が有効になっている場合を除きます)...奇妙なことに、最初に正しいとマークされた回答には、retainCount明らかな理由もなく への呼び出しがあります。

何かあればalloc/init、リリースする必要があります (ARC を使用していない場合)。

呼び出すAudioServicesCreateSystemSoundID()場合は、結果のサウンドを破棄する必要があります。

オーディオ UI サウンドの例を参照してください。

基本的:

@interface MyClass:UI*ViewController // fixed
{
     SystemSoundID mySound;
}
@implementation MyClass
- (void) viewDidLoad {
    [super viewDidLoad];
    AudioServicesCreateSystemSoundID(.... URL ...., &mySound);
}

- (void) playMySoundLikeRightNowReally {
    AudioServicesPlaySystemSound(mySound);
}

- (void) dealloc {
   AudioServicesDisposeSystemSoundID(mySound);
   [super dealloc]; // only in manual retain/release, delete for ARC
}
@end

完全を期すために:
AudioToolbox.framework を追加します。
#import <AudioToolbox/AudioToolbox.h>

于 2012-04-26T15:53:38.377 に答える
43

短いサウンド クリップ (30 秒未満) の場合は、本当に便利な SystemSounds ライブラリがあります。

長所: 音量設定を個別に管理する必要はありません。サウンドは別のスレッドで再生され、オーディオ クリップの読み込みと再生は非常に高速です。つまり、このクリップを別のシステム サウンドとして扱います。

短所: 個別のオーディオ コントロール設定を提供することはできません。これは、システム サウンドの設定に関連付けられています。30 秒を超えてプレイすることはできません。おそらく、オーディオ効果を高めるためにサウンド フィルタを適用することはできません。

確かにもっと長所と短所がありますが、これらは私が頭の中で考えることができるものです.

このインポートを使用します: <AudioToolbox/AudioToolbox.h> AudioToolbox フレームワークを追加し、[self playSound] のような以下のメソッドを、クリップを再生したい場所で呼び出します。

-(void) playSound {
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"changeTrack" ofType:@"aif"];
    SystemSoundID soundID;
    AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID);
    AudioServicesPlaySystemSound (soundID);
    [soundPath release];
}
于 2012-04-26T08:09:11.960 に答える
17

最近、このコードを使用して短い mp3 オーディオを再生しましたが、問題なく動作しました:-

これを @implementation の下で宣言します

NSString *path;

NSURL *url;

//where you are about to add sound 

path =[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"quotes_%d",soundTags] ofType:@"mp3"];

    url = [NSURL fileURLWithPath:path];
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
    [player setVolume:1.0];
    [player play];

//just add AVFoundation framework
于 2012-04-26T12:19:19.367 に答える
9

このコードを使用して、iOS で短い aiff サウンドを再生しました

#import <AudioToolbox/AudioServices.h> 

SystemSoundID completeSound;
NSURL *audioPath = [[NSBundle mainBundle] URLForResource:@"downloadCompleted" withExtension:@"aiff"];
AudioServicesCreateSystemSoundID((CFURLRef)audioPath, &completeSound);
AudioServicesPlaySystemSound (completeSound);

お役に立てれば。

于 2012-04-26T08:06:45.300 に答える
5

私の答えはビルの答えですが、init または dealloc なしで使用し、再生後にサウンドを解放します。

- (void)playSound:(NSURL *)url
    SystemSoundID ssID = 0;
    AudioServicesCreateSystemSoundID((CFURLRef)url, &ssID);
    AudioServicesAddSystemSoundCompletion(ssID, NULL, NULL, (AudioServicesSystemSoundCompletionProc)MyAudioServicesSystemSoundCompletionProc, NULL);
    AudioServicesPlaySystemSound(ssID);
    //AudioServicesDisposeSystemSoundID(ssID);
}

void MyAudioServicesSystemSoundCompletionProc (SystemSoundID  ssID, void *clientData) {
    AudioServicesDisposeSystemSoundID(ssID);
}
于 2014-02-28T16:16:45.640 に答える
2

コピーしてアプリで使用できる簡単なクリーンな方法は次のとおりです。

-(BOOL) playSoundFXnamed: (NSString*) vSFXName Loop: (BOOL) vLoop
{
    NSError *error;

    NSBundle* bundle = [NSBundle mainBundle];

    NSString* bundleDirectory = (NSString*)[bundle bundlePath];

    NSURL *url = [NSURL fileURLWithPath:[bundleDirectory stringByAppendingPathComponent:vSFXName]];

    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];

    if(vLoop)
        audioPlayer.numberOfLoops = -1;
    else
        audioPlayer.numberOfLoops = 0;

    BOOL success = YES;

    if (audioPlayer == nil)
    {
        success = NO;
    }
    else
    {
        success = [audioPlayer play];
    }
    return success;
}

次に、ちょうど使用するには:

[self playSoundFXnamed:@"someAudio.mp3" Loop: NO];

あなたがループするつもりなら、あなたAVAudioPlayer *audioPlayerは音を止めることができるようにあなたをあなたのクラスに連れて行く必要があります..あなたがただ短い音が欲しいならあなたはそれをしません。

ARCを使用してください...そして私はNSErrorで何もしなかったので、もし好きならそれを使ってください...

于 2013-01-17T00:16:52.273 に答える
0

From Sound はデバイスでのみ機能し、シミュレーターでは機能しません

Nickは、iOS および Mac アプリでサウンドを再生するために使用できるライブラリを作成しました。

nicklockwood/SoundManagerを参照

于 2013-09-09T12:29:32.407 に答える
0

シンプルな iOS オーディオ再生を参照してください。

- (void)playSound
{
    SystemSoundID soundId;

//    NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"sample"
//                                              withExtension:@"caf"];
//    AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &soundId);

    NSString *path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"mp3"];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &soundId);
    AudioServicesAddSystemSoundCompletion(soundId,
                                      NULL,
                                      NULL,
                                      systemAudioCallback,
                                      NULL);
    AudioServicesPlaySystemSound(soundId);
    //AudioServicesPlayAlertSound(soundId);
}

- (void) systemAudioCallback(SystemSoundID soundId, void *clientData)
{
    AudioServicesRemoveSystemSoundCompletion(soundId);
    AudioServicesDisposeSystemSoundID(soundId);
}
于 2015-07-14T06:35:03.760 に答える
-1

短いオーディオ ファイルを再生するには、systemsound をチェックアウトします

audiotoolbox フレームワークを含める

そして作成する

systemsoundid オブジェクト

NSString *soundPath =  [[NSBundle mainBundle] pathForResource:file ofType:@"aiff"];
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID);
AudioServicesPlaySystemSound (soundID);
于 2012-04-26T08:11:18.137 に答える