【问题标题】:How to upload LARGE files on YouTube [closed]如何在 YouTube 上上传大文件 [关闭]
【发布时间】:2013-06-01 12:26:22
【问题描述】:

我尝试了两种在 YouTube 上上传大文件的方法,但都没有奏效,每个都有自己的问题,我的目标是找到上传大文件的正确答案。

第一种方法:

它将大文件分成不同的部分,而不是单独发送并立即上传,而是单独上传。所以最后我在 Youtube 上有一长串可卸载的文件的不同部分,而不是单个文件。

方法一的代码

if ($client->getAccessToken()) {
  $videoPath = "path/to/foo.mp4";
  $snippet = new Google_VideoSnippet();
  $snippet->setTitle("Test title2");
  $snippet->setDescription("Test descrition");
  $snippet->setTags(array("tag1", "tag2"));
  $snippet->setCategoryId("22");

  $status = new Google_VideoStatus();
  $status->privacyStatus = "private";

  $video = new Google_Video();
  $video->setSnippet($snippet);
  $video->setStatus($status);

  $chunkSizeBytes = 1 * 1024 * 1024;
  $media = new Google_MediaFileUpload('video/mp4', null, true, $chunkSizeBytes);
  $media->setFileSize(filesize($videoPath));

  $result = $youtube->videos->insert("status,snippet", $video,
      array('mediaUpload' => $media));

  $status = false;
  $handle = fopen($videoPath, "rb");
  while (!$status && !feof($handle)) {
    $chunk = fread($handle, $chunkSizeBytes);
    $uploadStatus = $media->nextChunk($result, $chunk);
  }

  fclose($handle);
}

我找到了这个question,它的答案代码类似于google_mediaFileupload,但我不知道如何使用它。

第二种方法

我也在尝试使用可恢复上传来上传它们,但是当我使用以下代码时,它会遇到以下错误:

方法二代码

<?php
require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_YouTubeService.php';
require_once 'google-api-php-client/src/service/Google_MediaFileUpload.php';
session_start();

$client = new Google_Client();
$client->setApplicationName('Google+ PHP Starter Application');
$client->setClientId('My Client ID');
$client->setClientSecret('My secret code');
$client->setRedirectUri('http://localhost:8888/mymediaapp2/uploadvideo.php');
$client->setDeveloperKey('My developer key');
$client->setScopes("https://www.googleapis.com/auth/youtube.upload");
$youTubeService = new Google_YoutubeService($client);

if (isset($_GET['code'])) {
  $client->authenticate();
  $_SESSION['token'] = $client->getAccessToken();
  $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}

if (isset($_SESSION['token'])) {
  $client->setAccessToken($_SESSION['token']);
}

if ($client->getAccessToken()) {
echo "here";
$json = $client->getAccessToken();
$jsonIterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($json, TRUE)),
    RecursiveIteratorIterator::SELF_FIRST);
$myvar = "";
foreach ($jsonIterator as $key => $val) {
   if($key == "access_token")
    echo "val is" .$val;
}

    $service_url = 'https://www.googleapis.com/upload/youtube/v3/videos?
    uploadType=resumable&part=snippet,status';
    $c = curl_init($service_url);
    $curl_post_data = array(
        "Authorization" => $val,
        "Content-Length" => '255',
        "Content-Type" => 'application/json; charset=UTF-8',
        "X-Upload-Content-Length" => '30000',
        "X-Upload-Content-Type" => 'video/mov'
    );

    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($c, CURLOPT_POST, true);
    curl_setopt($c, CURLOPT_POSTFIELDS, $curl_post_data);
    $curl_resp = curl_exec($c);

    curl_close($c);
    echo $curl_resp;
}else {
  $authUrl = $client->createAuthUrl();
  print "<a href='$authUrl'>upload</a>";
}



?>

方法二的错误

{ "error": { "errors": [ { "domain": "global", "reason": "required", "message": "Login 
Required", "locationType": "header", "location": "Authorization" } ], "code": 401, 
"message": 
"Login Required" } } 

请注意,我已经为解决代码问题之一的答案之一提供了 50 赏金。虽然问题还没有完全解决。

【问题讨论】:

    标签: php upload google-api youtube-api google-api-php-client


    【解决方案1】:

    您应该在 Dev Console 中创建一个项目并从该控制台获取您的客户端 ID 和密码。

    Getting Started Guide 拥有所有信息。

    首先,您将从Registering your Application开始。

    您也可以watch this video 了解如何操作。

    【讨论】:

    • 我不明白,你能给我一个例子或示例代码吗?
    • 与代码无关,请阅读此文档并在代码前应用每个步骤。 developers.google.com/youtube/v3/getting-started
    • 不错,但没有解决问题
    • 因此您在开发控制台中创建了项目并从 API 启用了 Data AAPI v3。然后你使用了客户端 ID 和密码,并在这段代码中替换了它们,对吧?什么是不工作的部分?
    • 这个视频也可以帮助你youtube.com/watch?v=GNRMeaz6QRI
    【解决方案2】:

    目前,PHP client library 支持 Resumable 上传,但大多数大型上传来自直接上传。

    应该只是在constructor of Google_MediaFileUpload中设置一个参数的问题。

    有一个here类的用法示例,相关行是:

    $media = new Google_MediaFileUpload('video/mp4', null, true, $chunkSizeBytes);
    

    对于身份验证,您可以使用this one 中的示例。 尝试创建已安装的应用程序和其他应用程序,在本地测试时使用该客户端 ID 和密码。

    【讨论】:

    • 感谢您的回答,您提供的示例正是我正在使用的,此代码的问题在于,它没有将每个单独发布的块放在一起。所以最后我会在我的 youtube 帐户上找到一长串不同部分的文件。然而,由于每一个都是原始文件的一部分,它们都不起作用。
    • 如果您在上面看到我的示例,它将可恢复上传设置为 true,而在之前的 stackoverflow 问题中则没有。如果您将该参数设置为 $media = new Google_MediaFileUpload('video/mp4', null, true, $chunkSizeBytes);它将作为一个上传
    • 将我的代码与你的代码和构造函数进行比较,我发现我的代码没有任何区别。你指的是什么区别?
    • 另外你为什么建议我使用已安装的应用程序进行测试?
    • 如果您在本地测试它,您会收到返回的令牌,而不是网络服务器
    【解决方案3】:

    您忘记设置 API 密钥,您可以使用可续传。

    【讨论】:

    • API 密钥和客户端 ID、秘密是分开的。如果您使用 API 密钥,您可以在没有用户日期的情况下进行调用,并且不需要使用客户端 ID 和密码。当您使用它们时,您可以访问一般可用的数据以及用户数据,并且不需要 API 密钥。 API 密钥用于简单访问。
    • @IbrahimUlukaya 你有什么建议?
    • 如果您在开发控制台中正确创建了项目,启用了 YouTube 数据 API,使用了最新的客户端库并复制粘贴了您的客户端 ID 和密码,那么应该可以。不需要 API 密钥。 API 密钥仅用于简单访问(您不需要登录的内容,例如搜索公共视频)。我测试了示例 1,并且没有任何问题
    猜你喜欢
    • 2013-08-27
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多