2015-07-14 6 views
15

In den letzten paar Wochen haben meine Mitarbeiter und ich daran gearbeitet, über die v3-API Bildunterschriften auf unseren YouTube-Videos zu erhalten. Nach ungefähr einer Woche konnten wir endlich die Bildunterschriften zum Hochladen bekommen, aber YouTube würde uns diese Nachricht in der UI "Titelinhalt wird nicht verarbeitet" geben und die von uns hochgeladenen Bildunterschriften nicht anzeigen. Wir können jedoch das ursprüngliche Format herunterladen, das hochgeladen wurde. Wir wissen also, dass die Datei erfolgreich hochgeladen wurde.PHP: YouTube v3 API Bildunterschriften Upload mit Sync Flag

Wir konnten auch das Synchronisierungs-Flag aktivieren, das YouTube anweist, das Transkript durchzugehen und Timings für das Video festzulegen, aber es funktioniert nicht. Es gibt uns zurück, dass es synchronisiert wird, aber wenn wir auf die Benutzeroberfläche für das Video gehen, zeigt es nur den Titelnamen und gibt uns die Nachricht "Titelinhalt wird nicht verarbeitet.". Wir haben alle Stunden, die wir hatten, verbraucht und arbeiten jetzt an unserer eigenen Zeit, um dieses Problem zu lösen, aber immer noch kein Glück.

Hat jemand schon einmal auf dieses Problem gestoßen? Wenn ja, was konnten Sie tun, um dies zum Laufen zu bringen?

Ich werde unten einen Ausschnitt meines Codes veröffentlichen, der den Upload-Teil unseres Skripts zeigt.

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

Danke,
Tyler Steinhaus

+1

Genau dasselbe Problem hier. Es sieht nach einem Bug auf YouTube aus. Hoffe, bald eine sinnvolle Antwort zu sehen. –

+2

Es wäre schön, wenn ein Google Engineer dieses Thema kommentieren könnte, da er diese Tags offenbar überwachen soll. Ich habe es auch heute wieder ohne Glück versucht. –

+3

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

Antwort

5

Haben Sie, was Sie die Funktionen von Google haben sich geschrieben wollen mit zu erreichen versucht?

Below von 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

Ich habe und es funktioniert nicht. Das Problem mit dem Beispielcode ist, dass die Datei nicht hochgeladen wird und selbst wenn die Upload-Funktionalität funktioniert, würde sie immer noch nicht das tun, was ich brauche, nämlich meine Untertiteldateien automatisch mit meinen Videos zu synchronisieren. –

3

konnte ich dieses Problem reproduzieren, und fand eine mögliche Lösung. Der Schlüssel war der Inhalt der hochgeladenen Untertiteldatei. Der Hinweis war, wo es heißt in the documentation:

Die Sync-Parameter geben an, ob YouTube sollte die Untertiteldatei mit der Audiospur des Videos automatisch synchronisieren. Wenn du den Wert auf true, festlegst, ignoriert YouTube alle Zeitcodes, die sich in der hochgeladenen Untertiteldatei befinden, und generiert neue Zeitcodes für die Untertitel.

Sie sollten den Parameter sync auf true einstellen, wenn Sie ein Transkript hochladen, das keine Zeitcodes enthält oder wenn Sie vermuten, dass die Zeitcodes in Ihrer Datei falsch sind und YouTube versuchen soll, sie zu beheben.

Die zwicken, dass es für mich gemacht Arbeit in einigen Dummy-Zeitcodes hinzufügen, die ich kannte, waren falsch, und stellen Sie 'sync' => 'true',, so dass die YouTube-Service korrigieren würde. Zum Beispiel, hier ist die .sbv-Datei, die NICHT Arbeit tat

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

Wenn ich diese Datei verwende ich den gleichen Fehler hätte hast du, das heißtTrack content is not processed, aber wenn ich es so weit verändert es funktionierte:

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

Wenn ich das verarbeitete .sbv Datei von YouTube heruntergeladen es sah wie folgt aus:

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

Zugegeben, ich habe nur versucht, dies für a VERY trivial video und Ich denke nicht, dass sie mit den Timings eine sehr gute Arbeit geleistet haben, aber hoffentlich wird es sich skalieren, um mit Ihrem System zu arbeiten.

+1

Das ist interessant. Ich kann es mit deinem Video mit deiner Methode arbeiten lassen. Aber die gleiche Methode bei einem meiner Videos funktioniert immer noch nicht. –

+2

Seufzer. Ich denke, es würde zu viel verlangen, damit die API tatsächlich das tut, was sie verspricht ... Zumindest konnten Sie es dazu bringen, Ihre Bildunterschriften zu "verarbeiten". Vielleicht gibt es eine Möglichkeit, es vorzutäuschen, indem man die ungefähre Anzahl von Sekunden pro Zeichen/Wort schätzt oder Interpunktionen verwendet, um die Dummy-Zeitcodes einzufügen. Das funktioniert natürlich nicht, wenn es im Video Orte gibt, an denen die Erzählung pausiert. – morphatic

+1

Vielen Dank für Ihre Antwort! Ich habe es auch ausprobiert und kann es mir nicht einmal sagen, es wird sogar bearbeitet. Ich wünschte wirklich, ihre API würde einfach so funktionieren, wie sie es in ihrer Dokumentation ankündigt. –

Verwandte Themen