PHP:使用同步标志上传 YouTube v3 API 字幕
Posted
技术标签:
【中文标题】PHP:使用同步标志上传 YouTube v3 API 字幕【英文标题】:PHP: YouTube v3 API Captions Upload with Sync Flag 【发布时间】:2015-10-03 05:21:00 【问题描述】:在过去的几周里,我和我的同事一直在努力尝试通过 v3 API 为我们的客户 YouTube 视频添加字幕。大约一周后,我们终于可以上传字幕了.但是,我们可以下载上传的原始格式;所以我们知道文件已成功上传。
我们还能够让同步标志起作用,告诉 YouTube 运行脚本并设置视频的时间,但它实际上不起作用。它返回告诉我们它正在同步,但是当我们转到视频的 UI 时,它只显示字幕轨道名称并向我们提供消息“轨道内容未处理。”。我们已经用完了所有的时间,现在我们正在利用自己的时间来解决这个问题,但仍然没有运气。
以前有人遇到过这个问题吗?如果是这样,你能做些什么来让它发挥作用?
我将在下面发布我的代码的 sn-p,显示我们脚本的上传部分。
# 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);
谢谢你, 泰勒·斯坦豪斯
【问题讨论】:
这里的问题完全相同。它看起来像 YouTube 上的一个错误。希望很快能看到一些有意义的答案。 如果谷歌工程师可以评论这个问题会很好,因为他们显然应该监控这些标签。我今天又试了一次,没有成功。 相关问题:code.google.com/p/gdata-issues/issues/detail?id=7468 【参考方案1】:您是否尝试过使用 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>';
【讨论】:
我有,但它不起作用。示例代码的问题是文件没有上传,即使上传功能有效,它仍然无法满足我的需要,即自动将我的字幕文件与我的视频同步。【参考方案2】:我能够重现此问题,并找到了可能的解决方法。关键是上传的字幕文件的内容。提示是它在the documentation 中所说的:
sync 参数指示 YouTube 是否应自动将字幕文件与视频的音轨同步。如果您将该值设置为
true
,YouTube 将忽略上传的字幕文件中的任何时间码并为字幕生成新的时间码。如果您要上传没有时间码的脚本,或者您怀疑文件中的时间码不正确并希望 YouTube 尝试修复它们,则应将
sync
参数设置为true
。
使它对我有用的调整是添加一些我知道不正确的虚拟时间代码,并设置 '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.
当我从 YouTube 下载处理后的 .sbv
文件时,它看起来像这样:
0:00:00.000,0:00:04.266
This is a sample video to test the YouTube
API captioning system.
当然,我只为a VERY trivial video 尝试过这个,我认为他们在时间安排上做得不是很好,但希望它可以扩大到适用于您的系统。
【讨论】:
这很有趣。我可以用你的方法让它和你的视频一起工作。但是在我的任何视频上使用相同的方法仍然失败。 叹息。我想 API 要求太多才能真正做到它所说的那样......至少你能够让它“处理”你的字幕。也许有一种方法可以通过估计每个字符/单词的近似秒数或使用标点符号来插入虚拟时间代码来伪造它。当然,如果视频中有旁白暂停的地方,这将不起作用。 感谢您的回复!我也试过这个,我什至不能让它告诉我它甚至正在处理。我真的希望他们的 API 能够像他们在文档中宣传的那样工作。以上是关于PHP:使用同步标志上传 YouTube v3 API 字幕的主要内容,如果未能解决你的问题,请参考以下文章
允许用户使用 youtube API v3 将视频上传到我的频道
如何使用 YouTube API (V3) 将缩略图上传到 YouTube 频道
如何使用 Google.Apis.YouTube.v3 和 C# 将视频上传到 youtube?