【问题标题】:Upload Video to YouTube in Swift在 Swift 中将视频上传到 YouTube
【发布时间】:2016-05-05 08:28:26
【问题描述】:

编辑:仍然经常检查这个问题,当我或其他人帮助我解决这个问题时,将标记为已解决!

我正在尝试通过 Swift 使用 YouTube 的 REST API 将视频上传到 YouTube,但我很难弄清楚该怎么做。我目前有一个有效的 GET 请求。

我对应该如何构建 POST 请求 URL 以及文件位置在请求中的位置感到困惑。另外我认为我应该使用可恢复上传协议?

我已经在各种 API 和文档中苦苦挣扎了 2 天,感到绝望。

这是我的 GET 请求的工作代码。

func getRequestVideoInfo(){
    // Set up your URL
    let youtubeApi = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails%2C+snippet%2C+statistics&id=AKiiekaEHhI&key=" + apiKey
    let url = NSURL(string: youtubeApi)

    // Create your request
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
        do {
            if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as? [String : AnyObject] {

                print("Response from YouTube: \(jsonResult)")
            }
        }
        catch {
            print("json error: \(error)")
        }

    })

    // Start the request
    task.resume()
}

【问题讨论】:

    标签: swift rest video youtube upload


    【解决方案1】:

    导入谷歌登录

    导入 GoogleAPIClientForREST

    private let scopes = [kGTLRAuthScopeYouTube,
                          kGTLRAuthScopeYouTubeForceSsl,
                          kGTLRAuthScopeYouTubeUpload,
                          kGTLRAuthScopeYouTubeYoutubepartner]
    
    private var service = GTLRYouTubeService()
    private let youtubeObject = GTLRYouTube_Video()
    
    func signInYoutube(){
        GIDSignIn.sharedInstance()?.presentingViewController = self
        GIDSignIn.sharedInstance()?.clientID = "Your_client_id"
        GIDSignIn.sharedInstance().delegate = self
        GIDSignIn.sharedInstance().scopes = scopes
         if GIDSignIn.sharedInstance()?.hasPreviousSignIn() ?? false {
             GIDSignIn.sharedInstance()?.restorePreviousSignIn()
         } else {
             GIDSignIn.sharedInstance()?.signIn()
         }
    }
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
         if let error = error {
            self.service.authorizer = nil
           } else {
                self.service.authorizer = user.authentication.fetcherAuthorizer()
               uploadVideoOnYoutube()
           }
    }
      func uploadVideoOnYoutube() {
            guard let videoUrl = Bundle.main.url(forResource: "sample_iTunes", withExtension: "mov")else {return}
    
            //Status
            let status = GTLRYouTube_VideoStatus()
            status.privacyStatus = kGTLRYouTube_ChannelStatus_PrivacyStatus_Public
            //Snippet
            let snippet = GTLRYouTube_VideoSnippet()
            snippet.title = "YOUR_VIDEO_TITLE"
    
            //Upload parameters
            let params = GTLRUploadParameters.init(fileURL: videoUrl, mimeType: "video/mov")
    
            //YouTube Video object
            youtubeObject.status = status
            youtubeObject.snippet = snippet
    
            let query = GTLRYouTubeQuery_VideosInsert.query(withObject: youtubeObject, part: "snippet,status", uploadParameters: params)
    
            service.executeQuery(query, completionHandler: { (ticket, anyobject, error) in
                if error == nil {
                if let videoObject = anyobject as? GTLRYouTube_Video {
                    print(videoObject.identifier ?? "upload")
                }
         } else {
                    print(error?.localizedDescription)
            }
        })
    
    }
    

    【讨论】:

    • 感谢您分享出色的代码。但我想知道当我只想上传视频时是否应该获得 Youtube 的许可。因为当我调用uploadVideoOnYoutube 时,出现错误401。这意味着unauthorized。如果你知道答案,请帮助我。谢谢!
    • Permissions 是您已经设置在顶部的 Scope。
    • 我的意思是如果我只需要uploadVideoOnYoutube 方法,那么我不需要创建signInYoutube 并为GIDSignIn 设置范围。所以我把 apiKey 放入GTLRYouTubeService。然后我收到 HTTP 错误 401。但你的意思是我应该将范围设置为 GIDSignIn,即使我不需要提供 Google 登录以供使用?
    • + 我发现如果我使用GTLRYouTubeService,用户想要在 youtube 上上传视频时应该登录。那么还有其他方法可以在 youtube 应用程序上上传视频吗?我使用了通用链接打开网址youtube://upload,但它无法选择特定内容。如果您知道解决方案,请告诉我。谢谢!
    【解决方案2】:

    请注意(截至 2019 年 10 月 6 日) YouTube 已将 API 配额减少到每天 10,000 个单位。这相当于在 24 小时内上传 4 个 YouTube 视频。如果您的应用程序用例依赖于上传许多 YouTube 视频,我强烈建议您重新考虑。您可以申请扩大您的每日配额,但众所周知,Google 回复您的速度很慢,如果他们愿意的话。


    是的,您需要在 YouTube 中创建一个应用/项目并使用 OAuth 2.0 流程将视频发布/插入到您获得授权访问的频道。

    一旦你从谷歌获得访问令牌

    按如下方式使用 Alamofire:

    func postVideoToYouTube(token: String, callback: Bool -> Void){
    
        let headers = ["Authorization": "Bearer \(token)"]
    
        let path = NSBundle.mainBundle().pathForResource("video", ofType: "mp4")
        let videodata: NSData = NSData.dataWithContentsOfMappedFile(path!)! as! NSData
        upload(
            .POST,
            "https://www.googleapis.com/upload/youtube/v3/videos?part=id",
            headers: headers,
            multipartFormData: { multipartFormData in
                multipartFormData.appendBodyPart(data: videodata, name: "video", fileName: "video.mp4", mimeType: "application/octet-stream")
            },
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .Success(let upload, _, _):
                    upload.responseJSON { request, response, error in
                        print(response)
                        callback(true)
                    }
                case .Failure(_):
                    callback(false)
                }
            })
    }
    

    像这样调用 post 函数:

    postVideoToYouTube(accessToken, callback: { success in
    if success { }
    })
    

    【讨论】:

    • 1) 您是否在 Google Developers Console 中创建了一个 iOS 项目 2) 您是否在应用程序的 info.plist 中设置并配置了一个 URL Scheme 作为重定向 URI 的 CFBundleURLSchemes,3) 您是否有你的谷歌项目的客户端 ID 和客户端密码吗?
    • developers.google.com/youtube/v3/docs/videos/insert。如本指南链接所述,使用 POST 插入视频需要授权。
    • 1) 是的。 2)如果您的意思是捆绑ID,那么是的。 3) 是的。
    • 查看我上面的编辑以获取使用 Alamofire 的 POST 示例
    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2012-03-07
    • 2018-07-24
    • 2019-09-24
    • 2012-11-01
    • 2015-01-10
    • 2013-04-04
    相关资源
    最近更新 更多