audio aumentare - Riproduci un breve suono in iOS





volume youtube (12)


Scopri systemsound per riprodurre un breve file audio

includere il framework audiotoolbox

e creare

oggetto systemsoundid

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

Suppongo che potrei usare AVAudioPlayer per riprodurre un suono, tuttavia, quello di cui ho bisogno è solo suonare un breve suono e non ho bisogno di loop o controllo a grana fine sul volume, ecc.

C'è un modo semplice per farlo?




Per brevi clip audio (meno di 30 secondi), c'è una libreria SystemSounds che è davvero bella.

Pro: non è necessario gestire le impostazioni del volume separatamente. L'audio viene riprodotto in un thread separato e il caricamento e la riproduzione della clip audio sono v veloci. In breve, tratti questa clip come un altro suono di sistema.

Contro: non è possibile fornire un'impostazione di controllo audio separata. È legato alle impostazioni dei suoni di sistema. Non puoi giocare più di 30 secondi. Probabilmente non puoi applicare alcun filtro audio per migliorare l'effetto audio.

Ci sono sicuramente più pro e contro, ma questi sono alcuni che potrei pensare, in cima alla mia testa.

usa questa importazione: <AudioToolbox/AudioToolbox.h> Aggiungi l'AudioToolbox Framework quindi chiama il metodo seguente come [self playSound], ovunque tu voglia riprodurre la clip.

-(void) playSound {
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"changeTrack" ofType:@"aif"];
    SystemSoundID soundID;
    AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID);
    AudioServicesPlaySystemSound (soundID);
    [soundPath release];
}



VERSIONE SWIFT 3 SEMPLICE SEMPLICE

Mi piace più controllo sui miei suoni, quindi sto usando 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()
  }
}

Assicurati di aver aggiunto il file al progetto e di importare AVFoundation.




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

}







Ho usato questo codice per riprodurre un suono aiff breve su iOS

#import <AudioToolbox/AudioServices.h> 

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

Spero che questo ti aiuti.




Ognuna delle altre risposte perde memoria (a meno che ARC non sia abilitata per una delle risposte) ... stranamente, la risposta inizialmente contrassegnata come corretta ha una chiamata a retainCount senza alcun motivo apparente.

Se si alloc/init qualcosa, deve essere rilasciato (a meno che non si stia utilizzando ARC).

Se chiami AudioServicesCreateSystemSoundID() devi disporre del suono risultante.

Vedi l'esempio Audio UI suoni .

Fondamentalmente:

@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

Per completezza:
aggiungi AudioToolbox.framework
#import <AudioToolbox/AudioToolbox.h>




Si prega di fare riferimento alla semplice riproduzione audio 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);
}



Recentemente, ho usato questo codice per riprodurre un breve audio mp3 che ha funzionato bene: -

Dichiaralo sotto l'implementazione @

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



Molte risposte sono confuse e alcune utilizzano il framework AudioToolbox , diverso dal framework AVAudioFoundation ... ecco cosa ho fatto. Nel file .h , ho inserito questo codice in:

@property (nonatomic, retain) AVAudioPlayer *player;

Questo codice dichiara un lettore audio chiamato "player". Nel file .m , sotto la dichiarazione @implementation , aggiungi @synthesize player . Questo sintetizza quella proprietà del player .

In qualsiasi funzione tu desideri, collega il tuo suono al lettore aggiungendo questa riga di codice, dove yourSound è il nome del file audio e aif è la tua estensione di file:

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

So che la documentazione Apple dice di dichiarare una stringa e una NSURL, ma se la si combina in una riga, non sarà necessario eliminarla successivamente. Inoltre, dal momento che si tratta di una proprietà nel tuo file ViewController.m , non dovrai più continuare a impostare quell'oggetto player da collegare al tuo suono.

Altre risposte includono anche un SystemSoundID , ma impone anche restrizioni come "il file non può essere lungo più di 30 secondi", "deve essere in un formato specifico" e funziona. Con ciò, può suonare diversi suoni alla volta (nel caso si stia sviluppando una tavola armonica), ed è più facile creare i suoni.

Per riprodurre effettivamente il tuo suono, inserisci questa linea (e sì, è davvero così facile):

[player play]

Se si utilizza ARC, non è possibile disporre manualmente del lettore, poiché il sistema lo farà per voi. Se sei nuovo nello sviluppo e stai usando l'ultima versione di Xcode, allora hai attivato ARC. Se, per qualche strana ragione, non lo fai, allora il codice per lo smaltimento delle risorse utilizzate dal player è:

[player release]




Ecco un metodo rapido che puoi copiare e utilizzare nella tua app:

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

Quindi usare solo:

[self playSoundFXnamed:@"someAudio.mp3" Loop: NO];

Se AVAudioPlayer *audioPlayer il ciclo, devi portare il tuo AVAudioPlayer *audioPlayer nella tua classe per essere in grado di interrompere il suono .. Quale non lo faresti se desideri solo un breve suono.

Usa ARC ... e non ho mai fatto niente con NSError, quindi usalo se ti piace ...




Ho scritto per Android per un lungo periodo e mi manca Toast. Ne ho implementato uno. Hai bisogno di codice? Ecco qui:

ToastView.h

#import <UIKit/UIKit.h>

@interface ToastView : UIView

@property (strong, nonatomic) NSString *text;

+ (void)showToastInParentView: (UIView *)parentView withText:(NSString *)text withDuaration:(float)duration;

@end

ToastView.m

#import "ToastView.h"

@interface ToastView ()
@property (strong, nonatomic, readonly) UILabel *textLabel;
@end
@implementation ToastView
@synthesize textLabel = _textLabel;

float const ToastHeight = 50.0f;
float const ToastGap = 10.0f;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

-(UILabel *)textLabel
{
    if (!_textLabel) {
        _textLabel = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 5.0, self.frame.size.width - 10.0, self.frame.size.height - 10.0)];
        _textLabel.backgroundColor = [UIColor clearColor];
        _textLabel.textAlignment = NSTextAlignmentCenter;
        _textLabel.textColor = [UIColor whiteColor];
        _textLabel.numberOfLines = 2;
        _textLabel.font = [UIFont systemFontOfSize:13.0];
        _textLabel.lineBreakMode = NSLineBreakByCharWrapping;
        [self addSubview:_textLabel];

    }
    return _textLabel;
}

- (void)setText:(NSString *)text
{
    _text = text;
    self.textLabel.text = text;
}

+ (void)showToastInParentView: (UIView *)parentView withText:(NSString *)text withDuaration:(float)duration;
{

    //Count toast views are already showing on parent. Made to show several toasts one above another
    int toastsAlreadyInParent = 0;
    for (UIView *subView in [parentView subviews]) {
        if ([subView isKindOfClass:[ToastView class]])
        {
            toastsAlreadyInParent++;
        }
    }

    CGRect parentFrame = parentView.frame;

    float yOrigin = parentFrame.size.height - (70.0 + ToastHeight * toastsAlreadyInParent + ToastGap * toastsAlreadyInParent);

    CGRect selfFrame = CGRectMake(parentFrame.origin.x + 20.0, yOrigin, parentFrame.size.width - 40.0, ToastHeight);
    ToastView *toast = [[ToastView alloc] initWithFrame:selfFrame];

    toast.backgroundColor = [UIColor darkGrayColor];
    toast.alpha = 0.0f;
    toast.layer.cornerRadius = 4.0;
    toast.text = text;

    [parentView addSubview:toast];

    [UIView animateWithDuration:0.4 animations:^{
        toast.alpha = 0.9f;
        toast.textLabel.alpha = 0.9f;
    }completion:^(BOOL finished) {
        if(finished){

        }
    }];


    [toast performSelector:@selector(hideSelf) withObject:nil afterDelay:duration];

}

- (void)hideSelf
{

    [UIView animateWithDuration:0.4 animations:^{
        self.alpha = 0.0;
        self.textLabel.alpha = 0.0;
    }completion:^(BOOL finished) {
        if(finished){
            [self removeFromSuperview];
        }
    }];
}

@end

Chiama da ViewController

 [ToastView showToastInParentView:self.view withText:@"What a toast!" withDuaration:5.0];




ios audio