Use o codec de cópia ffmpeg para combinar arquivos * .ts em um único mp4

33

Eu tenho um monte de segmentos ts descritos por um único arquivo index.m3u8:

index.m3u8        
segment1_0_av.ts  
segment2_0_av.ts  
segment3_0_av.ts  
segment4_0_av.ts  
segment5_0_av.ts

Eu sei que eles são todos codificados da mesma maneira. ffprobe me dá o seguinte:

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)

Gostaria de combiná-los em um único contêiner mp4. Mas quando eu tento comandos como:

ffmpeg -f concat -i filelist.txt -c copy output.mp4

onde o arquivo filelist.txt é gerado a partir do arquivo index.m3u8, ele se queixa de não conseguir ler vários arquivos. Mas a conversão dos arquivos ts parece funcionar bem. Eu acho que não estou usando o ffmpeg corretamente.

Como eu uso o ffmpeg para combinar os arquivos ts descritos por index.m3u8 em um único contêiner mp4 usando o codec de cópia?

    
por Ana 25.12.2013 / 18:53

5 respostas

47

Não sei por que o ffmpeg está causando um erro. No entanto, ts é um dos poucos formatos que podem ser simplesmente concatenados. Então, quando você tiver um único ts, transmux para mp4.

No Windows:

copy /b segment1_0_av.ts+segment2_0_av.ts+segment3_0_av.ts all.ts
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4

Em GNU / Linux, usando o bash:

cat segment1_0_av.ts segment2_0_av.ts segment3_0_av.ts > all.ts
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4
    
por 25.12.2013 / 19:42
18

Usar o copy ou o cat para combinar os arquivos como a resposta principal atual do szatmary pode deixá-lo com um arquivo que reproduz muito além do limite e não pode atender aos problemas de reprodução.

Em vez disso, para combinar esses arquivos corretamente, use o ffmpeg conforme instruído no link . (Instale o ffmpeg aqui se você ainda não tiver o link .)

Se você está com preguiça de ler meu primeiro link, você basicamente tem que criar um arquivo .txt listando todos os arquivos que você deseja combinar (o primeiro link fornece instruções sobre como fazer facilmente) na pasta. onde você está fazendo a concatenação:

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

Aqui está uma cópia do meu primeiro link em uma maneira de criar um arquivo de texto se você tiver o Windows na linha de comando, por exemplo, mas obviamente você pode fazer o arquivo manualmente ou como quiser:

(for %i in (*.ts) do @echo file '%i') > mylist.txt

Verifique se o arquivo .txt está com boa aparência e está formatado corretamente.

Depois disso, na linha de comando, execute:

ffmpeg -f concat -i mylist.txt -c copy all.ts

onde 'mylist.txt' é o arquivo .txt que você acabou de criar.

Verifique se o arquivo resultante reproduz vídeo corretamente. A partir daqui, você pode transmuxar para mp4 como de costume, se quiser:

ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4
    
por 01.01.2017 / 20:32
6

resposta de 2017

But when I try commands like ..., it complains about not being able to read various files.

Quando executo ffmpeg -i some.ts -c copy some.mp4 em um determinado vídeo, recebo esta mensagem de erro:

Malformed AAC bitstream detected: use the audio bitstream filter 
'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)

av_interleaved_write_frame(): Operation not permitted

Não é de surpreender que a execução de ffmpeg -i some.ts -c copy -bsf:a aac_adtstoasc some.mp4 o conserte.

    
por 25.03.2017 / 23:38
2

Colocando todos juntos

Usando a resposta de Juan Aquino (e corrigindo o primeiro comando para ser compatível com o Bash e usando a ordenação natural dos arquivos), mais a resposta do 7vujy0f0hy, um simples script de trabalho para um shell Bash do Linux é:

#!/bin/bash
for i in 'ls *.ts | sort -V'; do echo "file $i"; done >> mylist.txt
ffmpeg -f concat -i mylist.txt -c copy -bsf:a aac_adtstoasc video.mp4
    
por 11.11.2017 / 11:10
2

Você pode fazer a concatenação simples assim (com bash):

for f in ./{0..<number>}.ts; do cat $f >> out.ts; done

Substitua <number> pelo número mais alto (obviamente). As variantes com ffmpeg não funcionaram corretamente. O arquivo de vídeo de saída iria gaguejar estranhamente.

Eu uso o loop for para garantir a ordem correta dos arquivos. Talvez você não precise disso. Talvez seja possível canalizar a saída para o ffmpeg e convertê-lo para o mp4 em tempo real.

    
por 05.01.2018 / 20:00