是否可以在不导入自己的声音的情况下播放现有的系统声音?
答案 0 :(得分:51)
我发现这个systemSoundID列表对于直接访问声音ID非常有用 http://iphonedevwiki.net/index.php/AudioServices
例如,按下按键音响。
#define systemSoundID 1104
AudioServicesPlaySystemSound (systemSoundID);
您还需要在项目中添加AudioToolbox框架,并将#include <AudioToolbox.h>
添加到.m或.h文件中。
答案 1 :(得分:39)
此代码播放苹果系统声音“Tock.aiff”..我相信您可以使用此播放不同的系统声音
NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &soundID);
AudioServicesPlaySystemSound(soundID);
AudioServicesDisposeSystemSoundID(soundID);
请参阅this主题
https://developer.apple.com/documentation/audiotoolbox/system_sound_services
答案 2 :(得分:26)
您可以将此功能用于所有默认系统音频。
示例,对于tap音响用户:
AudioServicesPlaySystemSound(1104);
对于正面声音,请使用:
AudioServicesPlaySystemSound(1054);
而负面的声音使用这个:
AudioServicesPlaySystemSound(1053);
您可以看到完整列表here。
答案 3 :(得分:16)
答案 4 :(得分:6)
改编自@ yannc2021
http://iphonedevwiki.net/index.php/AudioServices
如果你想在Swift中使用系统声音
// import this
import AVFoundation
// add this method
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
// declared system sound here
let systemSoundID: SystemSoundID = 1104
// to play sound
AudioServicesPlaySystemSound (systemSoundID)
答案 5 :(得分:4)
对于 swift ,您可以查看complete list of system sounds and ringtones示例。
编辑: 好的,这是这个例子中最重要的代码和平:
///The directories where sound files are located.
let rootSoundDirectories: [String] = ["/Library/Ringtones", "/System/Library/Audio/UISounds"]
///Array to hold directories when we find them.
var directories: [String] = []
///Tuple to hold directories and an array of file names within.
var soundFiles: [(directory: String, files: [String])] = []
//Starting with the "/Library/Ringtones" & "/System/Library/Audio/UISounds" directories, it looks for other sub-directories just one level lower and saves their relative path in directories array.
//- URLs: All of the contents of the directory (files and sub-directories).
func getDirectories() {
let fileManager: NSFileManager = NSFileManager()
for directory in rootSoundDirectories {
let directoryURL: NSURL = NSURL(fileURLWithPath: "\(directory)", isDirectory: true)
do {
if let URLs: [NSURL] = try fileManager.contentsOfDirectoryAtURL(directoryURL, includingPropertiesForKeys: [NSURLIsDirectoryKey], options: NSDirectoryEnumerationOptions()) {
var urlIsaDirectory: ObjCBool = ObjCBool(false)
for url in URLs {
if fileManager.fileExistsAtPath(url.path!, isDirectory: &urlIsaDirectory) {
if urlIsaDirectory {
let directory: String = "\(url.relativePath!)"
let files: [String] = []
let newSoundFile: (directory: String, files: [String]) = (directory, files)
directories.append("\(directory)")
soundFiles.append(newSoundFile)
}
}
}
}
} catch {
debugPrint("\(error)")
}
}
}
//For each directory, it looks at each item (file or directory) and only appends the sound files to the soundfiles[i]files array.
//- URLs: All of the contents of the directory (files and sub-directories).
func loadSoundFiles() {
for i in 0...directories.count-1 {
let fileManager: NSFileManager = NSFileManager()
let directoryURL: NSURL = NSURL(fileURLWithPath: directories[i], isDirectory: true)
do {
if let URLs: [NSURL] = try fileManager.contentsOfDirectoryAtURL(directoryURL, includingPropertiesForKeys: [NSURLIsDirectoryKey], options: NSDirectoryEnumerationOptions()) {
var urlIsaDirectory: ObjCBool = ObjCBool(false)
for url in URLs {
if fileManager.fileExistsAtPath(url.path!, isDirectory: &urlIsaDirectory) {
if !urlIsaDirectory {
soundFiles[i].files.append("\(url.lastPathComponent!)")
}
}
}
}
} catch {
debugPrint("\(error)")
}
}
}
该示例在表格视图中显示系统声音文件。声音播放如下所示:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//Play the sound
let directory: String = soundFiles[indexPath.section].directory
let fileName: String = soundFiles[indexPath.section].files[indexPath.row]
let fileURL: NSURL = NSURL(fileURLWithPath: "\(directory)/\(fileName)")
do {
model.audioPlayer = try AVAudioPlayer(contentsOfURL: fileURL)
model.audioPlayer.play()
} catch {
debugPrint("\(error)")
}
}
model.audioPlayer
只是AVAudioPlayer
的一个实例:
///Audio player responsible for playing sound files.
var audioPlayer: AVAudioPlayer = AVAudioPlayer()
答案 6 :(得分:4)
Swift 4 +
注意:仅在真实设备上试用:
import AVKit
AudioServicesPlaySystemSound(1007);
或者您可以尝试将网址设为 -
let url = URL(fileURLWithPath: "/System/Library/Audio/UISounds/payment_success.caf")
var soundID: SystemSoundID = 0
AudioServicesCreateSystemSoundID(url as CFURL, &soundID)
AudioServicesPlaySystemSound(soundID);
https://github.com/klaas/SwiftySystemSounds/blob/master/README.md
答案 7 :(得分:1)
这种仅限可可的解决方案使用现有的音频文件来播放声音。 此方法可用于播放任何声音文件。 必须将AVFoundation.framework添加到您的框架中。 您必须定义或删除我使用的宏,这些宏是不言自明的。
我在AVAudioPlayer中添加了一个类别,如下所示:
AVAudioPlayer + .h
#import <AVFoundation/AVAudioPlayer.h>
@interface AVAudioPlayer ( CapSpecs )
+ (AVAudioPlayer*) click;
+ (AVAudioPlayer*) tink;
+ (AVAudioPlayer*) tock;
+ (AVAudioPlayer*) withResourceName: (NSString*) aName;
@end
AVAudioPlayer +的m
#import "AVAudioPlayer+.h"
@implementation AVAudioPlayer ( CapSpecs )
+ (AVAudioPlayer*) click {
StaticReturn ( [AVAudioPlayer withResourceName: @"iPod Click"] );
}
+ (AVAudioPlayer*) tink {
StaticReturn ( [AVAudioPlayer withResourceName: @"Tink"] );
}
+ (AVAudioPlayer*) tock {
StaticReturn ( [AVAudioPlayer withResourceName: @"Tock"] );
}
+ (AVAudioPlayer*) withResourceName: (NSString*) aName {
NSBundle* zBundle = [NSBundle bundleWithIdentifier: @"com.apple.UIKit"];
NSURL* zURL = [zBundle URLForResource: aName withExtension: @"aiff"];
(void) RaiseIfNil ( nil, zURL, ([SWF @"URL for %@",aName]) );
NSError* zError = nil;
AVAudioPlayer* zAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: zURL error: &zError];
RaiseError ( nil, zError, @"AVAudioPlayer init error" );
#ifdef DEBUG
// Apple records the console dump which occurs as a bug in the iOS simulator
// all of the following commented code causes the BS console dump to be hidden
int zOldConsole = dup(STDERR_FILENO); // record the old console
freopen("/dev/null", "a+", stderr); // send console output to nowhere
(void)[zAudio prepareToPlay]; // create the BS dump
fflush(stderr); // flush the console output
dup2(zOldConsole, STDERR_FILENO); // restore the console output
#endif
return zAudio;
}
@end
答案 8 :(得分:0)
对于Swift
import AVFoundation
func play(sound: String) {
var soundID: SystemSoundID = SystemSoundID()
let mainBundle = CFBundleGetMainBundle()
if let ref = CFBundleCopyResourceURL(mainBundle, sound as CFString, nil, nil) {
AudioServicesCreateSystemSoundID(ref, &soundID);
AudioServicesPlaySystemSound(soundID);
}
}
@Krishnabhadra的实施
答案 9 :(得分:0)
这应该可以播放大多数macOS系统声音
#include <AudioToolbox/AudioToolbox.h>
for (int i = 0; i < 50; i++) {
NSLog(@"playing %i", i);
AudioServicesPlaySystemSound (i);
[NSThread sleepForTimeInterval:1.0];
}