将字幕发送到 YouTube 直播

Sending Captions to a YouTube Live Stream

我正在尝试将字幕发送到 YouTube 直播流(实时)。 None 我找到的文档似乎是准确的。

这个页面似乎最近:https://support.google.com/youtube/answer/6077032?&ref_topic=2853697

但还是大错特错。我将介绍我所做的事情。

  1. 转到 YouTube 并点击右上角显示“创建”的灰色小相机。
  2. 这会弹出一个弹出窗口,然后我 select“开始直播”。
  3. 那将我带到 studio.youtube.com。我点击左上角的 Stream 按钮。
  4. 输入基本数据。将流 URL 送入 OBS。一切正常。
  5. Set Captions to POST Captions to URL and copy/paste the hidden URL.
  6. 将所有内容都直播起来,然后导航到直播查看器并在大约 10 秒的延迟上观看我自己。
  7. 启动一个循环发送“这是一个测试”样式字幕的程序。

它们从未出现。

我的调试语句是这样的:

Sending to http://upload.youtube.com/closedcaption?cid=abcd-abcd-abcd-abcd-f77s&lang=en-US&seq=364. Body: -->2021-02-10T18:08:46.609 Do not pass go. <--

也就是说,我正在对有问题的URL做一个POST,Content-Type设置为text/plain。 body 是祖鲁语中的 date/time,一个换行符,我的文本,还有一个换行符。

我正在记录此输出:

2021/02/10 18:09:09,411 pid<1633> INFO:Post Caption status code: 200
2021/02/10 18:09:09,411 pid<1633> INFO:Post Caption Returned: "2021-02-10T18:09:09.392\n"

也就是说,YouTube returning HTTP_OK (200) 带有时间戳,仅此而已。换句话说,它似乎是在接受字幕。

我已确保在查看器中打开了“显示字幕”window。

永远不会出现字幕。

我只是添加了 lang 参数以防出现问题——这没有什么区别。我不知道我做错了什么。

而且我找不到任何准确的文档。我之前链接的页面是错误的。 URL 网站在我设置时提供的内容与该页面上记录的内容完全不同。

您会认为,鉴于 YouTube 归 Google 所有,Google 搜索文档实际上 return 一些文档。我实际上在 Whosebug 答案中找到了链接页面。

那么,问题...

有谁知道我可能做错了什么,或者有一些我可以尝试的提示?

有人知道我在哪里可以找到 up-to-date 文档吗?

重申一下:

一个。直播(非上传视频)

乙。 YouTube 播放器中不显示字幕

感谢帮助甚至提示。


这是我最新的调试。语言是C++。

Post一个标题:这个 正在发送至 http://upload.youtube.com/closedcaption?cid=5gb9-x5z8-szbb-ghrr-f77s&seq=50。 Body:-->2021-02-20T16:38:16.610 这个 <-- Post一个标题:是 发送至 http://upload.youtube.com/closedcaption?cid=5gb9-x5z8-szbb-ghrr-f77s&seq=51。 Body:-->2021-02-20T16:38:18.827 是 <-- 正在发送至 http://upload.youtube.com/closedcaption?cid=5gb9-x5z8-szbb-ghrr-f77s&seq=52。 Body: -->2021-02-20T16:38:20.800

<-- Post一个标题:一个 正在发送至 http://upload.youtube.com/closedcaption?cid=5gb9-x5z8-szbb-ghrr-f77s&seq=53。 Body:-->2021-02-20T16:38:21.047 一种 <-- Post 标题:测试。 发送至 http://upload.youtube.com/closedcaption?cid=5gb9-x5z8-szbb-ghrr-f77s&seq=54。 Body:-->2021-02-20T16:38:23.264 测试。 <--

每条消息回复如下:

2021/02/20 16:37:50,555 pid<538> INFO:Post 字幕状态码:200 2021/02/20 16:37:50,555 pid<538> INFO:Post 返回的标题:“2021-02-20T16:37:50.537\n”

我正在根据 YouTube 发回的 date/time 应用增量,我相当确定这部分有效。

我的结果:

- 字幕显示不一致。我发送时有 2 秒的延迟,我可能会或可能不会看到标题。

-当它们出现时,它们会在屏幕上停留很短的时间(大约 1/2 到 1 秒)。

-它们出现了双重:

This is
This is

我很惊讶。 YouTube 生成的是 http: 而不是 https:。切换我的 URL 会稍微改变行为,但影响不大。

Sending Captions to a YouTube Live Stream

是的,这完全有可能!让我详细说明。

为了向直播流发送隐藏式字幕,您需要使用 contentDetails.closedCaptionsTypecontentDetails.enableClosedCaptions 已弃用!)属性。您想通过 HTTP POST 将字幕发送到直播流的摄取 URL - 请参阅文档:

closedCaptionsHttpPost: You will send captions, via HTTP POST, to an ingestion URL associated with your live stream.

稍微跑题了,您可以通过 contentDetails.closedCaptionsIngestionUrl. It should look like http://upload.youtube.com/closedcaption?cid=xxx-xxx-xxx-xxx, whereas xxx-xxx-xxx-xxx will vary at your end. For further reading, please check out the documentation.

获取您的内容 URL

所以..你如何发送隐藏式字幕?首先,请记住有一些 limitations and requirements。其次,决定是否需要通过 普通 HTTP POST 请求或嵌入 - 参见 HLS ingestion documentation:

HLS ingestion supports two options for sending closed captions:

  1. Send closed captions via separate HTTP POST requests. This works for all HLS ingestions.
  2. Embedded 608/708 closed captions work with HLS ingestions that use the H264 video codec but not with ingestions that use the HEVC video codec. See the Live Caption Requirements in the YouTube Help Center for more details.

以下是通过 Python 向 YouTube API 发送 HTTP POST 请求的示例(考虑 the data that needs to be parsed into,例如日期时间):

import requests
from datetime import datetime

cc = 'This is a test'
headers = {'content-type': 'text/plain'}
ingestion_url = 'http://upload.youtube.com/closedcaption?id=xxx-xxx-xxx-xxx=' + str(seq)

#Specify your details
server = ' region:reg1#cue1' 

#Formatting the time properly
time = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3]

post = time + server + '\n' + cc + '\n'

requests.post(url=ingestion_url, data=post.encode('utf-8'), headers=headers)

请注意:

  1. 服务器详细信息是可选的!您不需要解析区域数据(参见 here
  2. 您需要发送 text/plain post 请求,因此 {'content-type': 'text/plain'}.encode('utf-8')
  3. str(seq) 指的是计数字符串 - 它 必须 包含在每个 POST 请求中。检查 here.
  4. 我上面的例子非常简单。为了进一步阅读,我 强烈建议 查看 this detailed documentation 示例!这篇 YouTube 帮助文章总结了所有需要的信息(post 请求、预期 return(即 200 和日期时间)、参数等)并提供了很好的测试示例!

由于您没有指定编程语言,我直接选择了Python。尽管您也可以通过正常摄取 url 发送 POST 请求。正如之前多次提到的,"golden page for your project" 展示了如何使用预先给定的摄取 url(YouTube 将提供给您)以及如何根据所述文档对其进行修改。

另请注意,我上面的解释是针对他们的暂存服务器(为简单起见)。如果你想在野外测试它,请不要忘记你需要包含 idnssparamasexpiresignature 等参数keyseq.