12

这个问题与@ SuperUser 的另一个问题有关。

我想下载TED Talks和相应的字幕以供离线观看,例如让我们以Richard St. John的简短演讲为例,高分辨率视频下载 URL 如下:

http://www.ted.com/talks/download/video/5118/talk/70

相应的 JSON 编码英文字幕可以在以下位置下载:

http://www.ted.com/talks/subtitles/id/70/lang/eng

这是实际字幕开头的一个例外:

{
  "captions": [{
        "content": "This is really a two hour presentation I give to high school students,",
        "startTime": 0,
        "duration": 3000,
        "startOfParagraph": false
      }, {
        "content": "cut down to three minutes.",
        "startTime": 3000,
        "duration": 1000,
        "startOfParagraph": false
      }, {
        "content": "And it all started one day on a plane, on my way to TED,",
        "startTime": 4000,
        "duration": 3000,
        "startOfParagraph": false
      }, {
        "content": "seven years ago."

从字幕的末尾开始:

{
  "content": "Or failing that, do the eight things -- and trust me,",
  "startTime": 177000,
  "duration": 3000,
  "startOfParagraph": false
}, {
  "content": "these are the big eight things that lead to success.",
  "startTime": 180000,
  "duration": 4000,
  "startOfParagraph": false
}, {
  "content": "Thank you TED-sters for all your interviews!",
  "startTime": 184000,
  "duration": 2000,
  "startOfParagraph": false
}]
}

我想编写一个应用程序来自动下载视频的高分辨率版本和所有可用的字幕,但我真的很难,因为我必须将字幕转换为(VLC 或任何其他像样的视频播放器)兼容格式(.srt 或 .sub 是我的首选),我不知道 JSON 文件的startTimeduration键代表什么。

到目前为止我所知道的是:

  • 下载的视频时长为3 分 30 秒,帧率为29 FPS = 6090 帧
  • startTime从 0 开始,aduration为 3000 = 3000
  • startTime以 184000 结束,aduration为 2000 = 186000

还可能值得注意以下 Javascript 片段:

introDuration:16500,
adDuration:4000,
postAdDuration:2000,

所以我的问题是,我应该应用什么逻辑将值转换startTimeduration.srt 兼容格式

1
00:01:30,200 --> 00:01:32,201
MEGA DENG COOPER MINE, INDIA

2
00:01:37,764 --> 00:01:39,039
Watch out, watch out!

.sub 兼容格式

{FRAME_FROM}{FRAME_TO}This is really a two hour presentation I give to high school students,
{FRAME_FROM}{FRAME_TO}cut down to three minutes.

谁能帮我解决这个问题?


Ninh Bui 搞定了,公式如下:

introDuration - adDuration + startTime ... introDuration - adDuration + startTime + duration

这种方法允许我通过两种方式直接转换为 .srt 格式(无需知道长度和 FPS):

00:00:12,500 --> 00:00:15,500
This is really a two hour presentation I give to high school students,

00:00:15,500 --> 00:00:16,500
cut down to three minutes.

和:

00:00:00,16500 --> 00:00:00,19500
And it all started one day on a plane, on my way to TED,

00:00:00,19500 --> 00:00:00,20500
seven years ago.
4

5 回答 5

4

我的猜测是 json 中的时间以毫秒表示,例如 1000 = 1 秒。可能有一个 maintimer,其中 startTime 指示时间线上应该出现字幕的时间,而持续时间可能是字幕应该保持在视野中的时间量。通过除以 186000 / 1000 = 186 秒 = 186 / 60 = 3.1 分钟 = 3 分 6 秒,进一步证实了这一理论。剩下的几秒钟可能是掌声;-) 有了这些信息,您还应该能够计算出您应该将转换应用于哪个帧到哪个帧,即您已经知道每秒的帧数是多少,所以您需要做的就是相乘FPS 开始时间的秒数以获取开始帧。可以通过以下方式获得结束帧:(startTime + duration) * fps :-)

于 2009-12-23T22:51:05.673 回答
3

我制作了一个简单的基于控制台的程序来下载字幕。我正在考虑使用诸如油脂猴子之类的脚本系统通过网络使其可用...这是我的博客文章的链接以及代码。:http ://estebanordano.com.ar/ted-talks-download-subtitles/

于 2010-01-05T22:47:15.057 回答
1

我找到了另一个使用这种格式的网站。我很快破解了一个将它们转换为 srt 的函数,应该是不言自明的:

import urllib2
import json

def json2srt(url, fname):
    data = json.load(urllib2.urlopen(url))['captions']

    def conv(t):
        return '%02d:%02d:%02d,%03d' % (
            t / 1000 / 60 / 60,
            t / 1000 / 60 % 60,
            t / 1000 % 60,
            t % 1000)

    with open(fname, 'wb') as fhandle:
        for i, item in enumerate(data):
            fhandle.write('%d\n%s --> %s\n%s\n\n' %
                (i,
                 conv(item['startTime']),
                 conv(item['startTime'] + item['duration'] - 1),
                 item['content'].encode('utf8')))
于 2012-04-07T23:53:56.860 回答
0

我编写了一个 python 脚本,可以下载任何 TED 视频并创建一个 mkv 文件,其中嵌入了所有字幕/元数据(https://github.com/oxplot/ted2mkv)。

我使用了 TED 演讲页面的 javascript 代码中的变量pad_seconds作为添加到 JSON 字幕文件中所有时间戳的偏移量。我认为这是 Flash 播放器使用的。

于 2012-12-16T05:24:57.917 回答
0

TEDGrabber beta2:我的程序:http: //sourceforge.net/projects/tedgrabber/

于 2010-09-21T05:57:34.427 回答