Воспроизведение короткого звука в iOS


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

существует ли простой способ сделать это?

13 55

13 ответов:

каждый из других ответов утечки памяти (если 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.рамки
#import <AudioToolbox/AudioToolbox.h>

для коротких звуковых клипов (менее 30 секунд) есть библиотека SystemSounds, которая действительно хороша.

плюсы: Вам не нужно управлять настройками громкости отдельно. Звук воспроизводится в отдельном потоке, а загрузка и воспроизведение аудиоклипа-v быстро. Короче говоря, вы относитесь к этому клипу как к другому системному звуку.

минусы: вы не можете обеспечить отдельную настройку управления звуком. Он привязан к настройкам системных звуков. Вы не можете играть более 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 использует автоматический подсчет ссылок (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)
        }
    }
}

Примечания:

  • этот пример адаптирован из как играть короткий звуковой клип с AudioToolbox в Swift.
  • не забудьте добавить yourAudioFileName.mp3 (или .wav, etc) к вашему проекту.
  • не забудьте import AudioToolbox
  • этот ответ помещает код в нажатие кнопки IBAction, но его можно так же легко поместить в другую функцию, конечно.

используя 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

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

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

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

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

используйте дугу... и я никогда ничего не делал с NSError, так что используйте его, если хотите...

многие ответы сбивают с толку, а некоторые используют AudioToolbox рамки, отличные от AVAudioFoundation основы... вот что я сделал. В .h файл, я вставил этот код в:

@property (nonatomic, retain) AVAudioPlayer *player;

этот код объявляет аудиоплеер с именем " player.- В , под @implementation декларации, добавьте @synthesize player. Это синтезирует, что player собственность.

в любой функции вы хотите, связать свой звук в плеер, добавив эту строку кода, где yourSound - имя звукового файла, и aif - это расширение файла:

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

я знаю, что в документации Apple говорится объявить строку и NSURL, но если вы объедините ее в одну строку, вам не придется избавляться от нее впоследствии. Кроме того, поскольку это свойство в своем ViewController.m файл, то вам не придется продолжать устанавливать это player объект, чтобы связать с вашей звуковой.

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

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

[player play]

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

[player release]

С Помощью 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)
}

}

с звук работает только на устройстве, но не в симулятор

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

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

включить audiotoolbox framework

и создать

systemsoundid object

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