解析和转换TED会谈JSON字幕

时间:2009-12-23 22:17:13

标签: json parsing string video subtitle

此问题与this other question @ SuperUser有关。

我想下载TED Talks以及相应的字幕以供离线观看,例如我们可以this short talk by Richard St. John,高分辨率视频下载网址如下:

  

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是我的第一选择)我不知道startTime和{{1 JSON文件的键代表

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

  • 下载的视频持续 3分30秒 29 FPS = 6090帧
  • duration从0 开始,startTime为3000 = 3000
  • duration以184000结尾startTime为2000 = 186000

也可能值得注意以下Javascript代码段:

duration

所以我的问题是,我应该采用什么逻辑introDuration:16500, adDuration:4000, postAdDuration:2000, startTime值转换为.srt兼容格式

duration

.sub兼容格式

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!

任何人都可以帮我解决这个问题吗?


Ninh Bui钉了它,公式如下:

{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.

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

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

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.

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我制作了一个简单的基于控制台的程序来下载字幕。我正在考虑使用一些脚本系统(例如油脂猴子)通过网络提供它...这是我的博客链接的链接,代码为:http://estebanordano.com.ar/ted-talks-download-subtitles/

答案 2 :(得分: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')))

答案 3 :(得分:0)

TEDGrabber beta2:我的计划: http://sourceforge.net/projects/tedgrabber/

答案 4 :(得分:0)

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

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