Como dividir e ingressar sem transcodificar arquivos de vídeo AVC / MPEG-TS no Windows com o ffmpeg?

3

Estou procurando também uma solução Linux (em uma pergunta separada )

Eu tenho dois arquivos de vídeo gravados com a extensão .ts . Eu preciso remover algumas partes do primeiro, dividir o segundo e, em seguida, mesclar o primeiro arquivo com a primeira parte (split) do segundo arquivo.

Ambos têm as mesmas 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

Eles também contêm várias faixas de áudio e legendas.

Eu quero processá-los sem transcodificar os arquivos, pelo menos, ser capaz de remover o começo, etc.

FFMPEG :

ffmpeg -i source.mts dá:

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

Eu acho que é muito bem factível com ffmpeg , que também é multi-plataforma, como um comando que eu achei aqui para remover uma parte de um arquivo.

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

funciona, exceto pelo fato de que a entrada possui quatro trilhas de áudio e, dessa forma, somente o primeiro ( Stream #0:2[0x2da](fra) ) de áudio é capturado. O que eu quero é: ou todo o áudio, ou o terceiro ( Stream #0:3[0x2db](qaa) ). Como ajustar?

Portanto,

ffmpeg deve funcionar para:

1. Cortar o início do primeiro arquivo (remova os primeiros 2 minutos do arquivo de 1h40 min)

2. Dividir um segundo (1 hora) arquivo em duas partes (após 3,05 minutos)

3. Junte (acrescente) ao final do primeiro arquivo a parte de 3,05 min obtida da divisão do segundo arquivo.

O que tentei:

Openshot: não pode processar sem transcodificação.

Avidemux (Linux): ao tentar salvá-lo, diz "Isso não é compatível com MPEG - você não pode usar o codec de cópia".

Avidemux no Windows: o áudio está fora de sincronia.

    
por cipricus 29.09.2015 / 13:31

2 respostas

5

Como faço para dividir e juntar arquivos usando ffmpeg enquanto retendo todas as faixas de áudio?

Como você descobriu, uma cópia em bitstream selecionará apenas uma (áudio) faixa, conforme a documentação de especificação de fluxo :

By default, ffmpeg includes only one stream of each type (video, audio, subtitle) present in the input files and adds them to each output file. It picks the "best" of each based upon the following criteria: for video, it is the stream with the highest resolution, for audio, it is the stream with the most channels, for subtitles, it is the first subtitle stream. In the case where several streams of the same type rate equally, the stream with the lowest index is chosen.

Para selecionar todas faixas de áudio:

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 selecionar a faixa de áudio third :

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

Você pode ler mais e ver outros exemplos de seleção de fluxo na seção opções avançadas do ffmpeg documentação.

Eu também combinaria -vcodec copy -acodec copy de seu comando original em -c copy como acima para compactação de expressão.

Divisão:

Assim, combinando aqueles com o que você deseja alcançar nos dois arquivos em termos de divisão para posterior reinserção:

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

vai te dar:

  • OutputOne.ts , que é tudo após os dois primeiros minutos do primeiro arquivo de entrada
  • OutputTwo.ts , que é o primeiro 3 minutos e 5 segundos do segundo arquivo de entrada

Participar:

ffmpeg suporta a concatenação de arquivos sem recodificação, amplamente descrito em sua documentação de concatenação .

Crie sua listagem de arquivos a serem unidos (por exemplo, join.txt ):

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

Então, seu comando ffmpeg pode usar o concat demuxer :

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

Como você está trabalhando com mpeg streams de transporte ( .ts ), você deve também usar o

protocolo de concat :

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

Por exemplo, na página de concatuada vinculada acima. Vou deixar isso para você experimentar.

    
por 29.09.2015 / 14:52
1

Como uma resposta simplificada baseada na principal:

Para manter os dados depois de um ponto inicial (até o final):

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

Para manter os dados entre dois pontos de tempo:

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

Para manter os dados de uma determinada duração após um determinado ponto:

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

Para manter os dados de uma determinada duração após o início:

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

Para manter os dados desde o começo até um momento:

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

TIME pode ser um número em segundos, ou em hh: mm: ss [.xxx]

Para juntar arquivos, crie um arquivo chamado join.txt com o conteúdo

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

então

 ffmpeg -f concat -i join.txt OUTPUT

Ou:

Para juntar arquivos MPEG (incluindo arquivos de transporte)

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

Como uma solução de GUI, tentei o Avidemux, mas com resultados ruins. Ao pesquisar uma solução Linux, encontrei este comentário aqui apontando para o Avidemux à noite :

"Você pode tentar o Avidemux, mas não o estável. Você deve tentar a versão win32 (sim, para windows) com" Wine ". Ele suporta H.264 e você deve usar a seta dupla para descobrir os quadros-chave, porque você não pode cortar em todos os lugares (devido à coisa "longa gop" ...). Mas, como todo software como esse, você pode fazer APENAS CORTES senão ele renderiza (no caso de transições, efeitos, etc. . link "

Eu testei isso no Linux / Wine, mas ele deve funcionar no Windows também.

Para juntar arquivos, use File-Open para adicionar o primeiro arquivo, e depois File-Append para o resto.

Para salvar: Arquivo - Salvar.

    
por 01.10.2015 / 14:20