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

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

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

Tenho um arquivo de vídeo de origem que desejo primeiro 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 a este vídeo, ele tem qualidade boa e tamanho de arquivo pequeno o suficiente para minhas necessidades e carrega/reproduz em meu site.

Eu tenho uma página da web que permite aos usuários selecionar um início e um ponto final neste vídeo - e criar um clipe. Aqui está um exemplo do comando ffmpeg que 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 tem precisão de tempo suficiente. Normalmente, o áudio é preciso o suficiente, mas o vídeo para meio segundo antes ou algo assim.

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

EDIT: Adicionar -force_key_frames 00:00:00.2não ajudou.

EDIT: mudei o recorte para usar -c:v libx264 -c:a aac -strict experimentalem vez de -codec:v copy -codec:a copycom bons (ish) resultados.

O arquivo pode ser reproduzido externamente sem problemas - mas quando eu o carrego em 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 dura menos de um segundo.

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

Mas espere, o fato de ele ser reproduzido com precisão e sem problemas em um player como MPC ou Windows Media Player não sugere que seja um problema com o Google Chrome ou com o elemento de vídeo HTML? Ou estou usando uma codificação não suportada ou algo assim?

Responder1

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

Para alterar a qualidade de saída, source.mp4use a -crfopção com um valor entre 18-28 (23 é o padrão). Consulte a seção CRF doGuia de codificação FFmpeg e x264por exemplo.

Seu comando de corte pode ser simplificado:

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

Eu substituí -codec:v copy -codec:a copypor -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. Como você não pode dimensionar sem recodificar, sendo mutuamente exclusivo com -codec:v copy, e como sua entrada já está dimensionada para o tamanho definido, removi as opções de filtro.

Se ainda não for preciso o suficiente, 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 último, você deve executar source.mp4( qt-faststartlocalizado no diretório de ferramentas na fonte ffmpeg) ou usar a -movflags faststartopção. Isso realocará alguns dados para o início do arquivo para que ele possa começar a reprodução antes de ser completamente baixado.

informação relacionada