¿Cómo ordenar y combinar muchos archivos .ts?

6

Tengo muchos archivos pequeños (unos 500). Están en el orden correcto. Me gustaría fusionarlos. Los comandos de Linux también son bienvenidos porque puedo compilarlos en mi OS X. El comando cat *.ts > masi.ts no funciona bien. El resultado se detiene en algunos puntos. Estoy investigando por qué ocurre esto. Algunas partes de los videos no están en orden.

Nombres de partes de videos donde cada archivo tiene un prefijo HRmasi453-27012016.mp4.ts

1.ts
2.ts
...
100.ts
101.ts
...
200.ts
...
300.ts

por lo que el nombre del archivo es HRmasi453-27012016.mp4-01.ts ... HRmasi453-27012016.mp4-300.ts . El comando cat *.ts > masi.ts no organiza el video en orden secuencial. Creo que debería hacer una lista antes de todos los elementos en orden. Entonces, fusionar.

Pseudocódigo

  1. Haz una lista de los videos en orden
  2. fusionar cat items in list
    • Haga algo como filename = prefix + itemInList sin crear una nueva lista en el bucle while.
    • cat filename >> result.ts

¿Cómo puedes unirte a los muchos archivos de video, .ts, archivos?

    
pregunta Léo Léopold Hertz 준영 27.01.2016 - 14:21

4 respuestas

8

Necesito prefaciar esto diciendo que no he trabajado con los archivos .ts . No sé si se pueden concatenar o no simplemente usando cat y como se vio, ya que los nombres están numerados, se mezclan cuando se usa cat *.ts > masi.ts porque se clasifica lexicográficamente, por lo que usar una lista ordenada está en orden. Teniendo esto en cuenta, esto es lo que hice para crear una lista de 500 archivos .ts y luego concatenarlos usando la lista.

Primero creé 500 archivos con nombre numérico .ts que contenían el número del nombre de archivo .ts como control. Utilicé for i in {1..500}; do echo $i > $i.ts; done Estos no eran en realidad archivos .ts válidos, sin embargo, me permitía tener 500 archivos para trabajar y luego ver que estaban concatenadas en el orden correcto al abrir el archivo combined.ts para ver una lista numérica ordenada dentro de el archivo.

Como ya tiene el 500% de archivos .ts , en la Terminal haga lo siguiente:

cd ts_files_directory
echo {1..500}.ts | tr " " "\n" > tslist
while read line; do cat $line >> combined.ts; done < tslist


Actualizado para incluir el nombre de archivo real por su comentario a mi respuesta y su pregunta actualizada.

Lo siguiente asume que los únicos números en itemInList con un 0 (cero) inicial son, por ejemplo, 01 ... 09 y que cambia 500 en la parte {100..500} del comando a la real contar .

Cambie el directorio al que contiene los archivos .ts .

cd ts_files_directory

Los dos comandos siguientes crean el archivo tslist , que es una lista ordenada numéricamente de los nombres de archivo de destino que se utilizarán con cat para evitar el problema de clasificación lexicográfica.

echo 'HRmasi453-27012016.mp4-'{01..99}.ts | tr " " "\n" > tslist
echo 'HRmasi453-27012016.mp4-'{100..500}.ts | tr " " "\n" >> tslist

Con la lista ordenada numéricamente creada, use la siguiente línea de comando para concatenar en función del contenido del archivo tslist .

while read line; do cat $line >> combined.ts; done < tslist
    
respondido por el user3439894 27.01.2016 - 16:27
0

Aunque no lo he hecho yo mismo, he visto discusiones en las que las personas han combinado varios archivos de video utilizando la versión de línea de comandos de FFMPEG.

Creo que hay una versión para Mac, por lo que no es necesario que la compiles desde la fuente en ffmpeg.org, pero más allá de eso, otra persona tendrá que verificar eso y ayudarte con la sintaxis de comandos adecuada.

    
respondido por el Steve Chambers 27.01.2016 - 14:55
0

cat? .ts ??. ts ???. ts > all.ts

    
respondido por el user199255 30.08.2016 - 06:47
0

Manera muy fácil basada en documentos ffmpeg; La respuesta aceptada es más complicada.

  1. primero imprima toda la lista de archivos en un archivo: mylist.txt, indique la extensión de su archivo, aquí está .ts

    printf "file '%s'\n" ./*.ts > mylist.txt
    
  2. finalmente únase al archivo usando la lista de txt, último archivo de nombre de parámetro unido, use la misma extensión que los archivos de fuentes.

    ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.ts
    

más información sobre concatenar:

enlace

    
respondido por el stackdave 07.11.2017 - 19:06

Lea otras preguntas en las etiquetas