PHP: YouTube v3 API Captions Upload with Sync Flag

За последние пару недель мои сотрудники и я работали над попыткой получить подписки на наших клиентов. Видео YouTube через API v3. Примерно через неделю мы наконец получили возможность загружать субтитры, но YouTube предоставил нам это сообщение в пользовательском интерфейсе «Содержание трека не обрабатывается» и не отображает заголовки, которые мы выгружаем. Однако мы можем загрузить исходный формат, который был загружен; поэтому мы знаем, что файл был загружен успешно.

Мы также смогли получить флаг синхронизации для работы, который говорит, что YouTube запускает транскрипцию и устанавливает тайминги для видео, но на самом деле это не работает. Он возвращается, сообщая нам, что он синхронизируется, но когда мы идем в пользовательский интерфейс для видео, он просто показывает название трека и дает нам сообщение «Трек-контент не обрабатывается». , Мы потратили все часы, которые у нас были, и теперь мы работаем над своим временем, чтобы решить эту проблему, но все равно не повезло.

Кто-нибудь сталкивался с этой проблемой раньше? Если да, то что вы могли сделать, чтобы заставить это работать?

Я опубликую фрагмент кода ниже, который показывает часть загрузки нашего скрипта.

# Insert a video caption. # Create a caption snippet with video id, language, name and draft status. $captionSnippet = new Google_Service_YouTube_CaptionSnippet(); $captionSnippet->setVideoId($videoId); $captionSnippet->setLanguage($captionLanguage); $captionSnippet->setName($captionName); $captionSnippet->setIsDraft( true ); # Create a caption with snippet. $caption = new Google_Service_YouTube_Caption(); $caption->setSnippet($captionSnippet); // Setting the defer flag to true tells the client to return a request which can be called $client->setDefer(false); // Get the file content's of the uploaded file $file = file_get_contents( $captionFile['tmp_name'] ); // Create a request for the API's captions.insert method to create and upload a caption. $insertRequest = $youtube->captions->insert("snippet", $caption, array( 'sync' => true, 'data' => $file, 'mimeType' => 'application/octet-stream', 'uploadType' => 'multipart' ) ); echo '<pre>'; print_r( $insertRequest ); echo '</pre>'; // // Read the caption file and upload it chunk by chunk. $status = $insertRequest; fclose($handle); // If you want to make other calls after the file upload, set setDefer back to false $client->setDefer(false); 

Спасибо,
Тайлер Штайнхаус

Вы пытались достичь того, что хотите, используя функции, которые Google опубликовал самостоятельно?

Ниже взято https://developers.google.com/youtube/v3/code_samples/php

 /** * Uploads a caption track in draft status that matches the API request parameters. * (captions.insert) * * @param Google_Service_YouTube $youtube YouTube service object. * @param Google_Client $client Google client. * @param $videoId the YouTube video ID of the video for which the API should * return caption tracks. * @param $captionLanguage language of the caption track. * @param $captionName name of the caption track. * @param $captionFile caption track binary file. * @param $htmlBody html body. */ function uploadCaption(Google_Service_YouTube $youtube, Google_Client $client, $videoId, $captionFile, $captionName, $captionLanguage, &$htmlBody) { # Insert a video caption. # Create a caption snippet with video id, language, name and draft status. $captionSnippet = new Google_Service_YouTube_CaptionSnippet(); $captionSnippet->setVideoId($videoId); $captionSnippet->setLanguage($captionLanguage); $captionSnippet->setName($captionName); # Create a caption with snippet. $caption = new Google_Service_YouTube_Caption(); $caption->setSnippet($captionSnippet); // Specify the size of each chunk of data, in bytes. Set a higher value for // reliable connection as fewer chunks lead to faster uploads. Set a lower // value for better recovery on less reliable connections. $chunkSizeBytes = 1 * 1024 * 1024; // 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); // Create a request for the API's captions.insert method to create and upload a caption. $insertRequest = $youtube->captions->insert("snippet", $caption); // Create a MediaFileUpload object for resumable uploads. $media = new Google_Http_MediaFileUpload( $client, $insertRequest, '*/*', null, true, $chunkSizeBytes ); $media->setFileSize(filesize($captionFile)); // Read the caption file and upload it chunk by chunk. $status = false; $handle = fopen($captionFile, "rb"); while (!$status && !feof($handle)) { $chunk = fread($handle, $chunkSizeBytes); $status = $media->nextChunk($chunk); } fclose($handle); // If you want to make other calls after the file upload, set setDefer back to false $client->setDefer(false); $htmlBody .= "<h2>Inserted video caption track for</h2><ul>"; $captionSnippet = $status['snippet']; $htmlBody .= sprintf('<li>%s(%s) in %s language, %s status.</li>', $captionSnippet['name'], $status['id'], $captionSnippet['language'], $captionSnippet['status']); $htmlBody .= '</ul>'; } 

Я смог воспроизвести эту проблему и нашел возможное решение. Ключ был содержимым загруженного файла субтитров. Подсказка была там, где говорится в документации :

Параметр синхронизации указывает, должна ли YouTube автоматически синхронизировать файл подписи со звуковой дорожкой видео. Если вы установите значение true , YouTube будет игнорировать любые временные коды, которые находятся в загруженном файле субтитров, и генерировать новые временные коды для подписей .

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

Настройка, которая заставляла его работать для меня, заключалась в том, чтобы добавить некоторые фиктивные коды времени, которые, как я знал, были неправильными, и установить 'sync' => 'true', чтобы служба YouTube исправила их. Например, вот файл .sbv который НЕ работал:

 This is a sample video to test the YouTube API captioning system. 

Когда я использовал этот файл, я получил ту же ошибку, что и вы, т. Track content is not processed , но когда я изменил его на это, он работал:

 00:00:00,00:00:00 This is a sample video to test the YouTube API captioning system. 

Когда я загрузил обработанный файл .sbv с YouTube, он выглядел так:

 0:00:00.000,0:00:04.266 This is a sample video to test the YouTube API captioning system. 

Конечно, я только пробовал это для ОЧЕНЬ тривиального видео , и я не думаю, что они отлично справились с таймингом, но, надеюсь, он будет расширяться, чтобы работать с вашей системой.