2009-12-23 15 views
11

Questa domanda è correlata a this other question @ SuperUser.Analisi e conversione di TED Talks JSON Sottotitoli

Vorrei scaricare i TED Talks ed i rispettivi sottotitoli per la visualizzazione offline, ad esempio, permette di prendere this short talk by Richard St. John, il video ad alta risoluzione URL di download è il seguente:

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

E il i rispettivi sottotitoli in inglese con codifica JSON possono essere scaricati all'indirizzo:

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

Ecco un eccezione dal inizio di sottotitolo attuale:

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

E dal fine del sottotitolo:

{"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}]} 

Voglio scrivere un app che scarica automaticamente la versione ad alta risoluzione del video e tutti i sottotitoli disponibili, ma sto attraversando un periodo davvero difficile dal devo convertire il sottotitolo di un (VLC o qualsiasi altro lettore video decente) formato compatibile (.srt o .sub sono le mie prime scelte) e non ho idea di quello che i startTime e duration chiavi del JSON il file rappresenta.

Quello che so finora è questo:

  • Il video scaricato dura 3 minuti e 30 secondi, e ha 29 FPS = 6090 fotogrammi.
  • startTime parte da 0 con duration di 3000 =
  • startTime termina a 184000 con una duration di 2000 =

Può anche essere utile notare il seguente Snippet di Javascript:

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

Quindi la mia domanda è, quale logica che intendo promuovere convertire startTime e duration valori in un formato compatibile 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! 

o ad una .formato compatibile 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. 

Qualcuno mi può aiutare con questo?


Ninh Bui inchiodato, la formula è la seguente:

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

Questo approccio permette di convertirmi direttamente al Srt formato (non c'è bisogno di conoscere la lunghezza e FPS) in due modi :

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. 

E:

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. 
+0

+1 per la spiegazione dettagliata :) – ukanth

+0

+1 per provare a fare qualcosa che mi stavo chiedendo se potessi fare. –

risposta

4

La mia ipotesi sarebbe che i tempi in json sono espressi in millisecondi, ad es. 1000 = 1 secondo. Probabilmente c'è un maintimer, dove startTime indica l'ora sulla timeline in cui dovrebbe apparire il sottotitolo e la durata è probabilmente la quantità di tempo in cui il sottotitolo dovrebbe rimanere in visione. Questa teoria è ulteriormente affermata dividendo 186000/1000 = 186 secondi = 186/60 = 3,1 minuti = 3 minuti e 6 secondi. I secondi rimanenti sono probabilmente applausi ;-) Con queste informazioni dovresti anche essere in grado di calcolare da quale frame a quale frame applicare la conversione, cioè sai già cosa sono i frame per secondo, quindi tutto quello che devi fare è moltiplicare il numero di secondi di avvio con FPS per ottenere il frame iniziale. Il frame finale può essere ottenuto da: (startTime + duration) * fps :-)

+0

Grazie, la mia conversione è perfettamente sincronizzata ora. =) –

3

Ho creato un semplice programma basato su console per scaricare i sottotitoli. Stavo pensando di renderlo disponibile via web utilizzando alcuni sistema di script come grasso scimmia ... Ecco il link alla mia blogpost con il codice .: http://estebanordano.com.ar/ted-talks-download-subtitles/

+0

Eccellente! Dovresti anche fornire una sorta di API per consentire il download automatico dei sottotitoli, come con uno script Apple dopo il download da un podcast o qualcosa del genere. –

1

ho trovato un altro sito che ha utilizzato questo formato. Ho inciso rapidamente una funzione per convertirli in srt, dovrebbe essere auto-esplicativo:

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'))) 
0

Ho scritto uno script python che scarica qualsiasi video TED e crea un file mkv con tutte le sottotitoli/metadati incorporati in essa (https://github.com/oxplot/ted2mkv).

Ho utilizzato la variabile pad_seconds nel codice javascript della pagina di discussione TED come offset da aggiungere a tutti i timestamp nei file di sottotitoli JSON. È quello che usa il flash player, suppongo.