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.mts
da:
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?
ffmpeg
Por 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 ffmpeg
mientras 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,
ffmpeg
incluye 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 ffmpeg
documentación.
También combinaría -vcodec copy -acodec copy
su comando original con -c copy
el 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 entradaOutputTwo.ts
, Cuál es elprimero3 minutos y 5 segundos del segundo archivo de entrada
Unirse:
ffmpeg
admite 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 ffmpeg
comando puede usar concat demuxer
:
ffmpeg -f concat -i join.txt -c copy FinalOutput.ts
Dado que está trabajando con mpeg
flujos 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.txt
con 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.
Para unir archivos, utiliceAbrir archivopara agregar el primer archivo y luegoAgregar archivopara el resto.
Ahorrar:Archivo - Guardar.