web-dev-qa-db-ja.com

iOSで短いサウンドを再生する

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

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

58
Besi

他の回答のすべてがメモリをリークします(ARCが回答のoneで有効になっていない限り)...明確な理由なしにretainCountを呼び出します。

_alloc/init_何かをした場合、それをリリースする必要があります(ARCを使用している場合を除く)。

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

Audio UI Sounds の例を参照してください。

基本的に:

_@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>_

88
bbum

短いサウンドクリップ(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];
}
43
Himanshu Singh

Swift

ここの他の答えはObjective-Cを使用しているので、Swiftバージョンをここに提供しています。SwiftはAutomatic Reference Counting(ARC)を使用しているので、この回答でのメモリリークの問題(受け入れられた回答で警告されているように)。

AudioToolboxを使用する

AudioToolboxフレームワークを使用して、短いサウンドを再生する方法をあまり制御する必要がないときに、短いサウンドを再生できます。

設定方法は次のとおりです。

import UIKit
import AudioToolbox

class PlaySoundViewController: UIViewController {

    var soundURL: NSURL?
    var soundID: SystemSoundID = 0

    @IBAction func playSoundButtonTapped(sender: AnyObject) {

        let filePath = NSBundle.mainBundle().pathForResource("yourAudioFileName", ofType: "mp3")
        soundURL = NSURL(fileURLWithPath: filePath!)
        if let url = soundURL {
            AudioServicesCreateSystemSoundID(url, &soundID)
            AudioServicesPlaySystemSound(soundID)
        }
    }
}

ノート:

  • この例は SwiftでAudioToolboxを使用して短いサウンドクリップを再生する方法 から採用されています。
  • yourAudioFileName.mp3(または.wavなど)をプロジェクトに忘れずに追加してください。
  • import AudioToolboxを忘れないでください
  • この回答により、コードはIBActionボタンタップに配置されますが、もちろん別の機能に簡単に配置できます。

AVAudioPlayerを使用する

AVFoundationフレームワークをインポートすることにより、AVAudioPlayerを使用できます。短いオーディオクリップと長い曲の両方で機能します。また、AudioToolboxメソッドを使用した場合よりも、再生をより細かく制御できます。

設定方法は次のとおりです。

import UIKit
import AVFoundation

class PlaySoundViewController: UIViewController {

    var mySound: AVAudioPlayer?

    // a button that plays a sound
    @IBAction func playSoundButtonTapped(sender: AnyObject) {
        mySound?.play() // ignored if nil
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // initialize the sound
        if let sound = self.setupAudioPlayerWithFile("yourAudioFileName", type: "mp3") {
            self.mySound = sound
        }
    }

    func setupAudioPlayerWithFile(file: NSString, type: NSString) -> AVAudioPlayer? {

        let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
        let url = NSURL.fileURLWithPath(path!)
        var audioPlayer: AVAudioPlayer?
        do {
            try audioPlayer = AVAudioPlayer(contentsOfURL: url)
        } catch {
            print("Player not available")
        }

        return audioPlayer
    }
}

ノート:

23
Suragch

最近、私はこのコードを使って短い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
17
Arshad Parwez

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

#import <AudioToolbox/AudioServices.h> 

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

お役に立てれば。

9
Schulze Thomas

シンプルクリーンSwift 3バージョン

私はサウンドをより細かく制御したいので、AVFoundationを使用しています。

import AVFoundation

class TodayViewController: UIViewController {

  var clink: AVAudioPlayer?
  var shatter: AVAudioPlayer?

  override func viewDidLoad() {
    super.viewDidLoad()

    // initialize the sound
    shatter = setupAudioPlayer(withFile: "shatter", type: "wav")
    clink = setupAudioPlayer(withFile: "clink", type: "wav")
  }

  func setupAudioPlayer(withFile file: String, type: String) -> AVAudioPlayer? {
    let path = Bundle.main.path(forResource: file, ofType: type)
    let url = NSURL.fileURL(withPath: path!)
    return try? AVAudioPlayer(contentsOf: url)
  }

  func onClick() {
    clink?.play()
  }
}

サウンドファイルがプロジェクトに追加され、AVFoundationをインポートしていることを確認してください。

6
Rob Norback

私の答えはビルの答えですが、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);
}
4
Conor

Swift 4を使用

import AudioToolbox

func playSoundEasy(note : String) {
    var soundURL: NSURL?
    var soundID: SystemSoundID = 0

    let filePath = Bundle.main.path(forResource: note, ofType: "wav")
    soundURL = NSURL(fileURLWithPath: filePath!)
    if let url = soundURL {
        AudioServicesCreateSystemSoundID(url, &soundID)
        AudioServicesPlaySystemSound(soundID)
    }
}
2
VictorSimplify

コピーしてアプリで使用できる簡単な方法を以下に示します。

-(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で何もしなかったので、好きなら...

2
Andres Canella

多くの答えは混乱を招き、一部はAudioToolboxフレームワークとは異なるAVAudioFoundationフレームワークを使用しています...ここに私がしたことを示します。 _.h_ファイルで、次のコードを配置します。

@property (nonatomic, retain) AVAudioPlayer *player;

このコードは、「player」という名前のオーディオプレーヤーを宣言しています。 _.m_ファイルの_@implementation_宣言の下で、_@synthesize player_を追加します。これにより、そのplayerプロパティが合成されます。

必要な関数で、次のコード行を追加して、サウンドをプレーヤーに結び付けます。yourSoundはサウンドファイルの名前で、aifはファイル拡張子です。

_player = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"yourSound" withExtension:@"aif"] error:nil]_

Appleドキュメンテーションは、文字列とNSURLを宣言するように言っていますが、1行に結合する場合は、後で破棄する必要はありません。また、これは_ViewController.m_ファイルのプロパティを使用すると、そのplayerオブジェクトを設定してサウンドに関連付ける必要がなくなります。

他の回答にはSystemSoundIDの使用も含まれていましたが、「ファイルの長さは30秒を超えることはできません」、「特定の形式である必要があります」などの制限もあります。これにより、一度に複数のサウンドを再生でき(サウンドボードを開発している場合)、サウンドを簡単に作成できます。

実際にサウンドを再生するには、次の行を挿入します(そう、本当に簡単です)。

_[player play]_

ARCを使用している場合、システムが自動的に処理するため、プレーヤーを手動で廃棄することはできません。開発が初めてでXcodeの最新バージョンを使用している場合は、ARCが有効になっています。何らかの奇妙な理由でそうしない場合、playerによって使用されているリソースを破棄するためのコードは次のとおりです。

_[player release]_

1
DDPWNAGE

から サウンドはデバイスでのみ動作し、シミュレータでは動作しません

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

nicklockwood/SoundManager を参照してください

0
Besi

シンプルな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);
}
0
lmnbeyond