Intereting Posts
Доступ к основному изображению страницы wikipedia по API Использование R через PHP Непроверенный флажок, возвращающий нулевое значение Как отправить PHP-массив по форме html по типу POST Почему вы не можете передавать функции MYSQL в подготовленные инструкции PDO? Как подключиться к экземпляру RAD Amazon MySQL через PHP через SSL Выберите результаты, которые будут только между сегодняшним днем ​​и 2 днями в будущем. Как проверить, активен ли статус пользователя в laravel 5.x? Каков наилучший способ создания облака тегов из массива с использованием h1-h6 для определения размера? Удалите некоторую информацию в переменной json с php Класс Wrapper Thread для функции с переменными аргументами в PHP Php: автозаполнение формы с использованием переменных $ _SESSION с несколькими php-файлами как сделать печатную версию веб-страницы? oAuth с PHP (для google api) PHP: упорядочить ассоциативный массив

Получение видео с S3 и загрузка на YouTube в PHP

У меня есть код, который загружает видеофайл на YouTube:

$yt = new Zend_Gdata_YouTube($httpClient); // create a new VideoEntry object $myVideoEntry = new Zend_Gdata_YouTube_VideoEntry(); // create a new Zend_Gdata_App_MediaFileSource object $filesource = $yt->newMediaFileSource('file.mov'); $filesource->setContentType('video/quicktime'); // set slug header $filesource->setSlug('file.mov'); 

У меня есть видео в S3, и я хочу загрузить их на YouTube. Видео в нашей учетной записи S3 является общедоступным, поэтому я могу использовать команду типа wget. Должен ли я запускать команду, которая записывает видеофайл и загружает его локально, прежде чем запускать этот скрипт ( shell_exec("wget ".$s3videoURL) )?

Или я должен попытаться ввести MediaFileSource в качестве URL самого файла S3?

В основном, мне просто нужна стабильность (не решение, подверженное частым тайм-аутам); скорость и локальное хранилище не очень важны (я могу локально удалять видеофайл после его загрузки).

Какой был бы лучший способ сделать это?

Благодаря!

Обновление: я должен, вероятно, упомянуть, что этот скрипт будет загружать около 5 видеороликов на YouTube за выполнение.

Это старый вопрос, но я считаю, что у меня есть лучший ответ.

Вам не нужно записывать видео на жесткий диск, и вы не можете сохранить все это в ОЗУ (я предполагаю, что это большой файл).

Вы можете использовать библиотеки PHP AWS SDK и Google Client для хранения файлов с S3 и отправлять их на YouTube на лету. Используйте метод registerStreamWrapper для регистрации S3 в качестве файловой системы и использования возобновляемых загрузок из API YouTube. Тогда все, что вам нужно сделать, это прочитать фрагменты из S3 с помощью fread и отправить их на YouTube. Таким образом, вы можете даже ограничить использование ОЗУ.

Я предполагаю, что вы создали видеообъект ($ video in code) из класса Google_Video. Это полный код.

 <?php require_once 'path/to/libraries/aws/vendor/autoload.php'; require_once 'path/to/libraries/google-client-lib/autoload.php'; use Aws\S3\S3Client; $chunkSizeBytes = 2 * 1024 * 1024; // 2 mb $streamName = 's3://bucketname/video.mp4'; $s3client = S3Client::factory(array( 'key' => S3_ACCESS_KEY, 'secret' => S3_SECRET_KEY, 'region' => 'eu-west-1' // if you need to set. )); $s3client->registerStreamWrapper(); $client = new Google_Client(); $client->setClientId(YOUTUBE_CLIENT_ID); $client->setClientSecret(YOUTUBE_CLIENT_SECRET); $client->setAccessToken(YOUTUBE_TOKEN); $youtube = new Google_YoutubeService($client); $media = new Google_MediaFileUpload('video/*', null, true, $chunkSizeBytes); $filesize = filesize($streamName); // use it as a reguler file. $media->setFileSize($filesize); $insertResponse = $youtube->videos->insert("status,snippet", $video, array('mediaUpload' => $media)); $uploadStatus = false; $handle = fopen($streamName, "r"); $totalReceived = 0; $chunkBuffer = ''; while (!$uploadStatus && !feof($handle)) { $chunk = fread($handle, $chunkSizeBytes); $chunkBuffer .= $chunk; $chunkBufferSize = strlen($chunkBuffer); if($chunkBufferSize > $chunkSizeBytes) { $fullChunk = substr($chunkBuffer, 0, $chunkSizeBytes); $leapChunk = substr($chunkBuffer, $chunkSizeBytes); $uploadStatus = $media->nextChunk($insertResponse, $fullChunk); $totalSend += strlen($fullChunk); $chunkBuffer = $leapChunk; echo PHP_EOL.'Status: '.($totalReceived).' / '.$filesize.' (%'.(($totalReceived / $filesize) * 100).')'.PHP_EOL; } $totalReceived += strlen($chunk); } $extraChunkLen = strlen($chunkBuffer); $uploadStatus = $media->nextChunk($insertResponse, $chunkBuffer); $totalSend += strlen($chunkBuffer); fclose($handle); 

«MediaFileSource» должен быть реальным файлом. Он не будет использовать URL-адрес, поэтому вам нужно будет скопировать видео на ваш сервер с S3, прежде чем отправлять их на YouTube.

Вероятно, вы можете уйти с «shell_exec», если ваше использование светлое, но по целому ряду причин его, вероятно, лучше использовать либо службу Zend S3 , либо cURL, чтобы вытащить файлы из S3.

$ chunkSizeBytes = 2 * 1024 * 1024; // 2 мб

  $s3client = $this->c_aws->getS3Client(); $s3client->registerStreamWrapper(); try { $client = new \Google_Client(); $client->setAccessType("offline"); $client->setApprovalPrompt('force'); $client->setClientId(GOOGLE_CLIENT_ID); $client->setClientSecret(GOOGLE_CLIENT_SECRET); $token = $client->fetchAccessTokenWithRefreshToken(GOOGLE_REFRESH_TOKEN); $client->setAccessToken($token); $youtube = new \Google_Service_YouTube($client); // Create a snippet with title, description, tags and category ID // Create an asset resource and set its snippet metadata and type. // This example sets the video's title, description, keyword tags, and // video category. $snippet = new \Google_Service_YouTube_VideoSnippet(); $snippet->setTitle($title); $snippet->setDescription($summary); $snippet->setTags(explode(',', $keywords)); // Numeric video category. See // https://developers.google.com/youtube/v3/docs/videoCategories/list 

// $ snippet-> setCategoryId ("22");

  // Set the video's status to "public". Valid statuses are "public", // "private" and "unlisted". $status = new \Google_Service_YouTube_VideoStatus(); $status->privacyStatus = "public"; // Associate the snippet and status objects with a new video resource. $video = new \Google_Service_YouTube_Video(); $video->setSnippet($snippet); $video->setStatus($status); // Setting the defer flag to true tells the client to return a request which can be called // with ->execute(); instead of making the API call immediately. $client->setDefer(true); $insertRequest = $youtube->videos->insert("status,snippet", $video); $media = new \Google_Http_MediaFileUpload( $client, $insertRequest, 'video/*', null, true, $chunkSizeBytes ); $result = $this->c_aws->getAwsFile($aws_file_path); $media->setFileSize($result['ContentLength']); $uploadStatus = false; // Seek to the beginning of the stream $result['Body']->rewind(); // Read the body off of the underlying stream in chunks while (!$uploadStatus && $data = $result['Body']->read($chunkSizeBytes)) { $uploadStatus = $media->nextChunk($data); } $client->setDefer(false); if ($uploadStatus->status['uploadStatus'] == 'uploaded') { // Actions to perform for a successful upload $uploaded_video_id = $uploadStatus['id']; return ($uploadStatus['id']); } }catch (\Google_Service_Exception $exception){ return ''; print_r($exception); }