ios - Swift:AVAssetResourceLoader 不播放来自 URL 的音频

标签 ios swift avasset

我正在尝试使用 AVAssetResourceLoader 从 URL 流式传输一个小音频剪辑,但是当我尝试在控制台中打印它时,我可以看到正确识别的 mime 类型和内容。但是,它没有播放音频。有人可以看看它并告诉我我哪里出错了。

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 流式传输视频?

提前致谢

最佳答案

不应将以下代码放在 urlseesion dataReceive 数据函数中:

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

` 他们将停止请求工作并阻止您接收更多数据。

关于ios - Swift:AVAssetResourceLoader 不播放来自 URL 的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42724181/

相关文章:

ios - pressGestureRecognizer 和 touchesBegan

ios - "process launch failed: failed to get the task for process"带有临时应用程序

ios - 通过 iPhone 的 IP 地址进行地理定位

json - 使用 swiftyJSON 和 TRON 重新加载 UICollectionview

swift - 继续使用 NSbutton Swift 的下一个索引

AVFoundation - 只合并第一个显示的视频

iOS 7 AVPlayer AVPlayerItem 持续时间在 iOS 7 中不正确

ios - AVAsset 的 NaturalSize 与视频文件不同

iphone - 关键帧动画期间应用程序崩溃 : -[NSConcreteValue doubleValue] unrecognized selector

ios - 如何在 Swift 中创建一个空数组?