Pregunta

Esta pregunta se relaciona con esta otra pregunta @ superusuario .

Quiero descargar el TED Talks y los respectivos subtítulos para verlas sin conexión, por ejemplo, permite echar < a href = "http://www.ted.com/talks/lang/eng/richard_st_john_s_8_secrets_of_success.html" rel = "nofollow noreferrer"> este breve charla de Richard St. John , la descarga de vídeo de alta resolución URL es la siguiente:

  

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

Y los respectivos subtítulos en inglés JSON codificados se pueden descargar en:

  

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

Aquí es una excepción de la comenzando de los subtítulos real:

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

Y desde el final de los subtítulos:

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

Quiero escribir una aplicación que descarga automáticamente la versión de alta resolución del vídeo y todos los subtítulos disponibles, pero estoy teniendo un momento muy difícil ya que Tengo que convertir los subtítulos a un (VLC o cualquier otro reproductor de video decente) formato compatible (.srt o .sub son mis primeras opciones) y no tengo idea de lo que las teclas startTime y duration del archivo JSON representan .

Lo que sé hasta ahora es la siguiente:

  • dura el vídeo descargado de 3 minutos y 30 segundos , y tiene 29 fps = 6090 marcos .
  • startTime comienza en 0 con un duration de 3000 = 3000
  • startTime termina a 184.000 con un duration de 2000 = 186000

También puede valer la pena notar el siguiente fragmento de código JavaScript:

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

Así que mi pregunta es, ¿qué lógica debería aplicarse a convertir valores startTime y duration a un formato compatible .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 a un formato compatible .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.

Puede alguien ayudarme con esto?


Ninh Bui clavado, la fórmula es la siguiente:

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

Este enfoque permite a mí directamente convertir a formato .srt (sin necesidad de conocer la longitud y FPS) de dos maneras:

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.

Y:

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.
¿Fue útil?

Solución

Mi conjetura sería que los tiempos en el JSON se expresan en milisegundos, por ejemplo 1000 = 1 segundo. Probablemente hay un maintimer, donde horaInicio indica la hora en la línea de tiempo en el que debe aparecer el subtítulo y la duración es, probablemente, la cantidad de tiempo que el subtítulo debe permanecer en la visión. Esta teoría se confirma al dividir 186000/1000 = 186 segundos = 186/60 = 3,1 minutos = 3 minutos y 6 segundos. Los restantes segundos son probablemente los aplausos ;-) Con esta información también debe ser capaz de calcular a partir de qué marco a marco de lo que debe aplicar su conversión a, es decir, que ya sabe lo que los fotogramas por segundo es todo lo que tiene que hacer es multiplicar el número de segundos de starttime con el FPS para obtener el marco de comenzar. El marco final puede obtenerse por: (duración horaInicio +) * fps: -)

Otros consejos

Hice un sencillo programa basado en la consola para descargar los subtítulos. Estaba pensando en su puesta a disposición a través de Internet utilizando algún sistema guión como mono de grasa ... Aquí está el enlace a mi entrada de blog con el código .: http://estebanordano.com.ar/ted-talks-download-subtitles/

He encontrado otro sitio que utiliza este formato. Me corté rápidamente una función para convertirlos en srt, debe explicarse por sí mismo:

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

TEDGrabber beta 2: mi programa: http://sourceforge.net/projects/tedgrabber/

He escrito un script en Python que descarga cualquier video de TED y crea un archivo MKV con todos los subtítulos / metadatos incrustados en ella ( https://github.com/oxplot/ted2mkv ).

He utilizado la variable pad_seconds en el código JavaScript de la página de discusión de TED como un desplazamiento que se añade a todas las marcas de tiempo en los archivos de subtítulos JSON. Es lo que utiliza el reproductor de flash, supongo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top