2015-09-13 8 views
7

मैं अपनी पहली प्रोग्रामिंग भाषा के रूप में स्विफ्ट सीख रहा हूं।स्विफ्ट 2/AVPlayer में पृष्ठभूमि ऑडियो को फिर से शुरू कैसे करें?

मैं रुकावट (जैसे कॉल) के बाद फिर से शुरू पृष्ठभूमि ऑडियो प्लेबैक के लिए कई घंटे के लिए संघर्ष किया गया है

क्या होना चाहिए:

  1. ऑडियो चलता रहता है जब एप्लिकेशन (काम करता है पृष्ठभूमि में चला जाता)
  2. कॉल द्वारा बाधित होने पर, रुकावट के लिए अधिसूचना प्राप्त करें (काम करता है)
  3. जब कॉल समाप्त होता है, रुकावट के लिए नोटिफिकेशन प्राप्त होता समाप्त होता है (काम)
  4. फिर से शुरू ऑडियो चला रहा (काम नहीं करता है - कुछ भी नहीं सुनना)

सच किसी भी मदद की सराहना करते हैं! धन्यवाद

नोट्स:

  1. एप्लिकेशन पृष्ठभूमि ऑडियो के लिए पंजीकृत है और रुकावट से पहले ठीक निभाता है
  2. मैं खेल फिर से शुरू करने के साथ और समय देरी के बिना की कोशिश की है - न तो काम

कोड:

import UIKit 
import AVFoundation 

var player: AVQueuePlayer! 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
      try AVAudioSession.sharedInstance().setActive(true, withOptions: .NotifyOthersOnDeactivation) 
     } catch { } 
     let songNames = ["music"] 
     let songs = songNames.map { AVPlayerItem(URL: 
      NSBundle.mainBundle().URLForResource($0, withExtension: "mp3")!) } 
     player = AVQueuePlayer(items: songs) 

     let theSession = AVAudioSession.sharedInstance() 
     NSNotificationCenter.defaultCenter().addObserver(self, 
      selector:"playInterrupt:", 
      name:AVAudioSessionInterruptionNotification, 
      object: theSession) 

     player.play() 
    } 

    func playInterrupt(notification: NSNotification) { 

     if notification.name == AVAudioSessionInterruptionNotification 
      && notification.userInfo != nil { 

      var info = notification.userInfo! 
      var intValue: UInt = 0 
      (info[AVAudioSessionInterruptionTypeKey] as! NSValue).getValue(&intValue) 
      if let type = AVAudioSessionInterruptionType(rawValue: intValue) { 
       switch type { 
       case .Began: 
        print("aaaaarrrrgggg you stole me") 
        player.pause() 

       case .Ended: 
        let timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: "resumeNow:", userInfo: nil, repeats: false) 
       } 
      } 
     } 
    } 
    func resumeNow(timer : NSTimer) { 
     player.play() 
     print("attempted restart") 
    } 
} 
+0

तरीकों ठीक से कहा जाता है करता है? विशेष रूप से फिर से शुरू करें विधि। –

+0

हां - मुझे कॉल समाप्त होने के 3 सेकंड बाद "पुनः प्रारंभ करने का प्रयास" दिखा रहा है। –

उत्तर

4

अंत में यह मिला!

समाधान:।

AVAudioSession.sharedInstance() setCategory (AVAudioSessionCategoryPlayback, withOptions: AVAudioSessionCategoryOptions.MixWithOthers)

1

मैंने इस तरह एक कोड लिखा और फोन कॉल समाप्त होने से ऑडियो को सफलतापूर्वक फिर से शुरू किया। मैं एक्सकोड 6.4 पर बनाया गया था और ऐप को अपने आईफोन 4 एस पर चलाया।

var player: AVQueuePlayer! = nil 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func viewDidAppear(animated: Bool) 
{ 
    super.viewDidAppear(true) 

    var song = AVPlayerItem(URL: NSBundle.mainBundle().URLForResource("AlmostAYearAgo", withExtension: "mp3")!) 
    player = AVQueuePlayer(items: [song]) 

    let theSession = AVAudioSession.sharedInstance() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "playInterrupt:", name: AVAudioSessionInterruptionNotification, object: theSession) 

    player.play() 
} 

override func didReceiveMemoryWarning() 
{ 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func playInterrupt(notification: NSNotification) 
{ 
    if notification.name == AVAudioSessionInterruptionNotification && notification.userInfo != nil 
    { 
     var info = notification.userInfo! 
     var intValue: UInt = 0 

     (info[AVAudioSessionInterruptionTypeKey] as! NSValue).getValue(&intValue) 

     if let type = AVAudioSessionInterruptionType(rawValue: intValue) 
     { 
      switch type 
      { 
      case .Began: 
       print("aaaaarrrrgggg you stole me") 
       player.pause() 
      case .Ended: 
       let timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: "resumeNow:", userInfo: nil, repeats: false) 
      } 
     } 
    } 
} 

func resumeNow(timer : NSTimer) 
{ 
    player.play() 
    print("attempted restart") 
} 
+0

कोशिश की, लेकिन ऐसा कुछ नहीं लगता है। ऑडियो अभी भी फिर से शुरू नहीं होता है। –

+0

आपने कोड कहां रखा? –

+0

दोनों में: केस। एंडेड और फिर से शुरू करें प्लेयर.प्ले() से पहले अभी आप इसे काम करने में कामयाब रहे हैं? –

-1

साइमन, बिल्कुल यह मेरी अंत पर इस बात की पुष्टि setCategory लाइन को बदलने के होने के लिए द्वारा mixable विकल्प जोड़ । मैं इसे देखने के लिए 2 दिन बिताता हूँ! यदि आप का उपयोग केवल:

AVAudioSession.sharedInstance() setCategory (AVAudioSessionCategoryPlayback) तो कोई फर्क नहीं पड़ता कि आप क्या करते अपने खिलाड़ी ऑडियो चला रहा फिर से शुरू नहीं होगा यदि आप के बजाय का उपयोग करें:।।

AVAudioSession.sharedInstance() setCategory (AVAudioSessionCategory प्लेबैक, ऑप्शन के साथ: AVAudioSessionCategoryOptions.MixWithOthers)

तो यह सही की तरह काम करता है और ऐप पृष्ठभूमि में होने पर फोन कॉल प्राप्त करने के बाद फिर से शुरू होगा।

धन्यवाद!

+0

साइमन, यह सुनिश्चित नहीं है कि आपने देखा है लेकिन यह कामकाजी समाधान नहीं है। मैंने सोचा कि समाधान काम कर रहा था लेकिन जब आप इसका उपयोग करते हैं: AVAudioSession.sharedInstance()। SetCategory (AVAudioSessionCategory प्लेबैक, साथ पेंशन: AVAudioSessionCategoryOptions.MixWithOthers तो आपका प्लेयर दूसरों के साथ मिल जाएगा। एक ही समय में संगीत ऐप को तारांकित करने का प्रयास करें। आपको एक ही समय में खेलने और मिश्रण करने के लिए 2 आवाज़ें मिलेंगी। यह पृष्ठभूमि में कॉल के बाद फिर से शुरू करने के लिए काम करता है लेकिन यह आपकी आवाज के पूरे प्लेबैक को गड़बड़ कर देता है। किसी को भी कोई विचार कृपया? – awindsurfer

+0

जिस चीज को हम याद कर रहे थे वह स्वयं था। बेस्ट फर्स्ट रेस्पॉन्डर() एक बार जो जोड़ा गया था, पूरी चीज मेरे लिए काम करना शुरू कर दी थी। – awindsurfer

+0

जानना अच्छा है, धन्यवाद। मुझे इसकी आवश्यकता नहीं है क्योंकि मेरा ऐप एक मूक ध्यान ऐप है और वे स्वयं ऑडियो को मिश्रित नहीं करेंगे, इसलिए उस विकल्प का परीक्षण नहीं किया गया था। –

0

मुझे अंत रुकावट के बाद खिलाड़ी को फिर से लोड करने के लिए समस्या का समाधान:

func interruptionNotification(_ notification: Notification) { 
    guard let type = notification.userInfo?[AVAudioSessionInterruptionTypeKey] as? UInt, 
     let interruption = AVAudioSessionInterruptionType(rawValue: type) else { 
     return 
    } 
    if interruption == .ended && playerWasPlayingBeforeInterruption { 
     player.replaceCurrentItem(with: AVPlayerItem(url: radioStation.url)) 
     play() 
    } 
    } 
संबंधित मुद्दे

 संबंधित मुद्दे