播放系统声音而不导入自己的
是否有可能播放已有的系统声音而不导入自己的?
这个代码播放苹果系统的声音“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);
看到这个线程
系统声音的苹果的文件
https://developer.apple.com/documentation/audiotoolbox/system_sound_services
我发现这个systemSoundID列表对于直接访问声音ID非常有用。
http://iphonedevwiki.net/index.php/AudioServices
例如,要播放一个按键的声音。
#define systemSoundID 1104 AudioServicesPlaySystemSound (systemSoundID);
您还需要在您的项目中添加AudioToolbox框架,并将#include <AudioToolbox.h>
添加到.m或.h文件中。
您可以将其用于所有默认系统audio。
例如,对于轻敲声音用户来说:
AudioServicesPlaySystemSound(1104);
对于积极的声音,使用这个:
AudioServicesPlaySystemSound(1054);
负面的声音使用这个:
AudioServicesPlaySystemSound(1053);
完整的列表,你可以在这里看到。
所有系统声音列表: iOSSystemSoundsLibrary
你可以播放所有这些声音:
AudioServicesPlaySystemSound (systemSoundID);
改编自@ 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)
对于快捷方式 ,您可以查看系统声音和铃声示例的完整列表 。
编辑:好的,这里是这个例子中最重要的代码:
///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()
这种仅用于cocoa的解决scheme使用现有的audio文件来播放声音。 这种方法可以用来播放任何声音文件。 AVFoundation.framework将不得不被添加到你的框架。 你将不得不定义或删除我自己说明的macros。
我向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
对于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的执行