Questão corte preciso de vídeo (+ áudio) com ffmpeg


Quero que meu site permita que os usuários criem seus próprios clipes com precisão a partir de um vídeo de origem que eu forneço.

Eu tenho um arquivo de vídeo de origem que eu primeiro quero converter em algo adequado para um site:

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

Eu uso o ffmpeg para convertê-lo assim:

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

Assistindo este vídeo de volta é bom o suficiente qualidade e tamanho de arquivo pequeno o suficiente para as minhas necessidades, e carrega / joga no meu site.

Eu tenho uma página da Web que permite aos usuários selecionar um ponto de início e um ponto final neste vídeo e criar um clipe. Aqui está um exemplo do comando ffmpeg que eu uso para isso:

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

O problema é que o clipe nem sempre é preciso no tempo. Normalmente, o áudio é preciso o suficiente, mas o vídeo pára meio segundo mais cedo ou algo assim.

Existe alguma maneira de tornar isso preciso e sincronizado, digamos, 0,2 segundo?

EDITAR: Adicionando -force_key_frames 00:00:00.2 não ajudou.

EDITAR: Eu mudei o recorte para usar -c:v libx264 -c:a aac -strict experimental ao invés de -codec:v copy -codec:a copy com bons resultados (ish).

O arquivo pode ser reproduzido externamente sem problema - mas quando eu o carrego no meu elemento de vídeo html5 e o reproduzo - a última parte do vídeo (o áudio está bom) congela. A última parte que congela tem menos de um segundo de duração.

Devo tentar com outro codificador de vídeo? Qual é a melhor alternativa para libx264? Tendo em mente, provavelmente, quero que isso esteja em um site público.

Mas espera-se que o fato de que ele funcione com precisão sem problemas com um player como o MPC ou o Windows Media Player sugira que isso seja um problema com o Google Chrome ou com o elemento de vídeo HTML? Ou estou usando uma codificação sem suporte ou algo assim?


8


origem


Isso pode ter a ver com o tempo dos quadros principais. Em qualquer caso, isso deve ser movido para SuperUser.com. - Brad
Oi, o ffmpeg não pode cortar o vídeo a qualquer momento, só pode cortar em quadros-chave; Por esse motivo, o áudio é quase preciso, enquanto o vídeo não é.
Posso me mover sozinho? Vou tentar adicionar quadros chave ao arquivo de origem com -force_key_frames 00: 00: 00.2 - Pete Oakey


Respostas:


O comportamento de -ss muda dependendo se usado como uma opção de entrada ou saída e é geralmente mais lento, mas pode ser mais preciso quando usado como uma opção de saída. Veja a resposta para O ffmpeg converte vídeo de um período de tempo especificado lentamente para mais detalhes e exemplos.

Para alterar a qualidade de saída source.mp4 use o -crf opção com um valor entre 18 e 28 (23 é o padrão). Veja a seção CRF do Guia de codificação FFmpeg e x264 por exemplo.

Seu comando de aparagem pode ser simplificado:

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

Eu troquei -codec:v copy -codec:a copy com -c copy -map 0. Isso copiará todos os fluxos em vez de apenas os primeiros fluxos de vídeo e áudio, embora a entrada tenha apenas dois fluxos devido ao seu comando anterior. Desde que você não pode escalar sem re-codificação, portanto, ser mutuamente exclusivo com -codec:v copye como sua entrada já está dimensionada para o tamanho do conjunto, removi as opções de filtro.

Se ainda não for preciso, tente:

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

Será mais lento, mas provavelmente mais preciso. Veja os links na resposta no primeiro link que forneci para uma descrição das diferenças desses dois exemplos.

Por fim, você deve executar source.mp4 através qt-faststart (localizado no diretório de ferramentas na fonte ffmpeg), ou use o -movflags faststart opção. Isso realocará alguns dados no início do arquivo para que ele possa iniciar a reprodução antes de ser completamente baixado.


6



+1 para as dicas, mas tentei ffmpeg -i source.mp4 -ss 577.92 -t 011.980 -c copie -map 0 clip1.mp4 mas a primeira parte (quase um segundo) e a última parte (talvez um quarto de segundo) do o vídeo é perdido, o áudio está bem. - Pete Oakey
@PeteOakey Você tentou cortar sem cópia de bitstream, mas a re-codificação atual? - slhck
Tentei sem cópia de bitstream - resultados acrescentados à minha pergunta. - Pete Oakey
Usando -ss como opção de saída ao invés de opção de entrada consertada meu problema: o primeiro quadro de vídeo ficou em torno de 1s no vídeo de saída, com apenas áudio antes disso (também confirmado por ffprobe -show_frames). Movendo-se -ss depois de -i fez a saída de quadros de áudio e vídeo a partir do quadro 0. - CoDEmanX