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

9

Eu 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 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 a este vídeo, ele é de qualidade e tamanho de arquivo pequenos o suficiente para minhas necessidades e carrega / reproduz no meu site.

Eu tenho uma página da Web que permite que os usuários selecionem um ponto de partida e um ponto final neste vídeo e criem 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 de segundo?

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

EDITAR: Alterei o recorte para usar -c:v libx264 -c:a aac -strict experimental em vez 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.

Devo experimentar 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 seja reproduzido com precisão, sem problemas, com um player como o MPC ou o Windows Media Player, sugere que seja um problema com o Google Chrome ou o elemento de vídeo HTML? Ou estou usando uma codificação não suportada ou algo assim?

    
por Pete Oakey 03.11.2012 / 20:56

1 resposta

8

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 o vídeo a partir de um período de tempo especificado para mais detalhes e exemplos.

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

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

Substitui -codec:v copy -codec:a copy por -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, sendo mutuamente exclusivo com -codec:v copy , e desde que sua entrada já é dimensionada para o tamanho do conjunto eu 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 último, você deve executar source.mp4 a qt-faststart (localizado no diretório de ferramentas na fonte ffmpeg) ou usar a opção -movflags faststart . Isso realocará alguns dados no início do arquivo para que ele possa iniciar a reprodução antes que seja completamente baixado.

    
por 03.11.2012 / 22:41