AVAudioPlayer
を使用してサウンドを再生できると思いますが、必要なのは単に短いサウンドを再生することだけで、ループやボリュームのきめ細かい制御などは必要ありません。
これを行う簡単な方法はありますか?
他の回答のすべてがメモリをリークします(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>
_
短いサウンドクリップ(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];
}
ここの他の答えはObjective-Cを使用しているので、Swiftバージョンをここに提供しています。SwiftはAutomatic Reference Counting(ARC)を使用しているので、この回答でのメモリリークの問題(受け入れられた回答で警告されているように)。
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)
}
}
}
ノート:
yourAudioFileName.mp3
(または.wav
など)をプロジェクトに忘れずに追加してください。import AudioToolbox
を忘れないでください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
}
}
ノート:
import AVFoundtation
を忘れずに、yourAudioFileName.mp3
をプロジェクトに追加してください。最近、私はこのコードを使って短い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
このコードを使用して、iOSで短いaiffサウンドを再生しました
#import <AudioToolbox/AudioServices.h>
SystemSoundID completeSound;
NSURL *audioPath = [[NSBundle mainBundle] URLForResource:@"downloadCompleted" withExtension:@"aiff"];
AudioServicesCreateSystemSoundID((CFURLRef)audioPath, &completeSound);
AudioServicesPlaySystemSound (completeSound);
お役に立てれば。
シンプルクリーン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をインポートしていることを確認してください。
私の答えはビルの答えですが、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);
}
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)
}
}
コピーしてアプリで使用できる簡単な方法を以下に示します。
-(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で何もしなかったので、好きなら...
多くの答えは混乱を招き、一部は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]
_
から サウンドはデバイスでのみ動作し、シミュレータでは動作しません
Nick iOSおよびMacアプリでサウンドを再生するために使用できるライブラリを作成しました。
nicklockwood/SoundManager を参照してください
シンプルな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);
}