Tengo un montón de segmentos ts descritos por un solo archivo index.m3u8:
index.m3u8
segment1_0_av.ts
segment2_0_av.ts
segment3_0_av.ts
segment4_0_av.ts
segment5_0_av.ts
Sé que todos están codificados de la misma manera. ffprobe me da lo siguiente:
Input #0, mpegts, from 'segment1_0_av.ts':
Duration: 00:00:10.00, start: 0.100511, bitrate: 1251 kb/s
Program 1
Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 960x540 [SAR 1:1 DAR 16:9], 12.50 fps, 25 tbr, 90k tbn, 25 tbc
Stream #0:1[0x101]: Audio: aac ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 105 kb/s
Stream #0:2[0x102]: Unknown: none ([21][0][0][0] / 0x0015)
Me gustaría combinarlos en un solo contenedor mp4. Pero cuando intento comandos como:
ffmpeg -f concat -i filelist.txt -c copy output.mp4
donde genera el archivo listlist.txt del archivo index.m3u8, se queja de no poder leer varios archivos. Pero la conversión de los archivos ts en sí parece funcionar bien. Creo que no estoy usando ffmpeg correctamente.
¿Cómo uso ffmpeg para combinar los archivos ts descritos por index.m3u8 en un solo contenedor mp4 usando el códec de copia?
-bsf:a aac_adtstoasc
.ffmpeg copy ...
, escopy ...
(bajo Windows)Usar copy o cat para combinar los archivos como la respuesta principal actual de szatmary podría dejarlo con un archivo que se reproduce mucho más allá del límite y no puede buscar problemas de reproducción.
En cambio, para combinar estos archivos correctamente, use ffmpeg como se indica en https://trac.ffmpeg.org/wiki/Concatenate . (Instale ffmpeg aquí si aún no lo tiene https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg ).
Si eres demasiado vago para leer mi primer enlace, básicamente tienes que crear un archivo .txt que enumere todos los archivos que deseas combinar de esta manera (que mi primer enlace da instrucciones sobre cómo hacerlo fácilmente) en la carpeta donde estás ' re haciendo la concatenación:
Aquí hay una copia y pego de mi primer enlace en una forma de crear un archivo de texto si tiene Windows en la línea de comandos, por ejemplo, pero obviamente puede hacer el archivo manualmente o como quiera:
¡Verifique que su archivo .txt se vea bien y esté formateado correctamente!
Después de esto, en la línea de comandos ejecute:
donde 'mylist.txt' es el archivo .txt que acaba de crear.
Verifique si el archivo resultante reproduce el video correctamente. Desde aquí, puede transmux a mp4 como de costumbre si lo desea:
fuente
for %i in (*.ts) do
no se ordena correctamente para i> = 10. Aparte de eso, todo funciona, gracias. De hecho, hubo problemas con el archivo concatenado, sin mencionar que el archivo creado con su método resultó ser un 16% más pequeño (tenía 1400 partes por 400kb).for i in {1..10}; do echo file \'$i.ts\' >> list.txt ; done
Respuesta 2017
Cuando ejecuto
ffmpeg -i some.ts -c copy some.mp4
un video determinado, aparece este mensaje de error:No es sorprendente que la ejecución lo
ffmpeg -i some.ts -c copy -bsf:a aac_adtstoasc some.mp4
corrija.fuente
ffmpeg
y ahora lo hará automáticamente.Poniendo todo junto
Usando la respuesta de Juan Aquino (y corrigiendo el primer comando para que sea compatible con Bash y usando el orden natural de los archivos), más la respuesta de 7vujy0f0hy, un script de trabajo simple para un shell de Linux Bash es:
fuente
La forma correcta de concatenar múltiples archivos de video de la lista de reproducción m3u8 es
ffmpeg -i "index.m3u8" -codec copy output.mp4
-codec copy
para evitar la codificación*.mp4
está bien, pero parece un poco lento para mux cuando la lista de reproducción se obtiene de la web*.mkv
o*.ts
funcionó mejor para mífuente
Puede hacer la concatenación simple de esta manera (con bash):
Reemplazar
<number>
con el número más alto (obviamente). Las variantes con ffmpeg no funcionaron correctamente. El archivo de video de salida tartamudearía de manera extraña.Utilizo el bucle for para garantizar el orden correcto de los archivos. Quizás no lo necesites. Tal vez incluso sea posible canalizar la salida a ffmpeg y convertirla a mp4 sobre la marcha.
fuente
Puede utilizar la canalización de estos archivos ts para ffmpeg y generar el archivo mp4.
cat *.ts | ffmpeg -i pipe: -c:a copy -c:v copy output.mp4
o Si su nombre de archivo no tiene orden,
grep .*.ts index.m3u8 | xargs cat | ffmpeg -i pipe: -c:a copy -c:v copy output.mp4
fuente
Todas las respuestas populares a esta pregunta que inducen a error a los lectores a concatenar los archivos TS antes de ejecutar ffmpeg son incorrectas. Para asegurarse de que el audio y el video no se desincronicen durante el ensamblaje de la transmisión mp4, se debe utilizar la característica "f concat" mal documentada pero importante de ffmpeg.
Las dos líneas de código preparatorias simplemente crean un archivo que contiene una lista de archivos TS en este formato de línea:
fuente