2015-07-14 2 views
15

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

Мы также смогли получить флаг синхронизации для работы, который сообщает 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); 

Спасибо,
Тайлер штейнгаузовская

+1

Точный такой же проблема здесь. Это похоже на ошибку в конце YouTube. Надеюсь вскоре увидеть какой-то значимый ответ. –

+2

Было бы неплохо, если бы Инженер Google мог бы прокомментировать эту проблему, поскольку они, по-видимому, предполагают контролировать эти теги. Сегодня я тоже попробовал не повезло. –

+3

Связанная проблема: https://code.google.com/p/gdata-issues/issues/detail?id=7468 – Alex0007

ответ

5

Вы пытались добиться того, что вы хотите использовать функции 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>'; 
} 
+1

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

3

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

синхронизации параметр указывает, следует ли 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. 

Конечно, я попробовал только это для a VERY trivial video, и Я не думаю, что они отлично поработали с таймингом, но, надеюсь, он будет расширяться, чтобы работать с вашей системой.

+1

Это интересно. Я могу заставить его работать с вашим видео, используя ваш метод. Но использование одного и того же метода в любом из моих видео по-прежнему не удается. –

+2

вздох. Я предполагаю, что это слишком много для API, чтобы на самом деле делать то, что он говорит, что это будет делать ... По крайней мере, вы смогли заставить его «обработать» ваши подписи. Возможно, есть способ подделать его, оценив приблизительное количество секунд на символ/слово или используя пунктуацию, чтобы вставить временные коды фиктивного кода. Конечно, это не сработает, если в видеоролике есть места, где повествование приостанавливается. – morphatic

+1

Благодарим вас за ответ! Я тоже пробовал это, и я даже не могу сказать, что это даже обработка. Я действительно хочу, чтобы их API просто работал, как они рекламируют его в своей документации. –