Alineando subtítulos fuera de sincronización -- python campo con beginner campo con python-3.x campo con datetime campo con video camp codereview Relacionados El problema

Aligning out-of-sync subtitles


6
vote

problema

Español

Este es mi segundo programa que escribí por mi cuenta, un programa bastante simple que consiste en dos funciones (esas funciones aún no se combinan de ninguna manera). La primera función mueve los tiempos de visualización de los subtítulos guardados en archivos .SRT en un período de tiempo específico.

La segunda función "Warps", los tiempos de visualización por un multiplicador especificado para solucionar los subtítulos escritos en la base de las versiones de Base de SPED UP / desaceleradas del video (lo que resulta en los subtítulos que se sincronizan después de un tiempo).

Todo funciona bien y como se pretende, pero estoy bastante seguro de que hay cosas que podría haber hecho más óptimamente.

Para empezar, la entrada de argumento podría mejorarse, de modo que puede ingresar "+20" en lugar de "+20: 00,000" para cambiar los subtítulos en 20 segundos.

Eso es prácticamente el único problema que puedo subir, no sé cómo resolverlo ahora mismo. Por supuesto, probablemente hay más problemas con el código que no puedo contemplar aún, por lo que se aprecia ninguna entrada.

  import re; import datetime; import time   def timeChangeSRT(n, s):     t = time.time()     f, new = open(n, 'r'), open('new' + n, 'w')     offset = re.search('([+-])?((d{1,2}):)?(d+)(,(d{1,3}))?', s)     offset = datetime.timedelta(minutes=int(s[1:3]), seconds=int(s[4:6]), milliseconds=int(s[7:10]))      for line in f:         parsed = re.search('(d{2}:d{2}:d{2}.d{3}) --> (d{2}:d{2}:d{2}.d{3})', line)         if parsed:             start = datetime.timedelta(minutes=int(parsed.group(1)[3:5]),                                         seconds=int(parsed.group(1)[6:8]),                                         milliseconds=int(parsed.group(1)[9:12]))             end = datetime.timedelta(minutes=int(parsed.group(2)[3:5]),                                         seconds=int(parsed.group(2)[6:8]),                                         milliseconds=int(parsed.group(2)[9:12]))             if '-' in s:                 start -= offset                 end -= offset                 newline = '0' + str(start)[:11] + " --> " + '0' + str(end)[:11] + ' '                 new.write(newline)             else:                 start += offset                 end += offset                 newline = '0' + str(start)[:11] + " --> " + '0' + str(end)[:11] + ' '                 new.write(newline)          else:             new.write(line)     stop = time.time() - t     print('The %s file has been updated. New .srt file named %s has been created. The process took %s seconds.' % (n, 'new' + n, stop))    def warpSRT(n, w):     t = time.time()     f, new = open(n, 'r'), open('new' + n, 'w')     offset = w     for line in f:         parsed = re.search('(d{2}:d{2}:d{2}.d{3}) --> (d{2}:d{2}:d{2}.d{3})', line)         if parsed:             start = datetime.timedelta(minutes=int(parsed.group(1)[3:5]),                                         seconds=int(parsed.group(1)[6:8]),                                         milliseconds=int(parsed.group(1)[9:12]))             end = datetime.timedelta(minutes=int(parsed.group(2)[3:5]),                                         seconds=int(parsed.group(2)[6:8]),                                         milliseconds=int(parsed.group(2)[9:12]))             start *= offset             end *= offset             newline = '0' + str(start)[:11] + " --> " + '0' + str(end)[:11] + ' '             new.write(newline)          else:             new.write(line)     stop = time.time() - t     print('The %s file has been updated. New .srt file named %s has been created. The process took %s seconds.' % (n, 'new' + n, stop))   
Original en ingles

This is my 2nd program I wrote on my own, a pretty simple program consisting of two functions (those functions are not combined in any way yet though). The first function moves the display times of subtitles saved in .srt files by a specified amount of time.

The second function "warps" the display times by a specified multiplier to fix subtitles written on the base of sped up/slowed down versions of the video(which results in the subtitles syncing out after some time).

Everything works fine and as intended, but I'm pretty certain there are things I could have done more optimally.

For starters, the argument input could be improved, so that you can just input "+20" instead of "+20:00,000" to shift the subtitles by 20 seconds.

That's pretty much the only problem I can come up that I don't know how to solve right now. Of course there are probably more problems with the code I can't spot yet, so any input is appreciated.

import re; import datetime; import time   def timeChangeSRT(n, s):     t = time.time()     f, new = open(n, 'r'), open('new' + n, 'w')     offset = re.search('([\+\-])?((\d{1,2})\:)?(\d+)(\,(\d{1,3}))?', s)     offset = datetime.timedelta(minutes=int(s[1:3]), seconds=int(s[4:6]), milliseconds=int(s[7:10]))      for line in f:         parsed = re.search('(\d{2}:\d{2}:\d{2}.\d{3}) \-\-> (\d{2}:\d{2}:\d{2}.\d{3})', line)         if parsed:             start = datetime.timedelta(minutes=int(parsed.group(1)[3:5]), \                                        seconds=int(parsed.group(1)[6:8]), \                                        milliseconds=int(parsed.group(1)[9:12]))             end = datetime.timedelta(minutes=int(parsed.group(2)[3:5]), \                                        seconds=int(parsed.group(2)[6:8]), \                                        milliseconds=int(parsed.group(2)[9:12]))             if '-' in s:                 start -= offset                 end -= offset                 newline = '0' + str(start)[:11] + " --> " + '0' + str(end)[:11] + '\n'                 new.write(newline)             else:                 start += offset                 end += offset                 newline = '0' + str(start)[:11] + " --> " + '0' + str(end)[:11] + '\n'                 new.write(newline)          else:             new.write(line)     stop = time.time() - t     print('The %s file has been updated. New .srt file named %s has been created. The process took %s seconds.' % (n, 'new' + n, stop))    def warpSRT(n, w):     t = time.time()     f, new = open(n, 'r'), open('new' + n, 'w')     offset = w     for line in f:         parsed = re.search('(\d{2}:\d{2}:\d{2}.\d{3}) \-\-> (\d{2}:\d{2}:\d{2}.\d{3})', line)         if parsed:             start = datetime.timedelta(minutes=int(parsed.group(1)[3:5]), \                                        seconds=int(parsed.group(1)[6:8]), \                                        milliseconds=int(parsed.group(1)[9:12]))             end = datetime.timedelta(minutes=int(parsed.group(2)[3:5]), \                                        seconds=int(parsed.group(2)[6:8]), \                                        milliseconds=int(parsed.group(2)[9:12]))             start *= offset             end *= offset             newline = '0' + str(start)[:11] + " --> " + '0' + str(end)[:11] + '\n'             new.write(newline)          else:             new.write(line)     stop = time.time() - t     print('The %s file has been updated. New .srt file named %s has been created. The process took %s seconds.' % (n, 'new' + n, stop)) 
              

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 
  • En la parte superior de su archivo, coloca todas sus importaciones en una línea, pero de PEP8 :

    Las importaciones generalmente deben estar en líneas separadas

  • Defina offset , pero la siguiente línea que lo defina de nuevo. Eso hace que la primera definición sea completamente inútil.

  • timeChangeSRT() no debe dividir una cadena para obtener los minutos a la derecha, segundos y milisegundos. Aquellos deben ser aprobados como argumentos.

  • Esas barras invertidas al final de las líneas son inútiles. La sangría le dice al lector, y los paréntesis no cerrados le dicen al intérprete.

  • Tiene dos líneas que se usan tanto en el if y en el 9988777665544333 bloques (la definición de newline y escribiendo Para new ). Esa es una señal de que deben estar fuera de los bloques y se ejecutan justo después.

  • En lugar de usar newline = '0' + str(start)[:11] + " --> " + '0'... , use una cadena de formato: 9988777665544337

  • Usted utiliza formato de cadena de estilo antiguo, pero de los docs en .format () de Python2:

    Este método de formato de cadena es el nuevo estándar en Python 3, y debe preferirse al formato 9988776665544338 descrito en Operaciones de formato de cadena en nuevo código.

Su segunda función necesita las mismas modificaciones que la primera. Su segunda función, de hecho, es tan similar a la primera que estoy seguro de que podría definir algunas funciones de ayuda para hacer algo del trabajo para reducir el código duplicado.

 
  • At the top of your file you put all of your imports in one line, but from PEP8:

    Imports should usually be on separate lines

  • You define offset, but the next line you define it again. That makes the first definition completely useless.

  • timeChangeSRT() should not be splitting up a string to get the right minutes, seconds, and milliseconds. Those should be passed as arguments.

  • Those backslashes at the end of the lines are useless. The indentation tells the reader, and the unclosed parentheses tells the interpreter.

  • You have two lines that are used both in the if and in the else blocks (the definition of newline and writing it to new). That is a sign that they should be outside of the blocks and executed just afterwards.

  • Instead of using newline = '0' + str(start)[:11] + " --> " + '0'..., use a format string: newline = '0{} --> 0{}\n'.format(str(start)[:11], str(end)[:11])

  • You use old-style string formatting, but from the docs on .format() from Python2:

    This method of string formatting is the new standard in Python 3, and should be preferred to the % formatting described in String Formatting Operations in new code.

Your second function pretty much needs the same modifications as the first. Your second function, in fact, is so similar to the first that I am sure you could define some helper functions to do some of the work so as to reduce the duplicate code.

 
 

Relacionados problema

8  Transmisión programada programas programados según una lista de reproducción de CSV  ( Streaming scheduled tv shows according to a csv playlist ) 
Soy muy nuevo en Python, y he hecho un pequeño programa / script que me permitirá transmitir archivos específicos en un momento dado. Mi idea es que tengo u...

10  Conversión de álbumes MP3 en videos MP4 para YouTube  ( Converting mp3 albums into mp4 videos for youtube ) 
Este es un script rápido que me ayuda a convertir archivos MP3 de My CDS a los videos, puedo subir en YouTube. Está destinado a uso personal, por lo que no ha...

3  Línea de comando FFMPEG para mostrar dos videos lado a lado  ( Ffmpeg command line for showing two videos side by side ) 
Aquí está la línea de comandos para jugar dos videos de lado a lado en sincronización en FFMPEG (FFPlay). Puede ser útil para los videos de comado, por ejempl...

7  Prototipo para agregar Subtítulo. Soporte .srt a cualquier elemento de video  ( Prototype to add subtitle srt support to any video element ) 
He escrito un 9988776655544330 prototype que se extiende la etiqueta 9988776665544331 con una nueva función. myVideo.subtitle('/path/to/subtitle') ...

4  Disparadores de colocación y tamaño de elementos para controles de video  ( Triggers placing and sizing elements for video controls ) 
Tengo algunos desencadenantes que colocan y el tamaño de los elementos para los controles de video. Funciona lo suficientemente bien, pero en su mayoría a tra...

2  Reproductor de video de YouTube aleatorio  ( Random youtube video player ) 
Acabo de terminar de hacer este reproductor de video de YouTube aleatorio rápido y sucio para divertirse y aprender. Antes de comenzar, por "aleatorio" me ref...

0  Grabación de segundos de video de video basados ​​en píxeles comparados de una imagen  ( Recording timeback seconds of video based on compared pixels from an image ) 
El código lee desde la pantalla, compara un píxel en una imagen de muestra previamente provista y, si los píxeles coinciden, registra los segundos de tiempo d...

4  Actualización de la imagen de WPF de la cámara del marco de la cámara  ( Updating wpf image from camera frame grabber thread ) 
He creado una aplicación WPF en .NET 4.6.1. Para mostrar el video del evento de captura de marco para una cámara de visión de la máquina. En XAML hay un con...

12  Huffman decodificación para video  ( Huffman decoding for video ) 
He estado tratando de implementar un decodificador de Huffman rápido para codificar / decodificar el video. Sin embargo, apenas estoy capaz de decodificar un ...

3  FFMPEG con envoltura Java  ( Ffmpeg with java wrapper ) 
En esta aplicación Java, estoy tratando de convertir un video en pequeños clips. Aquí está la clase de implementación para el mismo package ffmpeg.clip.p...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos