Как загрузить БОЛЬШИЕ файлы на YouTube

Я пробовал два способа загрузки больших файлов на YouTube, но ни один из них не работает, у каждого свои проблемы, моя цель — найти правильный ответ на загрузку больших файлов.

Первый метод:

Он разбивает большие файлы на разные части и вместо того, чтобы отправлять их по отдельности и загружать сразу, загружает их по отдельности. Итак, в конце у меня есть длинный список выгружаемых различных частей файла на Youtube, а не один файл.

Код метода 1

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);
}

Я нашел этот вопрос, код ответа на который похож на google_mediaFileupload, но я не уверен, как его использовать.

Второй способ

Я также пытаюсь использовать возобновляемую загрузку для их загрузки, но когда я использую следующий код, возникает следующая ошибка:

Код метода 2

<?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>";
}



?>

Ошибка метода 2

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

Обратите внимание, я дал 50 вознаграждений за один из ответов за решение одной из проблем кода. Хотя проблема еще не полностью решена.


person Community    schedule 01.06.2013    source источник


Ответы (3)


Вы забыли установить ключ API и можете использовать возобновляемую загрузку.

person J888    schedule 09.06.2013
comment
Ключ API и идентификатор клиента, секрет - это разные вещи. Если вы используете ключ API, вы можете совершать вызовы без даты пользователя, и вам не нужно использовать идентификатор клиента и секрет. Когда вы их используете, вы можете получить доступ как к общедоступным данным, так и к пользовательским данным, и вам не понадобится ключ API. Ключ API предназначен для простого доступа. - person Ibrahim Ulukaya; 09.06.2013
comment
@IbrahimUlukaya, так что ты предлагаешь? - person J888; 10.06.2013
comment
Если вы правильно создали свой проект в консоли разработчика, включили API данных YouTube, использовали последнюю клиентскую библиотеку и скопировали свой идентификатор и секрет клиента, это должно работать. Нет необходимости в ключе API. Ключ API предназначен только для простого доступа (вещи, для которых вам не нужно будет входить в систему, например поиск общедоступных видео). Я протестировал пример 1 и работал без проблем. - person Ibrahim Ulukaya; 13.06.2013

Вам следует создать проект в консоли разработки и получить идентификатор клиента и секрет от ту консоль.

Руководство по началу работы содержит всю информацию.

Сначала вы начнете с регистрации приложения.

Также вы можете посмотреть это видео, чтобы узнать, как это сделать.

person Ibrahim Ulukaya    schedule 02.06.2013
comment
Я не понимаю вас, не могли бы вы дать мне пример или образец кода? - person ; 03.06.2013
comment
Дело не в коде, прочтите этот документ и применяйте каждый шаг перед кодом. developers.google.com/youtube/v3/getting-started - person Ibrahim Ulukaya; 03.06.2013
comment
хорошо, но не решает проблему - person ; 04.06.2013
comment
Итак, вы создали свой проект в консоли разработки и включили Data AAPI v3 из API. Затем вы использовали идентификатор клиента и секрет и заменили их внутри этого кода, верно? А какая часть не работает? - person Ibrahim Ulukaya; 04.06.2013
comment
Он сталкивается со следующей ошибкой (403) Доступ не настроен - person ; 05.06.2013
comment
Вы уверены, что под той же учетной записью выполнили все описанные выше действия и включили Data API v3? - person Ibrahim Ulukaya; 05.06.2013
comment
Также это видео может помочь вам youtube.com/watch?v=GNRMeaz6QRI - person Ibrahim Ulukaya; 06.06.2013
comment
Спасибо, но я уже посмотрел это видео и прочитал всю документацию. - person J888; 10.06.2013
comment
Вопрос @IbrahimUlukaya обновлен. - person ; 10.06.2013

Сейчас клиентская библиотека PHP поддерживает возобновляемую загрузку, но большинство загрузки в любом случае происходят из прямой загрузки.

Нужно просто установить параметр в конструктор Google_MediaFileUpload.

Пример использования класса здесь соответствующая строка:

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

Для аутентификации вы можете использовать примеры, подобные этот. Попробуйте создать установленное приложение и другое, используйте этот идентификатор клиента и секрет во время локального тестирования.

person Ibrahim Ulukaya    schedule 10.06.2013
comment
Спасибо за ваш ответ, приведенный вами пример - это именно то, что я использую, проблема этого кода в том, что он не размещает фрагменты, которые он публикует, каждый отдельно. поэтому в конце я найду длинный список различных частей файла в моей учетной записи YouTube. Однако, поскольку каждый из них является частью исходного файла, ни один из них не работает. - person ; 11.06.2013
comment
Если вы видите мой пример выше, он устанавливает для возобновляемых загрузок значение true, тогда как в предыдущем вопросе stackoverflow это не так. Если вы установите этот параметр, например $media = new Google_MediaFileUpload('video/mp4', null, true, $chunkSizeBytes); это будет действовать как одна загрузка - person Ibrahim Ulukaya; 11.06.2013
comment
Сравнив мой код с вашим и с конструктором, я не нашел никакой разницы с моим кодом. о какой разнице вы говорите? - person ; 11.06.2013
comment
Кроме того, почему вы предлагаете мне использовать установленные приложения для тестирования? - person ; 12.06.2013
comment
Если вы тестируете его локально, вы получаете токен, а не веб-сервер. - person Ibrahim Ulukaya; 12.06.2013
comment
Я использовал это, но все та же проблема - person ; 13.06.2013
comment
Хорошо, я проверю тот же метод и файл внутри, если это ошибка. - person Ibrahim Ulukaya; 13.06.2013
comment
Я скопировал первый опубликованный вами метод. Включена аутентификация из code.google. com/p/youtube-api-samples/source/browse/samples/php/ (первые 40 строк). Заменил мой идентификатор клиента и секрет. Он хорошо работал для файла mp4 размером 15 МБ. Не установлен ключ API или что-то в этом роде. - person Ibrahim Ulukaya; 13.06.2013
comment
Убедитесь, что вы используете последнюю версию клиентской библиотеки с сайта code.google.com. /p/google-api-php-клиент - person Ibrahim Ulukaya; 13.06.2013