
Eu li sobre corte e emenda usandoconcatmas isso não é suficiente para mim.
Gostaria de cortar as partes marcadas do vídeo e juntá-las em um único arquivo de vídeo sem recodificar. É possível cortar e mesclar (na memória) de uma só vez?
Não deve haver limite teórico para o número de partes de vídeo a serem cortadas ou unidas. O áudio deve estar sincronizado.
Vídeo: H.264+AAC
Editar:
Com as respostas, aprendi que a recodificação de vídeo ainda é necessária.
Gostaria de esclarecer que cortar videoclipes do meio de um arquivo de vídeo pode ser feito em várias etapas. Eu estava pensando que processar o vídeo de uma só vez seria melhor em termos de desempenho, salvando algumas atividades de E/S. Contudo, não é um objectivo em si.
Responder1
Sua pergunta, se acertei, tem quatro partes principais:
- Como cortar um segmento de tempo de um filme
- Como mesclar vários segmentos
- Como fazer o acima sem transcodificar o filme, sem perder qualidade
- Como fazer o que foi dito acima de forma eficiente em termos de velocidade
Cortando um segmento de tempo
Você pode cortar um segmento pulando para seu ponto inicial com a -ss
opção e, em seguida, definindo a duração do segmento com -t
ou definindo o ponto final com -to
:
# skip 30 seconds, then copy the next 60 seconds
ffmpeg -ss 30 -t 60 full-movie.mp4 segment.mp4
Na documentação do ffmpeg consulte a seção5.4 Opções Principaisem relação à diferença entre colocar as opções -ss
e -t
antes do arquivo de entrada ou antes do arquivo de saída. Depois de experimentar isso, você poderá achar essa diferença relevante no seu caso.
Nota importante: O exemplo acima faz com que o vídeo seja transcodificado. Discutiremos abaixo a possibilidade de fazer isso sem transcodificação.
Mesclando Vários Segmentos
Existem três métodos principais para mesclar filmes, dois deles são melhor explicados nesteartigo wiki do ffmpeg, e o terceiro é odesmultiplicador concat. Se todos os seus segmentos forem idênticos em termos de especificação de codificação a/v e formato do contêiner, você provavelmente encontrará o método mais fácil para ser o concat:
protocolo:
# merge the segments
ffmpeg -i "concat:seg1.mp4|seg2.mp4|seg3.mp4" final.mp4
É importante notar que esta fusão, assim como o corte, mais uma vez transcodifica o filme, então temos aqui uma transcodificação de uma transcodificação, potencialmente degradando a qualidade do vídeo, então temosrealmentequeremos evitar essa transcodificação tanto quanto pudermos!
Cortar e mesclar sem transcodificação
A razão pela qual os exemplos nas seções anteriores exigem transcodificação é porque cada arquivo e cada segmento resultante é um filme independente que foi compactado para fornecer todas as coisas que você espera ao abrir um filme completo, como a duração do filme e outros metadados. Mas ei, você não pretende reproduzi-los como filmes independentes, você deseja que esses segmentos se tornem parte de um fluxo de vídeo maior. Portanto, em vez de servir ffmpeg com filmes in a box, é melhor reembalar - re-mux - os arquivos de entrada em um contêiner de streaming em tempo real, esquecendo-se das coisas de cabeçalho que você realmente não precisa neste momento. No caso do H.264, o formato streaming mux é chamado MPEG-TS, e aqui está como você re-muxa seu stream sem transcodificá-lo:
# re-muxing the whole movie (see a better option in next example)
ffmpeg -i full-movie.mp4 -c:v copy -c:a copy -bsf:v h264_mp4toannexb full-movies-as-ts.ts
Bem, como você já está nisso, você também pode aproveitar esta oportunidade para cortar apenas o segmento que precisa:
# skip 30 seconds and re-mux a 60 seconds segment
ffmpeg -ss 30 -t 60 -i full-movie.mp4 -c:v copy -c:a copy -bsf:v h264_mp4toannexb segment.ts
Ao mesclar os segmentos TS, você também pode re-muxar de volta para um contêiner mp4:
# merge the segments and re-mux them as mp4
ffmpeg -i "concat:seg1.ts|seg2.ts|seg3.ts" -c:v copy -c:a copy -movflags empty_moov -flags global_header -bsf:v dump_extra edited-final.mp4
Então agora fizemos tudo sem nunca transcodificar o filme, preservando a qualidade original. Mas como sempre, há uma ressalva...
EMBARGO: O corte só pode ser feito em um limite de quadro-chave. Explicação: O H.264 organiza os quadros compactados em pacotes, cada um começando com uma imagem completa, porém compactada, do primeiro quadro, seguida pelos deltas dos quadros seguintes, diminuindo assim o armazenamento necessário para cada pacote. Para o nosso propósito, cada pacote é como um zip selado de todos os quadros durante esse período - ou é tudo ou nada. Se você quiser apenas um pedaço do pacote, terá que descompactá-lo e zipá-lo de volta, em outras palavras - para transcodificá-lo. Portanto, o método acima só é relevante se você tiver um quadro-chave em cada posição onde deseja cortar o filme. Por exemplo, se você tiver um quadro-chave a cada 5 segundos, poderá cortá-lo apenas a cada 5 segundos.
Portanto, agora a questão é se você pode aceitar as limitações dos pontos de corte, especialmente porque você provavelmente não tem ideia de onde há quadros-chave no filme. E foi por isso que sugeri acima ler5.4 Opções Principaissobre como especificar -s
e -t
antes da entrada ou antes da saída. Se você especificar antes da entrada, o ffmpeg encontrará um quadro-chave próximo para realizar sua solicitação, que será "mais ou menos" onde você deseja realizar o corte. Se você não se importa com a precisão do corte, tudo bem, vá em frente.
Mas se você precisa que o corte esteja nessa posição precisa, então você não tem escolha, você deve decodificar o filme para localizar o quadro que está procurando. Bem, pelo menos temosalgunsboas notícias: em vez de transcodificar e retranscodificar, você pode fazer uma única transcodificação, o que melhora um pouco a situação:
# skip PRECISELY 30 seconds and transcode a 60 seconds TS segment
ffmpeg -i full-movie.mp4 -ss 30 -t 60 -bsf:v h264_mp4toannexb segment.ts
Como os segmentos resultantes estarão em TS, não há necessidade de outra transcodificação ao mesclar os segmentos.
Velocidade
Noartigo wiki do ffmpeg sobre fusãohá uma explicação de como executar todo o processo através de pipes, eliminando assim a necessidade de arquivos intermediários e agilizando todo o processo.NÃO.Isso levará vocêmais longo. A razão pela qual fazer tudo na memória levará mais tempo não é porque ele será executado por mais tempo, mas porque você não terá resultados intermediários ao descobrir como fazer tudo, e você se verá executando todo o processo novamente e de novo. Então a teoria dos tubos é boa, mas no seu caso você deve começar trabalhando e aperfeiçoando cada passo. Você descobrirá que fazer tudo funcionar e produzir um resultado decente exigirá mais alguns ajustes e ajustes. Depois de dominar todo o processo e desejar fazer alguns scripts para edição automatizada em massa, você poderá revisitar o conceito de tubulação.
Espero que o acima ajude.