Как изменить формат видео после загрузки в swift - PullRequest
0 голосов
/ 18 января 2019

У меня проблема с изменением формата видео после загрузки с видеоплейбэка в mp4 и сохранения на камеру.

Это мой код загрузки, но я скачал некоторые видео с другим примером формата: «видеоплейбэк».Я не могу сохранить на камеру, потому что хочу изменить формат видео на mp4.

enter image description here

func SessionDownload(URLSession : String) {
    MBProgressHUD.hideAllHUDs(for: view, animated: true)

    let hud =  MBProgressHUD.showAdded(to: self.view, animated: true)
    // Set the bar determinate mode to show task progress.
    progress = 0.0
    hud?.mode = MBProgressHUDMode.determinateHorizontalBar
    hud?.isUserInteractionEnabled = true;
    hud?.labelText = NSLocalizedString("Downloading...", comment: "HUD loading title")
    DispatchQueue.global(qos: .default).async(execute: {() -> Void in
        // Do something useful in the background and update the HUD periodically.
        self.doSomeWorkWithProgress()
        DispatchQueue.main.async(execute: {() -> Void in
            //hud?.hide(true)
            hud?.labelText = NSLocalizedString("Just Wait...", comment: "HUD loading title")
        })
    })



    let videoPath = URLSession
    print(videoPath)

    let s = videoPath
    let url = NSURL(string:s)!
    let req = NSMutableURLRequest(url:url as URL)
    let config = URLSessionConfiguration.default
    let task = self.session.downloadTask(with: req as URLRequest)
    self.task = task
    task.resume()

}

//MARK:- share video
func doSomeWorkWithProgress() {
    // This just increases the progress indicator in a loop.
    while progress < 1.0 {
        DispatchQueue.main.async(execute: {() -> Void in

            print(self.progress)
            MBProgressHUD(for: self.view).progress = self.progress
        })
        usleep(50000)
    }
}

//MARK:- URL Session delegat
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
    print("downloaded \(100*totalBytesWritten/totalBytesExpectedToWrite)")
    taskTotalBytesWritten = Int(totalBytesWritten)
    taskTotalBytesExpectedToWrite = Int(totalBytesExpectedToWrite)
    percentageWritten = Float(taskTotalBytesWritten) / Float(taskTotalBytesExpectedToWrite)
    print(percentageWritten)

    let x = String(format:"%.2f", percentageWritten)
    print(x)
    self.progress = Float(x)!
    print(progress)

}

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) {
    // unused in this example
}

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
    print("completed: error: \(error)")
}

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
    print("Finished downloading!")
    let fileManager = FileManager()
    // this can be a class variable
    let directoryURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]


    print(directoryURL)
    let docDirectoryURL = NSURL(fileURLWithPath: "\(directoryURL)")
    print(docDirectoryURL)


    //Save To Photos
    PHPhotoLibrary.shared().performChanges({
        PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL:directoryURL)
    }) { saved, error in
        if saved {
            let alertController = UIAlertController(title: "Your video was successfully saved", message: nil, preferredStyle: .alert)
            let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil)
            alertController.addAction(defaultAction)
            self.present(alertController, animated: true, completion: nil)
        }
    }



    let destinationFilename = downloadTask.originalRequest?.url?.lastPathComponent
    print(destinationFilename!)
    // append that to your base directory
    let destinationURL =  docDirectoryURL.appendingPathComponent("\(destinationFilename!)")
    print(destinationURL!)
    /* check if the file exists, if so remove it. */
    if let path = destinationURL?.path {
        if fileManager.fileExists(atPath: path) {
            do {
                try fileManager.removeItem(at: destinationURL!)

            } catch let error as NSError {
                print(error.debugDescription)
            }

        }
    }

    do
    {
        try fileManager.copyItem(at: location, to: destinationURL!)
    }
    catch {
        print("Error while copy file")

    }
    DispatchQueue.main.async(execute: {() -> Void in
        MBProgressHUD.hide(for: self.view, animated: true)
    })
    // let videoLink = NSURL(fileURLWithPath: filePath)
    let objectsToShare = [destinationURL!] //comment!, imageData!, myWebsite!]
    let activityVC = UIActivityViewController(activityItems: objectsToShare , applicationActivities: nil)
    activityVC.setValue("Video", forKey: "subject")
    //New Excluded Activities Code
    if #available(iOS 9.0, *) {
        activityVC.excludedActivityTypes = [UIActivity.ActivityType.airDrop, UIActivity.ActivityType.addToReadingList, UIActivity.ActivityType.assignToContact, UIActivity.ActivityType.copyToPasteboard, UIActivity.ActivityType.mail, UIActivity.ActivityType.message, UIActivity.ActivityType.openInIBooks, UIActivity.ActivityType.postToTencentWeibo, UIActivity.ActivityType.postToVimeo, UIActivity.ActivityType.postToWeibo, UIActivity.ActivityType.print]
    } else {
        // Fallback on earlier versions
        activityVC.excludedActivityTypes = [UIActivity.ActivityType.airDrop, UIActivity.ActivityType.addToReadingList, UIActivity.ActivityType.assignToContact, UIActivity.ActivityType.copyToPasteboard, UIActivity.ActivityType.mail, UIActivity.ActivityType.message, UIActivity.ActivityType.postToTencentWeibo, UIActivity.ActivityType.postToVimeo, UIActivity.ActivityType.postToWeibo, UIActivity.ActivityType.print ]
    }
    if let popoverController = activityVC.popoverPresentationController {
        popoverController.sourceView = self.BtnDownloadVideo
        popoverController.sourceRect = self.BtnDownloadVideo.bounds

    }
    self.present(activityVC, animated: true, completion: nil)
}

1 Ответ

0 голосов
/ 19 января 2019

Я предполагаю, что когда вы загружаете файл из Интернета, вы уверены, что загружаете видео в этом случае? И что вам действительно нужно, так это просто изменить формат, то есть PathExtension, например .mp4, .png, jpeg и т. Д.

Если (если и только если) это так, то вы можете добавить расширение файла к компоненту пути.

let destinationURL = docDirectoryURL.appendingPathComponent("\(destinationFilename!)").appendingPathExtension("mp4")

Теперь, когда вы проверяете свои сохраненные файлы, он будет содержать «.mp4»

Опять же, я предполагаю, что вы на 110% уверены, что вы загружаете ".mp4" из Интернета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...