Como extraio os carimbos de data e hora associados aos quadros que o ffmpeg extrai de um vídeo com a opção -r?

12
ffmpeg -i myvid.mp4  -r  25  -t  100  image-%d.jpeg 

É o comando que estou usando para extrair quadros e está funcionando exatamente como eu esperava. No entanto, eu também gostaria de observar os registros de data e hora dos quadros. Com qualquer precisão. 100 milissegundos é bom o suficiente para mim. O ffmpeg pode fazer isso?

Fornecendo detalhes adicionais,

Quando executo o comando acima, recebo cerca de 100 JPEGs, acho que há uma correspondência de 1 para 1 (ou muitos para 1) entre esses JPEGS e os quadros do vídeo. Gostaria de saber o registro de data e hora do quadro que foi gerado como uma imagem JPEG 'i'.

Além disso, tentei o ffprobe, mas acho que ele informa até a duração do vídeo de maneira imprecisa :(

Srini
fonte
Como o que? O JPEG AFAIK não possui esses metadados. O carimbo de data / hora EXIF ​​é para o capturetempo.
Rajib
Claro que o JPEG não possui os metadados, mas o mp4 pode. Posso direcionar o ffmpeg para puxá-lo junto com os quadros que posteriormente codifica como JPEGS e despejar os carimbos de data / hora em um arquivo?
Srini
Por favor inclua a ffmpegsaída completa do console do seu comando.
Llogan
O ffprobe pode fornecer as informações de registro de data e hora do fluxo de vídeo mp4. Você está perguntando como se os quadros podem ser duplicados ou descartados, qual é a correspondência com os carimbos de data e hora originais do mp4? Nesse caso, eu exploraria o aumento das configurações de verbosidade para ver se é possível obter o quadro a quadro durante a execução. Você poderia expandir o que quer dizer com "registros de data e hora associados aos quadros".
dstob
@dstob Os registros de data e hora associados aos quadros são os registros de apresentação do vídeo de entrada, ou seja, quando cada quadro deve ser exibido, em relação ao início do vídeo.
slhck

Respostas:

13

O que você pode fazer é "simular" o processo de gravação da imagem, filtrando com o fpsfiltro e usando ffprobepara mostrar os carimbos de data / hora dos quadros gerados. Isso significa que, a 25 qps, o 50º quadro (como sua 50ª imagem) terá um PTS de 2,00 segundos.

Você faz assim:

ffprobe -f lavfi -i "movie=input.mp4,fps=fps=25[out0]" -show_frames -show_entries frame=pkt_pts_time -of csv=p=0

Saída:

0
0.04
0.08
0.12
0.16
...

Esses são os carimbos de data e hora para cada imagem de saída. Você pode realmente combinar a lista de quadros e os carimbos de data e hora:

imagem ls -1 - *. jpeg> images.txt
ffprobe -f lavfi -i "movie = input.mp4, fps = fps = 25 [out0]" -show_frames -show_entries frame = pkt_pts_time -of csv = p = 0> frames.txt
cole images.txt frames.txt> combinado.txt

Criará um arquivo com:

image-0001.jpeg 0
image-0002.jpeg 0.04
image-0003.jpeg 0.08
image-0004.jpeg 0.12

Observe que isso pode resultar em linhas estranhas se houver muitos quadros ou muitas linhas de saída de informações. Parece um pouco impreciso lá.

slhck
fonte
Esse é o carimbo de data / hora em relação a uma taxa de quadros constante colocada na saída ou a correspondência dos jpegs emitidos com os carimbos de data e hora mp4 originais que poderiam ser qualquer taxa de quadros e ter valores de carimbo de data / hora?
dstob
Esse registro de data e hora é baseado na taxa de quadros de saída solicitada. Ela se relaciona às imagens de saída e aos quadros de vídeo de entrada originais de onde elas vieram - há apenas uma base de tempo. Isso funciona porque, ao alterar a taxa de quadros, o ffmpeg (obviamente) não reproduz o vídeo mais rapidamente, mas "aumenta" o tempo de apresentação de cada quadro e descarta os quadros desnecessários.
slhck
Por que deve haver apenas uma base de tempo quando você está criando manualmente a base de tempo de saída? Isso nem sempre será o caso, é claro, mas no primeiro vídeo de 60 qps que eu lancei, o ffmpeg acabou de criar sua própria base de tempo, ignorando os carimbos de hora da entrada.
dstob
Não sei se entendi exatamente o que você está falando. O ffmpeg seleciona como base de tempo de entrada o que for analisado como a base de tempo do primeiro arquivo de entrada . Obviamente, você também pode dizer ao ffmpeg para descartar os registros de data e hora de entrada -vsync drop, mas isso acontece após a filtragem do IIRC.
slhck