Development Tip

iOS에서 짧은 소리 재생

yourdevel 2020. 12. 9. 21:53
반응형

iOS에서 짧은 소리 재생


나는 AVAudioPlayer소리를 재생하는 데 사용할 수 있다고 생각 하지만 필요한 것은 짧은 소리를 재생하는 것이며 볼륨 등에 대한 루프 또는 세밀한 제어가 필요하지 않습니다.

이 작업을 수행하는 쉬운 방법이 있습니까?


다른 답변 중 하나는 모두 메모리 누수 (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>


짧은 사운드 클립 (30 초 미만)의 경우 정말 멋진 SystemSounds 라이브러리가 있습니다.

장점 : 볼륨 설정을 별도로 관리 할 필요가 없습니다. 사운드는 별도의 스레드에서 재생되며 오디오 클립의로드 및 재생이 매우 빠릅니다. 즉,이 클립을 다른 시스템 사운드로 취급합니다.

단점 : 별도의 오디오 제어 설정을 제공 할 수 없습니다. 시스템 사운드 설정과 관련이 있습니다. 30 초 이상 재생할 수 없습니다. 오디오 효과를 향상시키기 위해 사운드 필터를 적용 할 수 없습니다.

확실히 더 많은 장단점이 있지만 이것들은 내 머리 위에서 생각할 수있는 것들입니다.

이 가져 오기를 사용합니다. <AudioToolbox/AudioToolbox.h>AudioToolbox Framework를 추가 한 다음 클립을 재생하려는 위치에서 [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는 ARC (Automatic Reference Counting)를 사용하므로이 답변에 대한 메모리 누수 문제를 알지 못합니다 (허용 된 답변에서 경고 한대로).

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)
        }
    }
}

메모:

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
    }
}

메모:


최근에이 코드를 사용하여 잘 작동하는 짧은 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-sound를 재생했습니다.

#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을 가져 오는지 확인하십시오.


내 대답은 Bill의 대답이지만 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);
}

다음은 앱에서 복사하여 사용할 수있는 빠른 정리 방법입니다.

-(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로 아무것도하지 않았으므로 원하는 경우 사용하십시오 ...


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)
    }
}

많은 답변이 혼란스럽고 일부는 AudioToolbox프레임 워크와 다른 프레임 워크를 사용하고 있습니다 AVAudioFoundation. 여기 제가 한 일이 있습니다. 에서 .h파일이 코드를 넣어 :

@property (nonatomic, retain) AVAudioPlayer *player;

이 코드는 "player"라는 오디오 플레이어를 선언합니다. 에서 .m파일, 당신의 아래에 @implementation선언을 추가 @synthesize player. 이것은 그 player속성을 합성합니다 .

In whatever function you want, tie your sound in to the player by adding this line of code, where yourSound is the name of the sound file, and aif is your file extension:

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

I know the Apple Documentation says to declare a string and a NSURL, but if you combine it into one line, then you won't have to dispose of it afterwards. Also, since this is a property in your ViewController.m file, then you won't have to keep setting that player object to tie in with your sound.

Other answers also included using a SystemSoundID, but that also imposes restrictions like, "the file can't be over 30 seconds long," "it has to be in a specific format," and the works. With that, it can play several sounds at a time (in case you're developing a soundboard), and it's easier to create the sounds.

To actually play your sound, insert this line (and yes, it's really this easy):

[player play]

If you use ARC, you can't manually dispose of the player, as the system will do it for you. If you're new to developing and you're using the latest version of Xcode, then you have ARC enabled. If, for some strange reason, you don't, then the code for disposing of the resources being used by player is:

[player release]


From Sound does only work on Device but not in Simulator

Nick created a library which can be used for playing sounds in iOS and Mac Apps.

See nicklockwood/SoundManager


Please refer to Simple iOS audio playback

- (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);
}

Check out systemsound to play short audio file

include audiotoolbox framework

and create

systemsoundid object

NSString *soundPath =  [[NSBundle mainBundle] pathForResource:file ofType:@"aiff"];
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID);
AudioServicesPlaySystemSound (soundID);

참고URL : https://stackoverflow.com/questions/10329291/play-a-short-sound-in-ios

반응형