Eu quero um FFmpeg procurando um comando que seja rápido e preciso. Eu encontrei isso .
A solução é aplicarmos -ss
a entrada (busca rápida) e a saída (busca precisa). Mas: se a busca de entrada não é precisa, como podemos ter certeza de que a posição de busca é precisa?
Por exemplo: se quisermos procurar 00:03:00, o comando é algo como:
ffmpeg -ss 00:02:30 -i <INPUT> ... -ss 00:00:30 <OUTPUT>
O primeiro -ss
procurará outro lugar, não 00:02:30
, digamos 00:02:31
. E depois de aplicar a segunda busca, o resultado final seria 00:03:01
- não o que queremos. Isso está correto?
Onde o primeiro -ss
procura? Ele procura o quadro-chave mais próximo 00:02:30
?
00:02:31
Nesse caso , aqui está o meu pensamento - corrija-me se estiver errado: após a primeira busca, obtemos o registro de data e hora do resultado (neste exemplo :), então aplicamos a segunda busca com o tempo apropriado, neste caso 00:00:29
.
A pergunta é: como obtemos o registro de data e hora do primeiro resultado da pesquisa?
ffprobe
. Caso contrário, qualquer formato intermediário faria, por exemplo, ProRes 422, DNxHD, que são visualmente sem perdas e apenas dentro do quadro. Ou você usa algo como HuffYUV, etc. Mas você perderia o aspecto "rápido" novamente, é claro.Unrecognized option 'select_streams'
select_streams
opção foi adicionada em outubro de 2012 . :) Você poderia ficar sem isso, mas também obteria informações para os quadros de áudio, misturados entre eles.Entendo que essa pergunta tenha vários anos, mas a versão mais recente do ffprobe tem a capacidade de pular quadros . Você pode transmitir
-skip_frame nokey
informações apenas nos quadros-chave (quadros I). Isso pode economizar muito tempo! Em um arquivo MP4 de 2 GB e 1080p, demorava 4 minutos sem pular os quadros. A adição do parâmetro pular leva apenas 20 segundos.Comando:
ffprobe -select_streams v -skip_frame nokey -show_frames -show_entries frame = pkt_pts_time, tipo de imagem D: \ test.mp4
Resultados:
Portanto, os resultados conterão apenas informações sobre os quadros principais.
fonte
Com base na resposta do slhck , aqui está uma função bash que retornará o quadro-chave mais próximo que ocorre ANTES de
N
segundos.Isso também é utilizado
-read_intervals
para garantir que o ffprobe só comece a procurar seu quadro-chave 25 segundos antes deN
segundos. Esse truque e a saída do awk quando o carimbo de data e hora são encontrados aceleram bastante as coisas.exemplo de uso:
Eu uso isso para aparar arquivos de vídeo sem recodificá-los. Como você não pode adicionar novos quadros-chave sem recodificar, eu costumo
ffnearest
procurar o quadro-chave antes de querer cortar. Aqui está um exemplo:Observe que, para esse exemplo, pode ser necessário alterar o formato do que é passado no
-ss
parâmetro se você estiver procurando mais do que os primeiros 60 segundos.(irritantemente, dizendo ffmpeg procurar exatamente ao timestamp do quadro-chave parece fazer ffmpeg excluir esse quadro-chave na saída, mas subtraindo 0,5 segundos de timestamp real do quadro-chave faz o truque. Para o bash você precisa usar
bc
para avaliar expressões com decimais , mas no zsh-ss 00:00:$[$(ffnearest input.mkv 28)-0.5]
funciona.)fonte
Se você deseja obter informações dos quadros I, pode usar
fonte