Подтвердить что ты не робот

Воспроизвести короткий звук в iOS

Думаю, я мог бы использовать AVAudioPlayer для воспроизведения звука, однако мне нужно просто сыграть короткий звук, и мне не нужны никакие петли или мелкозернистый контроль над томом и т.д.

Есть ли простой способ сделать это?

4b9b3361

Ответ 1

Каждый один из ответов отвечает на утечку памяти (если только для ARC не разрешен один из ответов)... странно, ответ, первоначально обозначенный как правильный, имеет вызов 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>

Ответ 2

Для коротких звуковых клипов (менее 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];
}

Ответ 3

С любовью я использовал этот код для воспроизведения короткого 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

Ответ 4

Swift

Другие ответы здесь используют Objective-C, поэтому я предоставляю версию Swift здесь. Swift использует автоматический подсчет ссылок (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)
        }
    }
}

Примечания:

Использование 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
    }
}

Примечания:

Ответ 5

Я использовал этот код для воспроизведения короткого звукового сигнала на iOS

#import <AudioToolbox/AudioServices.h> 

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

Надеюсь, что это поможет.

Ответ 6

ПРОСТОТА CLEAN SWIFT 3 VERSION

Мне нравится больше контролировать мои звуки, поэтому я использую 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.

Ответ 7

Мой ответ - ответ Билла, но я использую его без 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);
}

Ответ 8

Вот быстрый метод, который вы можете скопировать и использовать в своем приложении:

-(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, поэтому используйте его, если вам нравится...

Ответ 9

Много ответов путают, а некоторые используют структуру 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 Documentation заявляет, что объявляет строку и NSURL, но если вы объедините ее в одну строку, тогда вам не придется ее удалять. Кроме того, поскольку это свойство в вашем файле ViewController.m, вам не нужно будет устанавливать этот объект player для привязки к вашему звуку.

Другие ответы также включали использование SystemSoundID, но также налагали такие ограничения, как "файл не может быть более 30 секунд", "он должен быть в определенном формате" и работает. При этом он может воспроизводить несколько звуков за раз (в случае, если вы разрабатываете звуковую плату), и легче создавать звуки.

Чтобы воспроизвести звук, вставьте эту строку (и да, это действительно так просто):

[player play]

Если вы используете ARC, вы не можете вручную утилизировать плеер, так как система сделает это за вас. Если вы новичок в разработке, и используете самую последнюю версию Xcode, у вас есть ARC. Если по какой-то странной причине вы этого не сделаете, то код для утилизации ресурсов, используемых player, следующий:

[player release]

Ответ 11

Пожалуйста, обратитесь к Простое воспроизведение аудио 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);
}

Ответ 12

Проверьте системное ограничение на воспроизведение короткого аудиофайла

включает инфраструктуру audiotoolbox

и создайте

systemoundid object

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