2017-03-10 15 views
1

AVAssetResourceLoaderを使用してURLから小さなオーディオクリップをストリーミングしようとしていますが、コンソールで印刷しようとすると正しく識別されています。しかし、それはオーディオを再生していません。誰かがそれを見て、どこに間違っているのか教えてもらえますか?Swift:AVAssetResourceLoaderがURLからオーディオを再生していない

import UIKit 
import AVFoundation 
import MobileCoreServices 

class DetailViewController: UIViewController, AVAssetResourceLoaderDelegate, URLSessionDelegate, URLSessionDataDelegate { 
var player:AVPlayer = AVPlayer() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    session = Foundation.URLSession(configuration: URLSessionConfiguration.background(withIdentifier: "ident"), delegate: self, delegateQueue: OperationQueue.main) 
} 

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

@IBAction func doTapped(_ sender: AnyObject) { 
    print("beginning") 
    setupSession() 

    let asset = AVURLAsset(url: URL(string: "testing-http://mp3.ffh.de/radioffh/livestream.mp3")!) // This can be replaced by any other api stream 
    asset.resourceLoader.setDelegate(self, queue: DispatchQueue.main) 
    let playerItem = AVPlayerItem(asset: asset) 

    player = AVPlayer(playerItem: playerItem) 
    player.actionAtItemEnd = AVPlayerActionAtItemEnd.none 
    player.play() 

    print("done") 
} 

@IBAction func playTapped(_ sender: AnyObject) { 
    print(player.rate) 
} 

@IBAction func testTapped(_ sender: AnyObject) { 
    print(player.currentItem?.loadedTimeRanges.first?.timeRangeValue.start.seconds) 
} 

func setupSession(){ 
    let session = AVAudioSession.sharedInstance() 
    do{ 
     try session.setCategory(AVAudioSessionCategoryPlayback) 
     try session.setActive(true) 
     print("set up") 
    }catch let err as NSError{ 
     print("error setting up session:", err) 
    } 
} 

// RESOURCE LOADER 
var request:AVAssetResourceLoadingRequest? 

func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool { 
    print("lR:", loadingRequest) 
    self.request = loadingRequest 
    let task = session.dataTask(with: URL(string: (loadingRequest.request.url?.absoluteString.replacingOccurrences(of: "testing-", with: ""))!)!) 
    task.resume() 
    return true 
} 

// URL SESSION DATA 
var session:Foundation.URLSession! 

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) { 
    //print("resp:", response) 
    completionHandler(.allow) 
} 

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { 
    if let request = request, let dataRequest = request.dataRequest{ 
     let neededData = dataRequest.requestedLength - Int(dataRequest.currentOffset) 
     print("the neededdata is \(neededData)") 
     if (data.count >= neededData){ 
      print("finishing") 
      if let contentInformationRequest = request.contentInformationRequest, let mimeType = dataTask.response?.mimeType{ 
       print("finishing 2:", mimeType) 
       contentInformationRequest.contentLength = dataTask.countOfBytesExpectedToReceive 
       if let contentType = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue(){ 
        let contentType = contentType as String 
        print("finishing 3:", contentType) 
        contentInformationRequest.contentType = contentType 
        contentInformationRequest.isByteRangeAccessSupported = true 
       } 
      } 
      dataRequest.respond(with: data.subdata(in: 0..<neededData+1)) 

      dataTask.cancel() 
      request.finishLoading() 
      self.request = nil 
     }else{ 
      dataRequest.respond(with: data) 
     } 
    } 
} 
} 

また、ヘッダー付きのURLから動画をストリーミングする同じ手順に従っていますか?事前

答えて

0

ありがとうございますurlseesion dataReceiveデータ機能に以下のコードを配置しないでください。

dataTask.cancel() 
request.finishingloading() 
self.request = nil 

` 彼らは仕事を要求停止し、より多くのデータを受信できなくなります。

関連する問題