Swift:在设备上保存音频的时间要长2倍

时间:2014-11-05 20:34:55

标签: ios xcode audio swift

我遇到问题:在Documents文件夹中下载的音乐是2倍长,尺寸更大。它也有比特率问题(增加/减少2倍)。图片保存得很好,但任何音乐都有问题。也许我需要手动设置音频比特率,但我还没有找到如何做到这一点。

以下是代码:

var file = NSFileHandle()

override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func touchBut(sender: UIButton) {
    var items = NSMutableArray()
    var path: String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0].stringByAppendingPathComponent("mus4.mp3")
    var err: NSError?
    if NSFileManager.defaultManager().fileExistsAtPath(path) {
        dump(path)
        println("already be")
    } else {
        var url = NSURL(string: "http://data.iplayer.fm/file/ia76k50/104678741/177398297/Sayyod_-_Kerakmas_(iPlayer.fm).mp3")!
        var request = NSURLRequest(URL: url)
        var connection = NSURLConnection(request: request, delegate: self)
        if (connection != nil) {
            NSFileManager.defaultManager().createFileAtPath(path, contents: nil, attributes: nil)
            self.file = NSFileHandle(forUpdatingAtPath: path)!
        }
        println("ok")
    }
}

func connection(connection: NSURLConnection, didReceiveData data: NSData) {
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    file.seekToEndOfFile()
    var receivedData: NSMutableData = NSMutableData(data: data)
    receivedData.appendData(data)
    file.writeData(receivedData)
}

func connectionDidFinishLoading(connection: NSURLConnection) {
    file.closeFile()
    UIApplication.sharedApplication().networkActivityIndicatorVisible = false
}

func connection(connection: NSURLConnection, didFailWithError error: NSError) {
    println(error)
    file.closeFile()
    UIApplication.sharedApplication().networkActivityIndicatorVisible = false
}

P.S。我是新手

1 个答案:

答案 0 :(得分:2)

我真的生气了(多年来没有回答任何问题,我不得不从编码中休息一下),但看起来你正在创建一个数据对象(receivedData)另一个数据对象(数据)的内容,然后将源数据对象(数据)的内容附加到新的数据对象(receivedData) - 如果这听起来有点混乱,那就是因为它是:

    ...
    var receivedData: NSMutableData = NSMutableData(data: data)
    receivedData.appendData(data)
  1. 您正在创建您的" receivedData"对象通过用"数据"的内容初始化它。论点。结果是你基本上复制了"数据"的内容。对象进入" receivedData"对象

  2. 之后,您追加来自"数据的数据"参数" receivedData"。因为" receivedData"已包含"数据"的内容对象由于你初始化" receivedData",你的" receivedData"对象最终拥有"数据"的内容复制到其中两次

  3. 简单来说,你的文件是你预期的两倍的原因是它 是你预期的两倍。您正在从另一块数据中创建一大块数据,然后您将相同的数据块添加回自身。

    请改为尝试:

        ...
        // Delete the previous two lines
        file.writeData(data)
    

    当你完成后,你应该拥有:

    func connection(connection: NSURLConnection, didReceiveData data: NSData) {
        UIApplication.sharedApplication().networkActivityIndicatorVisible = true
        file.seekToEndOfFile()
        file.writeData(data)
    }
    

    如果以上代码有效(提醒:我已经暂时退出游戏,而且我是Swift的新手),那么您的文件应该是您期望的大小它是。

    如果代码不起作用,我希望这些解释可以帮助您理解为什么您的代码生成的文件应该是它应该的两倍大。

    此外,这有点偏离主题,请考虑重新考虑您的networkActivityIndi​​cator代码。开始下载时打开指示灯,然后在下载完成或失败时将其关闭。

    祝你好运:)