2016-01-02 14 views
10

Otrzymuję adres URL pliku mp3 w odpowiedzi na wywołania api. Chcę odtwarzać ten dźwięk, więc jak mogę to zrobić? (Ios Swift)Jak odtwarzać dźwięk w formacie mp3 z adresu URL w ios swift

tutaj jest moja odpowiedź

{ 
    content = "En este primer programa se tratar\U00e1n asuntos tan importante como este y aquel sin descuidar un poco de todo lo dem\U00e1s"; 
    file = "http://radio.spainmedia.es/wp-content/uploads/2015/12/ogilvy.mp3"; 
    image = "http://radio.spainmedia.es/wp-content/uploads/2015/12/tapas.jpg"; 
    number = 0001; 
    subtitle = Titulareando; 
    title = "Tapa 1"; 
} 

tutaj jest mój kod ::

@IBAction func btnplayaudio(sender: AnyObject) { 
    let urlstring = "http://radio.spainmedia.es/wp-content/uploads/2015/12/tailtoddle_lo4.mp3" 
    let url = NSURL(string: urlstring) 
    print("the url = \(url!)") 

    play(url!) 

} 

func play(url:NSURL) { 
    print("playing \(url)") 

    do { 
     self.player = try AVAudioPlayer(contentsOfURL: url) 
     player.prepareToPlay() 
     player.volume = 1.0 
     player.play() 
    } catch let error as NSError { 
     self.player = nil 
     print(error.localizedDescription) 
    } catch { 
     print("AVAudioPlayer init failed") 
    } 

} 

gdzie jestem będzie niewłaściwy?

+0

Kod rzuca wyjątek dla mnie, operacja nie mogła zostać zakończona . (Błąd OSStatus 2003334207 – satheeshwaran

+0

to także wyjątek dla mnie, ale jak mogę tego uniknąć.to po prostu jest to mój adres URL http://radio.spainmedia.es/wp-content/uploads/2015/12/ogilvy.mp3 jak to zrobić Gram to? @ satheeshwaran – Govind

+0

sekundę, patrząc na to – satheeshwaran

Odpowiedz

10

Próbowałem następujące,

let urlstring = "http://radio.spainmedia.es/wp-content/uploads/2015/12/tailtoddle_lo4.mp3" 
    let url = NSURL(string: urlstring) 
    print("the url = \(url!)") 
    downloadFileFromURL(url!) 

dodać poniższych metod,

func downloadFileFromURL(url:NSURL){ 

    var downloadTask:NSURLSessionDownloadTask 
    downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(url, completionHandler: { [weak self](URL, response, error) -> Void in 
     self?.play(URL) 
    }) 

    downloadTask.resume() 

} 

i Twojego sposobu odtwarzania, jak to jest,

func play(url:NSURL) { 
    print("playing \(url)") 

    do { 
     self.player = try AVAudioPlayer(contentsOfURL: url) 
     player.prepareToPlay() 
     player.volume = 1.0 
     player.play() 
    } catch let error as NSError { 
     //self.player = nil 
     print(error.localizedDescription) 
    } catch { 
     print("AVAudioPlayer init failed") 
    } 

} 

Pobierz plik mp3, a następnie spróbuj aby go odtworzyć, AVAudioPlayer nie pobiera w jakiś sposób twojego pliku mp3. Mogę pobrać plik audio i odtwarzacz go odtworzy.

Pamiętaj, aby dodać ten w Info.plist ponieważ ładujesz z http źródła i trzeba poniżej należy ustawić dla iOS 9+

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 
</plist> 
+0

dziękuję koleś to działa dla mnie @satheeshwaran – Govind

+0

jego praca na symulatorze, ale nie działa na iphone, więc czy istnieje jakieś rozwiązanie? – Govind

+0

@Govind Czy próbujesz zalogować się do adresu URL po pobraniu? Czy rzuca jakiś inny wyjątek, – satheeshwaran

0

Aby odtwarzać dźwięk w swift2 jest

func playSound(soundUrl: String) 
{ 
    let sound = NSURL(soundUrl) 
    do{ 
     let audioPlayer = try AVAudioPlayer(contentsOfURL: sound) 
     audioPlayer.prepareToPlay() 
     audioPlayer.play() 
    }catch { 
     print("Error..") 
    } 
} 

Daj mi znać, jeśli to działa.

+0

jego błąd rzucania dla mnie Myślę, że robię coś nie tak z plikiem mp3 .. jest moja odpowiedź co ja dostałem z serwera ... { treść = "Program startowy programu se tratar \ U00e1n asuntos tan importante como este y aquel sin descuidar un poco de todo lo dem \ U00e1s"; file = "http://radio.spainmedia.es/wp-content/uploads/2015/12/ogilvy.mp3"; image = "http://radio.spainmedia.es/wp-content/uploads/2015/12/tapas.jpg"; numer = 0001; podtytuł = Titulareando; title = "Tapa 1"; } więc jak mogę odtworzyć ten plik @zumry Mohamed – Govind

+0

Wygląda na to, że prawie tam jesteś, ale nie całkiem. To, czego żądasz z serwera, nie jest rzeczywistymi bajtami pliku mp3, ale raczej metadanymi o lokalizacji pliku. Wyciągnij klucz "file" z json i użyj go w AVMediaPlayer. –

15

Zastosowanie AVPlayer zamiast AVAudioPlayer do odtwarzać zdalną zawartość. Zgodnie z dokumentacją AVAudioPlayer potrzebuje pliku mp3 do odtwarzania dźwięku. AVAudioPlayer nie zapewnia wsparcia dla streaming.

Spróbuj tego kodu, jego dobrze działa na mnie

func play(url:NSURL) { 
    print("playing \(url)") 

    do { 

     let playerItem = AVPlayerItem(URL: url) 

     self.player = try AVPlayer(playerItem:playerItem) 
     player!.volume = 1.0 
     player!.play() 
    } catch let error as NSError { 
     self.player = nil 
     print(error.localizedDescription) 
    } catch { 
     print("AVAudioPlayer init failed") 
    } 
} 

Proszę pamiętać, aby ustawić App Transportu Bezpieczeństwa (ATS) w Info.plist pliku.

<key>NSAppTransportSecurity</key> 
    <dict> 
     <key>NSAllowsArbitraryLoads</key> 
     <true/> 
    </dict> 
+1

to działa na symulatorze, ale nie działa w moim urządzeniu iPhone. więc czy istnieje jakieś rozwiązanie? nie pokazuje żadnego błędu. nawet funkcja odtwarzania jest również wywoływana, ale dźwięk nie jest odtwarzany na moim urządzeniu. – Govind

+0

Odtwarzanie zawartości zdalnej lub lokalnego pliku mp3? – technerd

+0

zdalna zawartość. – Govind

3

Od AVPlayer jest bardzo ograniczony (na przykład nie można zmienić url tam bez zregenerować cały AVPlayer myślę, że należy użyć AVQueuePlayer:

Z docs:

AVQueuePlayer jest podklasą Odtwarzacz AVPlayer używał kolejno następujących po sobie elementów: . Za pomocą tej klasy można tworzyć kolejki i zarządzać nimi w kolejce elementów odtwarzacza com: nagradzane lokalnie lub stopniowo pobierane pliki oparte na plikach , takie jak filmy QuickTime lub pliki audio MP3, a także media obsługiwane za pomocą HTTP Live Streaming.

Więc w Swift 3 to będzie działać tak:

lazy var playerQueue : AVQueuePlayer = { 
    return AVQueuePlayer() 
}() 

...

func playTrackOrPlaylist{ 
    if let url = track.streamURL() { //this is an URL fetch from somewhere. In this if you make sure that URL is valid 
     let playerItem = AVPlayerItem.init(url: url) 
     self.playerQueue.insert(playerItem, after: nil) 
     self.playerQueue.play() 
    } 
} 
+0

Dlaczego tworzysz instancję AVQueuePlayer jako leniwy getter.Czy nie powraca za każdym razem, gdy pojawia się nowa kolejka? Co jeśli chcesz zarządzać kolejką ścieżek? –

Powiązane problemy