FFMPEG:

FFMPEG:

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

Tenho dois arquivos de vídeo gravados com a extensão .ts. Preciso remover alguma parte do primeiro, dividir o segundo e depois mesclar o primeiro arquivo com a primeira parte (dividida) 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.

Quero processá-los sem transcodificar os arquivos, pelo menos poder remover o início, etc.

FFMPEG:

ffmpeg -i source.mtsdá:

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

Acho que é muito viável com o ffmpeg, que também é multiplataforma, como um comando que encontreiaqui 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 desta forma apenas o primeiro Stream #0:2[0x2da](fra)áudio ( ) é obtido. O que eu quero é: ou todo o áudio, ou o terceiro ( Stream #0:3[0x2db](qaa)). Como ajustar?

ffmpegdeve, portanto, trabalhar para:

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

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

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


O que eu tentei:

Openshot: não é possível processar sem transcodificação.

Avidemux (Linux): ao tentar salvar diz"Isto não é compatível com MPEG - Você não pode usar o codec Copy."

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

Responder1

Como faço para dividir e unir arquivos ffmpegmantendo todas as faixas de áudio?

Como você descobriu, uma cópia bitstream selecionará apenasumfaixa (áudio), conformedocumentação de especificação de fluxo:

Por padrão, ffmpeginclui apenas um fluxo de cada tipo (vídeo, áudio, legenda) presente nos arquivos de entrada e os adiciona a cada arquivo de saída. Ele escolhe o “melhor” de cada um com base nos seguintes critérios: para vídeo, é o stream com maior resolução, para áudio, é o stream com mais canais, para legendas, é o primeiro stream de legendas. No caso em que vários fluxos do mesmo tipo têm taxas iguais, o fluxo com o índice mais baixo é escolhido.

Selecionartodosfaixas 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 oterceirofaixa de áudio:

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 noopções avançadasseção da ffmpegdocumentação.

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

Dividir:

Então, combinando-os com o que você deseja alcançar nos dois arquivos em termos de divisão para posterior rejunçã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

Darei à você:

  • OutputOne.ts, que é tudodepoisos primeiros dois minutos do primeiro arquivo de entrada
  • OutputTwo.ts, qual é oprimeiro3 minutos e 5 segundos do segundo arquivo de entrada

Juntar:

ffmpegsuporta concatenação de arquivos sem recodificação,descrito extensivamente 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 ffmpegcomando pode usar o concat demuxer:

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

Como você está trabalhando com mpegfluxos de transporte ( .ts), vocêdeveser capaz de usar o concatprotocolotambém:

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

De acordo com o exemplo na página concat vinculada acima. Vou deixar isso para você experimentar.

Responder2

Como resposta simplificada baseada na principal:

Para manter os dados após um ponto inicial (até o final):

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

Para manter os dados entre dois pontos no tempo:

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

Para manter 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 dados de uma determinada duração após o início:

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

Para evitar que os dados comecem até um ponto no tempo:

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.txtcom 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 solução GUI, tentei o Avidemux, mas com resultados ruins. Ao pesquisar uma solução Linux, encontrei este comentárioaquiapontando paraAvidemux todas as noites:

"Você pode experimentar 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ê pode[ não] cortar em todos os lugares (devido à coisa do "long gop"... Mas, como todo software como esse, você pode fazer APENAS CORTES caso contrário ele irá renderizar (no caso de transições, efeitos, etc.). http://avidemux.org/nightly/win32/"

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

insira a descrição da imagem aqui

Para juntar arquivos, useAbrir arquivopara adicionar o primeiro arquivo e depoisAnexar arquivopara o resto.

Salvar:Arquivo - Salvar.

informação relacionada