Soru Audio iOS Objective-C'yi çal


İOS uygulamamda bir ses dosyası çalmaya çalışıyorum. Bu benim şu anki kodum

NSString *soundFilePath = [NSString stringWithFormat:@"%@/test.m4a", [[NSBundle mainBundle] resourcePath]];

NSLog(@"%@",soundFilePath);
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

[audioPlayer setVolume:1.0];

audioPlayer.delegate = self;

[audioPlayer stop];
[audioPlayer setCurrentTime:0];
[audioPlayer play];

Bir sürü başka gönderiyi kontrol ediyorum ama hepsi aynı şeyi yapıyorlar. Hata alıyorum, ancak simülatörde veya cihazda herhangi bir ses çalındığını duymuyorum.

Simülatördeki ses dosyası için aldığım yol budur

/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/long-numbered-thing/BookAdventure.app/test.m4a

Herhangi bir yardım takdir edilir!


22
2017-07-17 15:35


Menşei


Başka bir ses dosyası deneyin, test.m4a bozuk olabilir, bu yüzden bu yüzden oynatılamıyor. - Jeremy1026
does audioPlayer geçerli bir nesneyi işaret etmek Sessiz anahtarı açık mı? Cihaz sesi açıldı mı? - Caleb
Eminim geçerli bir nesne. Yolun doğru olup olmadığını anlamanın bir yolu var mı? Null bir nesne veya geçersiz bir yol olsaydı, bir hata atacağını farz ettim .. Sessiz anahtarı açık değil ve cihaz sesini açıldı @ Jeremy1026 dosya normalde xCode'da ve MBP'de çalışıyor, bu yüzden iyi olduğunu düşünüyorum - Lagoo87
Bu projede ARC kullanıyor musunuz? - Jonathan Grynspan
Bunu anladın mı? @ Lagoo87 - 4GetFullOf


Cevaplar:


Belki de NSBundle yöntem pathForResource:ofType: dosya yolunu oluşturma yöntemi.

Aşağıdaki kod bir ses dosyasını başarıyla oynatmalıdır. Ben sadece onu bir mp3ama bununla birlikte çalışması gerektiğini hayal ediyorum m4a. Bu kod çalışmazsa, ses dosyasının formatını değiştirmeyi deneyebilirsiniz. Bu kod için ses dosyası ana proje dizininde bulunur.

/* Use this code to play an audio file */
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"test"  ofType:@"m4a"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
player.numberOfLoops = -1; //Infinite

[player play];

DÜZENLE

Tamam, şunu dene:

NSString *soundFilePath = [NSString stringWithFormat:@"%@/test.m4a",[[NSBundle mainBundle] resourcePath]];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
player.numberOfLoops = -1; //Infinite

[player play];

Ayrıca, doğru ithalatı yaptığınızdan emin olun:

#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>

52
2017-07-17 18:16



Bunu yaptığımda, soundFilePath'ım bitiyor (boş) ...? Dosyam ana proje dizininde. XCode'da "Sesi" grubunun altında, bence önemli değil. - Lagoo87
Kodumu deneyebilirsiniz, ancak yol oluşturma yönteminizi kullanarak (örneğin NSString * soundFilePath = [NSString stringWithFormat: @ "% @ / test.m4a", [[NSBundle mainBundle] resourcePath]]) yerine. Ayrıca, soundFilePath öğenizin bir NSLog'u ne yazdırıyor? - bddicken
ses dosyası yolu her zaman yazdırıyor (null) Bu diğer yol oluşturma yöntemini kullandığımda, soundFilePath'im "file: //localhost/Users/userName/Library/Application%20Support/iPhone%20Simulator/5.1/Applications/long-number -thing-burada / BookAdventure.app / test.m4a" - Lagoo87
Uygun ithalatlar zaten vardı. Tuhaf, .mp3 çalışıyor ama .m4a çalışmıyor. Neden olduğundan emin değilim, ama sadece biraz ses çalmaktan mutluyum! - Lagoo87
Bu parçacıklar için FYI AudioToolbox içe aktarma gerekli değildir :) - Luke


Saklamanız gerekiyor kuvvetli 'AVAudioPlayer' referansı

@property (strong) AVAudioPlayer *audioPlayer;

Ve eğer ses dosyanızın Bundle Resources'ın altında olduğundan eminseniz, oynamalıdır.

Proje> Yapı Aşamaları> Kopyala


23
2017-09-17 17:42



Hemen hemen aynı sorunu yaşıyordum ve oyuncu nesnesine bir referans tuttuğumdan emin olmak sorunu çözdü. Oyuncunun withUrl, vb. İle nasıl oluşturulduğunun nasıl bir varyasyonu sorun değildi, fakat sadece oyuncuya yapılan referansın, sonuçlandırılmakta olduğu yöntem / kapsam olarak kaybolması gerçeğiydi. - Chris Amelinckx


.Caf, .m4a, .mp4, .mp3, .wav, .aif uzantılı dosyaları oynatmak için


Aşağıdaki iki dosyayı indir GitHub

SoundManager.h
SoundManager.m

Bu dosyaları projenize ekleyin

Ayrıca kaynak klasörüne ses dosyaları ekleyin (örnek dosyalar)

mysound.mp3, song.mp3

Üstbilgi dosyasını istenen dosyaya içe aktar

#import "SoundManager.h"

Ve aşağıdaki iki satırı ekleyin - (void) viewDidLoad

[SoundManager sharedManager].allowsBackgroundMusic = YES;
[[SoundManager sharedManager] prepareToPlay];

Ses çalmak için aşağıdaki satırı kullanın (mysound.mp3)

[[SoundManager sharedManager] playSound:@"mysound" looping:NO];

Sesi durdurmak için aşağıdaki satırı kullanın (mysound.mp3)

[[SoundManager sharedManager] stopSound:@"mysound"];

Ayrıca müzik çalabilirsiniz (song.mp3)

[[SoundManager sharedManager] playMusic:@"song" looping:YES];

Ve müziği durdurabilir

[[SoundManager sharedManager] stopMusic];

Tamamlayınız Dokümantasyon GitHub'da


20
2017-09-23 11:48



Yukarıdaki yöntemlere .FileExtension (örneğin: @ "mysound.mp3") ekleyin :) - Md Rais
Plz olmadan denediniz mi? Ses dosyasını kaynaktan otomatik olarak algılaması gerekir - Salim
Evet, uzantıları olmadan denedim ancak dosyayı bulamadı. Belki de xcode 6.x'de kullanıyorum, algılamıyor. Xcode 7x hakkında bilmiyorum. - Md Rais


İlk önce bu çerçeveyi dosyanıza aktarın

#import <AVFoundation/AVFoundation.h>

Sonra bir örnek ilan et AVAudioPlayer.

AVAudioPlayer *audioPlayer;

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Name of your audio file" 
                                                          ofType:@"type of your audio file example: mp3"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
audioPlayer.numberOfLoops = -1;
[audioPlayer play];

3
2018-06-20 12:26



Serin örnek, en azından, işlev yerine yerinde var. Biraz açıklama wrt numbnerOfLoopsCounting: (-1) sonsuzluk için standlar, 0 - biri için vb. Çalıştırmak için bir UIButton ekledim [audioPlayer oynat]; ama kullanıcı kodun nasıl ele alınacağına bağlı. Cevabınızı ve kullanıcı rahatlığı açısından cevabınızı destekliyorum! Teşekkürler! - matrix3003


Sistem ses kimliğini oluşturursanız paket ses dosyasını aşağıdaki kodu kullanarak oynatmak için

for(int i = 0 ;i< 5;i++)
{
    SystemSoundID   soundFileObject;
    NSString *audioFileName = [NSString stringWithFormat:@"Alarm%d",i+1];

    NSURL *tapSound   = [[NSBundle mainBundle] URLForResource: audioFileName
                                            withExtension: @"caf"];

    // Store the URL as a CFURLRef instance
    CFURLRef soundFileURLRef = (__bridge CFURLRef) tapSound;

    // Create a system sound object representing the sound file.
    AudioServicesCreateSystemSoundID (

                                  soundFileURLRef,
                                  &soundFileObject
                                  );
    [alarmToneIdList addObject:[NSNumber numberWithUnsignedLong:soundFileObject]];
}

Aşağıdaki kodu kullanarak ses çalabilirsiniz

AudioServicesPlaySystemSound([[alarmToneIdList objectAtIndex:row]unsignedLongValue]);

Bu çerçeveyi başarmak için Xcode'unuza eklemeniz gerekir

AudioToolbox

Sonunda başlık dosyalarının altında denetleyicide içe aktarılması gerekiyor

#import AudioToolbox/AudioToolbox.h
#import AudioToolbox/AudioServices.h

0
2017-11-07 19:43





Swift 4 için güncellendi Ana paketten oynamak - Yalnızca iOS 11

import AVFoundation

var player: AVAudioPlayer?

Aşağıdaki kod ses dosyasını yükler ve oynatır, gerekirse bir hata döndürür.

guard let url = Bundle.main.url(forResource: "test", withExtension: "m4a") else { return }

    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)

    guard let player = player else { return }

    player.play()

    } catch let error {
        // Prints a readable error
        print(error.localizedDescription)
    }

0
2018-01-04 11:31