2

Youtube 支持一些二进制字幕文件格式,例如 ebu-stl。

我有一个 *.stl 文件,当我通过 Web 界面上传它时,它可以很好地上传和处理。但是,当我尝试使用 POST 请求通过 API v2 上传它时,它似乎无法正确识别文件格式。POST 请求如下所示

POST /feeds/api/videos/VIDEO_ID/captions HTTP/1.1
Host: gdata.youtube.com
Content-Type: application/vnd.youtube.timedtext; charset=UTF-8
Content-Language: en
Slug: Title of caption track
Authorization: Bearer ACCESS_TOKEN
GData-Version: 2
X-GData-Key: key=DEVELOPER_KEY

<Caption File Data>

这就是通过 API 上传的 *.stl 文件在网站上的外观。应该有几行带有可读文本的行。 通过 Api 上传的 Ebu-Stl

当我上传具有相同代码的 utf8 纯文本字幕文件(例如 *.vtt)时,一切正常。此外,如果我通过 Web 界面和 API 上传一次 stl 文件,然后通过 API检索这两个文件,它们是字节相同的。

对我来说,这看起来像是一个编码问题——youtube 正确接收了文件,但可能会将整个二进制文件解析为 UTF-8。但是,当我省略charset=Content-Language时,youtube 会响应 4xx 错误。

是否可以上传二进制字幕文件?如果不可能,我也将不胜感激。

简约的 stl 文件,如果您想自己尝试(十六进制转储)。将其读作(红宝石):

stl = hex.chars.each_slice(2).map{|x|x.join.to_i(16)}.pack('C*')
4

1 回答 1

2

API v2 现已正式弃用。自 4 月 2 日起,API v3 现已正式支持字幕。也支持二进制字幕文件。

该文档缺少有关原始 HTTP 请求的一些详细信息。您可以尝试使用他们的库之一

我使用了他们的 python 脚本并查看了它发出的请求。作为参考,这里是上传二进制字幕/字幕文件的最小工作 HTTP 请求。

文档没有提到这个参数,但是设置uploadType=multipart很重要,否则 API 会返回错误。

POST /upload/youtube/v3/captions?uploadType=multipart&part=id,snippet&sync=false HTTP/1.1
Host: www.googleapis.com
Accept: */*
Authorization: Bearer {AUTH_TOKEN}
X-GData-Key: key={YOUR_KEY}
Content-Type: multipart/related; boundary================83250640405719953005==
Content-Length: 7147
Expect: 100-continue

--===============83250640405719953005==
Content-Type: application/json
MIME-Version: 1.0

{"snippet":{"videoId":"Agn_uesF248","language":"en","name":"Subtitle Test 2","isDraft":false}}
--===============83250640405719953005==
MIME-Version: 1.0
Content-Type: application/sla
Content-Transfer-Encoding: binary

{BINARY_CAPTION_FILE_DATA}
--===============83250640405719953005==--

application/sla是 ebu-stl 字幕文件。用于text/plain纯文本字幕(.srt、.vtt、.ass 等)。

{AUTH_TOKEN}{YOUR_KEY}替换为范围的适当授权凭证https://www.googleapis.com/auth/youtube.force-ssl;以及{BINARY_CAPTION_FILE_DATA}您要上传的文件。

于 2015-04-06T11:50:49.793 回答