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.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
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?
ffmpeg
deve, 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 ffmpeg
mantendo 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,
ffmpeg
inclui 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 ffmpeg
documentação.
Eu também combinaria -vcodec copy -acodec copy
seu comando original -c copy
como 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 entradaOutputTwo.ts
, qual é oprimeiro3 minutos e 5 segundos do segundo arquivo de entrada
Juntar:
ffmpeg
suporta 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 ffmpeg
comando pode usar o concat demuxer
:
ffmpeg -f concat -i join.txt -c copy FinalOutput.ts
Como você está trabalhando com mpeg
fluxos 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.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 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.
Para juntar arquivos, useAbrir arquivopara adicionar o primeiro arquivo e depoisAnexar arquivopara o resto.
Salvar:Arquivo - Salvar.