ffmpeg: extração extremamente precisa de segmentos de vídeo

2

Eu quero extrair segmentos de vídeo com pontos iniciais e finais extremamente precisos. Infelizmente, estou vendo apenas a precisão de um centésimo de segundo.

ffmpeg -i kayak.mp4 -ss 00:00:00 -t 2.86953 kayak_segment.mp4

Embora eu espere que esse segmento tenha uma duração de 2.86953 , a análise no segmento de saída mostra 2.891 .

ffprobe -i kayak_segment.mp4 -show_format -v quiet | sed -n 's/duration=//p'

(retorna 2.891000 )

Como garanto que as durações dos segmentos de vídeo extraídos estão tão próximas do especificado quanto possível? Eu não estou preocupado com o áudio.

Obrigado!

    
por keypulsations 09.12.2016 / 15:41

1 resposta

4

Os fluxos de vídeo e áudio não são contínuos, mas quantizados; portanto, para um fluxo de vídeo constante de 25 qps, a duração pode assumir valores de 0.04 s x N , em que N é o número de quadros. Se o codec de áudio for taxa de amostragem AAC @ 48000, em seguida, com 1024 amostras por quadro, a duração do áudio será múltiplos de 1024/48000 = 0.021333 s *.

Devido a como ocorre a codificação AAC, há um quadro de áudio silencioso / de preenchimento no início do fluxo de áudio cuja duração é 0.021333 s , mas cujo tempo de apresentação é -0.21333 . Em format , esse pacote é contabilizado (mas não em stream de duração).

Quando t é usado para aparar um clipe, todos os quadros cujos carimbos de data e hora de apresentação são inferiores a t são obtidos. A duração do último quadro de vídeo não é aparada, mas a duração do último quadro de áudio pode ser reduzida, mas isso também é quantizado. Então, a duração final de format será, AFAIK, Sum of all durations of packets of the stream featuring the greatest PTS .

Se você não estiver preocupado com o áudio, poderá retirá-lo (use -an ) e ver que seu valor t é quantizado de forma semelhante como o fluxo de vídeo.

    
por 11.12.2016 / 11:22

Tags