Como obter o carimbo de hora do quadro-chave mais próximo antes de um determinado timestamp com o FFmpeg?

15

Eu quero um comando de busca do FFmpeg que seja rápido e preciso. Eu encontrei este .

A solução é que aplicamos -ss para entrada (busca rápida) e saída (busca precisa). Mas: Se a busca de insumos não é precisa, como podemos ter certeza de que a posição de busca é precisa?

Por exemplo: se quiséssemos procurar a 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? Procura o quadro-chave mais próximo de 00:02:30 ?

Se sim, aqui está o meu pensamento - corrija-me se estiver errado: depois da primeira busca, recebemos o carimbo de data e hora do resultado (neste exemplo: 00:02:31 ), então aplicamos a segunda busca com tempo apropriado, este caso 00:00:29 .

A pergunta é: Como obtemos o selo do primeiro resultado de busca?

    
por jackode 20.02.2013 / 05:41

2 respostas

16

Para responder literalmente à pergunta do seu título: Você pode obter uma lista de quadros I com

ffprobe -select_streams v -show_frames <INPUT> 

Você pode limitar ainda mais a saída necessária adicionando -show_entries frame=pkt_pts_time,pict_type .

Para ver qual quadro está mais próximo (vem depois) de um determinado timestamp, primeiro você precisa descobrir todos os timestamps dos quadros-chave, por exemplo, com awk .

Primeiro, defina a hora que você deseja procurar, por exemplo, 2: 30m, que é igual a 150s.

ffprobe -select_streams v -show_frames -show_entries frame=pkt_pts_time,pict_type -v quiet in.mp4 | 
awk -F= ' 
  /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } } 
  /pkt_pts_time/ { if (i && ($2 >= 150)) print $2; }  
' | head -n 1

Por exemplo, isso retornaria 150.400000 .

Observe que, ao usar -ss antes de -i , o FFmpeg localizará o quadro-chave anterior ao ponto de busca e atribuirá valores negativos de PTS a todos os quadros a seguir até atingir o ponto de busca. Um jogador deve decodificar, mas não exibir quadros com PTS negativo, e o vídeo deve começar com precisão.

Alguns jogadores não respeitam isso corretamente e exibem vídeo preto ou lixo. Nesse caso, o script acima pode ser usado para localizar o PTS do quadro-chave após seu ponto de busca e usá-lo para começar a procurar no quadro-chave. Isso, no entanto, não será preciso.

Observe que, se você quiser ser super preciso durante a pesquisa e manter a compatibilidade com muitos players, provavelmente deverá converter o vídeo em qualquer formato intra-only sem perdas, onde poderá cortar a qualquer momento e recodificar isto. Mas isso não será rápido.

    
por 20.02.2013 / 09:18
0

se você quiser obter informações dos quadros I, você pode usar

ffprobe -i input.mp4 -v quiet -select_streams v -show_entries frame=pkt_pts_time,pict_type|grep -B 1 'pict_type=I'
    
por 19.01.2018 / 11:28

Tags