FFMPEG:

FFMPEG:

También estoy buscando una solución Linux (enuna pregunta separada)

Tengo dos archivos de video grabados con la extensión .ts. Necesito eliminar una parte del primero, dividir el segundo y luego fusionar el primer archivo con la primera parte (dividida) del segundo archivo.

Ambos tienen las mismas características:

Format                                   : MPEG-TS
File size                                : 3.16 GiB
Duration                                 : 1h 39mn
Overall bit rate mode                    : Variable
Overall bit rate                         : 4 527 Kbps

Video
ID                                       : 720 (0x2D0)
Menu ID                                  : 6181 (0x1825)
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L4
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 4 frames
Codec ID                                 : 27
Duration                                 : 1h 39mn
Width                                    : 1 440 pixels
Height                                   : 1 080 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 25.000 fps
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : MBAFF

También contienen múltiples pistas de audio y subtítulos.

Quiero procesarlos sin transcodificar los archivos, al menos poder eliminar el principio, etc.

FFMPEG:

ffmpeg -i source.mtsda:

Input #0, mpegts, from 'source1.mts':
      Duration: 01:40:00.76, start: 2995.511878, bitrate: 4526 kb/s
      Program 6181
        Stream #0:0[0x46](fra,fra): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006)
        Stream #0:1[0x2d0]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
        Stream #0:2[0x2da](fra): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 73 kb/s
        Stream #0:3[0x2db](qaa): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 67 kb/s
        Stream #0:4[0x2dc](deu): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 49 kb/s
        Stream #0:5[0x2dd](qad): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 57 kb/s

Creo que se puede hacer muy bien con ffmpeg, que también es multiplataforma, como un comando que encontréaquí para eliminar una parte de un archivo.

ffmpeg -i InputFile -vcodec copy -acodec copy -ss 00:12:34.567 -t 00:34:56.789 OutputFile

funciona, excepto que la entrada tiene cuatro pistas de audio y de esta manera solo Stream #0:2[0x2da](fra)se toma el primer audio ( ). Lo que quiero es: o todo el audio, o el tercero ( Stream #0:3[0x2db](qaa)). ¿Cómo ajustar?

ffmpegPor lo tanto, debería trabajar para:

1. Corte el comienzo del primer archivo (elimine los primeros 2 minutos del archivo de 1h40 min)

2. Divida un segundo archivo (1 hora) en dos partes (después de 3,05 minutos)

3. Unir (añadir) al final del primer archivo la parte de 3,05 min obtenida al dividir el segundo archivo.


Lo que he probado:

Openshot: no se puede procesar sin transcodificar.

Avidemux (Linux): al intentar guardar dice"Esto no es compatible con MPEG. No puedes utilizar el códec de copia".

Avidemux en Windows: el audio no está sincronizado.

Respuesta1

¿Cómo divido y uno archivos ffmpegmientras conservo todas las pistas de audio?

Como habrá descubierto, una copia de flujo de bits seleccionará sólounopista (audio), según ladocumentación de especificación de flujo:

De forma predeterminada, ffmpegincluye solo una secuencia de cada tipo (video, audio, subtítulo) presente en los archivos de entrada y los agrega a cada archivo de salida. Elige lo "mejor" de cada uno según los siguientes criterios: para video, es la transmisión con la resolución más alta, para audio, es la transmisión con más canales, para subtítulos, es la primera transmisión de subtítulos. En el caso de que varias corrientes del mismo tipo tengan la misma tasa, se elige la corriente con el índice más bajo.

Para seleccionartodopistas de audio:

ffmpeg -i InputFile.ts-c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a FirstFile.ts

Para seleccionar elterceropista de audio:

ffmpeg -i InputFile.ts -c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a:2 FirstFile.ts

Puede leer más y ver otros ejemplos de selección de transmisiones en elopciones avanzadassección de la ffmpegdocumentación.

También combinaría -vcodec copy -acodec copysu comando original con -c copyel anterior para que la expresión sea compacta.

Dividir:

Entonces, combinándolos con lo que desea lograr en los dos archivos en términos de dividirlos para volver a unirlos más tarde:

ffmpeg -i InputOne.ts -ss 00:02:00.0 -c copy -map 0:v -map 0:a OutputOne.ts
ffmpeg -i InputTwo.ts -c copy -t 00:03:05.0 -map 0:v -map 0:a OutputTwo.ts

Te regalaré:

  • OutputOne.ts, que es tododespuéslos primeros dos minutos del primer archivo de entrada
  • OutputTwo.ts, Cuál es elprimero3 minutos y 5 segundos del segundo archivo de entrada

Unirse:

ffmpegadmite la concatenación de archivos sin volver a codificar,descrito ampliamente en su documentación de concatenación.

Cree su lista de archivos a unir (por ejemplo join.txt):

file '/path/to/files/OutputOne.ts'
file '/path/to/files/OutputTwo.ts'

Entonces tu ffmpegcomando puede usar concat demuxer:

 ffmpeg -f concat -i join.txt -c copy FinalOutput.ts

Dado que está trabajando con mpegflujos de transporte ( .ts),deberíapoder usar el concatprotocolotambién:

ffmpeg -i "concat:OutputOne.ts|OutputTwo.ts" -c copy -bsf:a aac_adtstoasc output.mp4

Según el ejemplo de la página concat vinculada anteriormente. Dejaré que tú experimentes con eso.

Respuesta2

Como respuesta simplificada basada en la principal:

Para conservar datos después de un punto de inicio (hasta el final):

ffmpeg -i INPUT -c copy -ss START_TIME -map 0 OUTPUT

Para mantener datos entre dos puntos temporales:

ffmpeg -i INPUT -c copy -ss START_TIME -to END_TIME -map 0 OUTPUT

Para conservar datos de una duración determinada después de un momento determinado:

ffmpeg -i INPUT -c copy -ss START_TIME -t DURATION_TIME -map 0 OUTPUT

Para conservar datos de una duración determinada después de comenzar:

ffmpeg -i INPUT -c copy -t DURATION_TIME -map 0 OUTPUT

Para evitar que los datos comiencen hasta cierto punto:

ffmpeg -i INPUT -c copy -to TIME_POINT -map 0 OUTPUT

El TIEMPO puede ser un número en segundos o en hh:mm:ss[.xxx]


Para unir archivos, cree un archivo llamado join.txtcon el contenido

file 'path-to-INPUT1'
file 'path-to-INPUT2'
file...etc

entonces

 ffmpeg -f concat -i join.txt OUTPUT

O:

Para unir archivos MPEG (incluidos archivos de transporte)

 ffmpeg -i "concat:INPUT-1|INPUT-2" -c copy -bsf:a aac_adtstoasc OUTPUT

Como solución GUI, probé Avidemux pero con malos resultados. Al buscar una solución Linux encontré este comentarioaquíapuntando aAvidemux todas las noches:

"Puedes probar Avidemux, pero no la estable. Deberías probar la versión win32 (sí, para Windows) con "Wine". Es compatible con H.264 y debes usar la doble flecha para encontrar los fotogramas clave porque puedes[ no] cortar en todas partes (debido a lo del "gop largo"... Pero, como todo software como este, puedes hacer SOLO CORTES, de lo contrario se renderizará (en el caso de transiciones, efectos, etc.). http://avidemux.org/nightly/win32/"

Lo he probado en Linux/Wine pero debería funcionar también en Windows.

ingrese la descripción de la imagen aquí

Para unir archivos, utiliceAbrir archivopara agregar el primer archivo y luegoAgregar archivopara el resto.

Ahorrar:Archivo - Guardar.

información relacionada