2015-07-14 27 views
15

Da un paio di settimane i miei collaboratori e me hanno lavorato per cercare di ottenere didascalie sui nostri video di YouTube dei clienti tramite l'API v3. Dopo circa una settimana siamo finalmente riusciti a caricare le didascalie, ma YouTube ci ha fornito questo messaggio nell'interfaccia utente "Il contenuto della traccia non viene elaborato" e non visualizza le didascalie che carichiamo. Tuttavia, possiamo scaricare il formato originale che è stato caricato; quindi sappiamo che il file è stato caricato con successo.PHP: upload di didascalie API di YouTube v3 con flag di sincronizzazione

Siamo anche riusciti a far funzionare il flag di sincronizzazione che dice a YouTube di scorrere la trascrizione e impostare i tempi per il video ma, in realtà, non funziona. Torna a dirci che è in fase di sincronizzazione ma quando andiamo all'interfaccia utente per il video mostra solo il nome della traccia di sottotitoli e ci dà il messaggio "Il contenuto della traccia non viene elaborato.". Abbiamo esaurito tutte le ore che abbiamo avuto e ora stiamo lavorando al nostro tempo per risolvere questo problema, ma ancora senza fortuna.

Qualcuno ha mai avuto questo problema? Se sì, cosa sei riuscito a fare per farlo funzionare?

Inserirò uno snippet del mio codice qui sotto che mostra la porzione di caricamento del nostro script.

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

Grazie,
Tyler Steinhaus

+1

Esattamente lo stesso problema qui. Sembra un bug su YouTube. Sperando di vedere presto una sorta di risposta significativa. –

+2

Sarebbe bello se un ingegnere di Google potesse commentare questo problema poiché apparentemente si suppone che stia monitorando questi tag. Ho anche provato di nuovo oggi senza fortuna. –

+3

Problema correlato: https://code.google.com/p/gdata-issues/issues/detail?id=7468 – Alex0007

risposta

5

Hai provato a raggiungere ciò che si desidera utilizzare le funzioni di Google hanno postato stessi?

sotto prese dal 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

Ho e non funziona. Il problema con il codice di esempio è che il file non viene caricato e anche se la funzionalità di caricamento funzionava, non avrebbe comunque fatto ciò che mi serviva, ovvero sincronizzare automaticamente i miei file di sottotitoli con i miei video. –

3

ero in grado di riprodurre il problema, e ho trovato una possibile correzione. La chiave era il contenuto del file di sottotitoli caricato. Il suggerimento è stato in cui si dice in the documentation:

Il parametro di sincronizzazione indica se YouTube deve sincronizzare automaticamente il file dei sottotitoli con la traccia audio del video. Se imposti il ​​valore su true, , YouTube ignorerà tutti i codici temporali contenuti nel file di sottotitoli caricati e genererà nuovi codici temporali per le didascalie.

È necessario impostare il parametro sync su true se si sta caricando una trascrizione, che non ha codici temporali, o se si sospetta che i codici temporali nel file non siano corretti e desideri che YouTube tenti di correggerli.

Il tweak che ha reso il lavoro per me era di aggiungere in alcuni codici di tempo fittizi che ho conosciuto erano errati, e impostare 'sync' => 'true', in modo che il servizio di YouTube li avrebbe corretto. Ad esempio, ecco il file .sbv che ha fatto NON lavoro:

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

Quando ho usato questo file ho ottenuto lo stesso errore che hai fatto, vale a direTrack content is not processed, ma quando l'ho cambiato in questo ha funzionato:

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

Quando ho scaricato il .sbv file elaborato da YouTube che si presentava così:

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

Certo, ho provato solo questo per a VERY trivial video, e Non penso che abbiano fatto un ottimo lavoro con i tempi, ma si spera che aumenterà per funzionare con il tuo sistema.

+1

Questo è interessante. Posso farlo funzionare con il tuo video, usando il tuo metodo. Tuttavia, l'utilizzo dello stesso metodo su uno dei miei video non riesce ancora. –

+2

sospiro. Immagino che chiederebbe troppo all'API per fare effettivamente quello che dice che farà ... Almeno sei riuscito a farlo per "elaborare" i tuoi sottotitoli. Forse c'è un modo per fingere stimando il numero approssimativo di secondi per carattere/parola, o usando la punteggiatura, per inserire i codici temporali fittizi. Ovviamente questo non funzionerà se ci sono dei posti nel video in cui la narrazione si interrompe. – morphatic

+1

Grazie per la risposta! Ho provato anche questo e non riesco nemmeno a dirmi che è anche l'elaborazione. Mi auguro davvero che le loro API funzionino come se fossero pubblicizzate nella loro documentazione. –