Alguém sabe como buscar o número total de quadros de um arquivo de vídeo usando o ffmpeg? A saída de renderização do ffmpeg mostra o quadro atual e eu preciso da contagem de quadros para calcular o progresso em porcentagem.
Adicione a -skip_frame nokeyopção de contar apenas os quadros-chave.
ffmpeg: conta o número de quadros
Se você não tiver, ffprobepoderá usar ffmpeg:
ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
Este é um método um tanto rápido.
Consulte frame=próximo ao final da saída do console.
Adicione a -discard nokeyopção de entrada (antes -i) para contar apenas os quadros-chave.
Editar listas
Ignore a lista de edição MP4 / M4V / M4A / MOV com a -ignore_editlist 1opção de entrada. O padrão é não ignorar a lista de edição.
O que significam as opções ffprobe
-v error Isso oculta a saída de "informações" (informações da versão, etc), o que torna a análise mais fácil.
-count_frames Conte o número de quadros por fluxo e relate-o na seção de fluxo correspondente.
-select_streams v:0 Selecione apenas o fluxo de vídeo.
-show_entries stream=nb_framesou -show_entries stream=nb_read_framesMostra apenas a entrada para nb_framesou nb_read_frames.
-of default=nokey=1:noprint_wrappers=1Defina o formato de saída (também conhecido como "escritor") como default, não imprima a chave de cada campo ( nokey=1) e não imprima o cabeçalho e o rodapé da seção ( noprint_wrappers=1). Existem alternativas mais curtas, como -of csv=p=0.
A mediainfoferramenta bem conhecida pode gerar o número de quadros:
mediainfo --Output="Video;%FrameCount%" input.avi
MP4Box
Para arquivos MP4 / M4V / M4A.
MP4Box do gpac pode mostrar o número de quadros:
MP4Box -info input.mp4
Consulte a Media Infolinha na saída do stream de vídeo em questão:
Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples
Neste exemplo, o fluxo de vídeo tem 2525 quadros.
boxdumper
Para arquivos MP4 / M4V / M4A / MOV.
boxdumperé uma ferramenta simples do l-smash. Ele produzirá uma grande quantidade de informações. Na stszseção da caixa do tamanho da amostra, consulte sample_counto número de quadros. Neste exemplo, a entrada tem 1900 quadros de vídeo:
Ou, se você quiser mais velocidade e se nb_frames for confiável o suficiente, simplifique como:ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
juanitogan
Isso gera a resposta duas vezes para mim (ou seja, 2600 \ n 2600). Alguma razão particular para isso estar acontecendo?
jbodily
@jbodily Meu exemplo ou do juanitogan? Também não posso duplicar usando. Não há muito para trabalhar aqui.
llogan
+1, até porque, ao contrário de muitas outras respostas sobre qualquer ferramenta de linha de comando, esta realmente explica todas as opções de linha de comando. Obrigado.
Ray
1
Observe que a primeira opção, consultar o contêiner, realmente processa o arquivo devido a count_frames. Veja o comentário de @juanitogan.
Você deve ser capaz de encontrar de forma consistente e segura Duration: hh:mm:ss.nnpara determinar o tamanho do videoclipe de origem. Então, para cada linha de atualização (CR, sem LF), você pode analisar o texto para a marca de tempo atual em:
Desculpe-me por ser estúpido, mas como posso fazer tempo / duração quando a duração está no formato hh: mm: ss.nn e a hora é sempre o formato xx.yy?
Omar Ali
2
@Omar, Como um desenvolvedor .NET, o que eu faço é criar um a TimeSpanpartir dele e usar currentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100). O TimeSpan também oferece uma poderosa função Parse, verifique
Shimmy Weitzhandler
excelente solução, meu tempo está em hh: mm: ss: ms então suponho que nestes 3 anos o FFMPEG melhorou o formato de tempo de saída.
ElektroStudios de
1
Observe que a saída do console pode ser 29,97, mas é a abreviação de 30000/1001. O mesmo para 23,98 que é 24000/1001 e 59,94 é 60000/1001.
llogan
Como uma observação, isso não funciona para vídeos com taxa de quadros variável (obviamente).
Timothy Zorn,
8
Nem todos os formatos armazenam sua contagem de quadros ou duração total - e mesmo se o fizerem, o arquivo pode estar incompleto - então o ffmpeg não detecta nenhum deles com precisão por padrão.
Em vez disso, tente procurar o final do arquivo e ler a hora, depois conte a hora atual enquanto prossegue.
Alternativamente, você pode tentar AVFormatContext->nb_index_entriesou a duração detectada, que deve funcionar bem em AVI / MOV não danificado, ou a biblioteca FFMS2, que provavelmente é muito lenta para se preocupar com uma barra de progresso.
Isso deve ser rápido, uma vez que nenhuma codificação está sendo executada. ffmpegirá apenas demuxar o arquivo e ler (decodificar) o primeiro stream de vídeo o mais rápido possível. O primeiro grepcomando irá capturar o texto que mostra o quadro. O segundo grepcomando pegará apenas o número daquele. O tailcomando mostrará apenas a linha final (contagem final de quadros).
para construir na resposta de stu. Veja como encontrei a taxa de quadros de um vídeo do meu celular. executei o seguinte comando por um tempo. Deixei a contagem de frames chegar a cerca de 10.000 antes de ficar impaciente e bater ^ C:
$ ffmpeg -i 2013-07-07\ 12.00.59.mp4 -f null /dev/null 2>&1
...
Press [q] to stop, [?] for help
[null @ 0x7fcc80836000] Encoder did not produce proper pts, making some up.
frame= 7989 fps= 92 q=0.0 Lsize=N/A time=00:04:26.30 bitrate=N/A dup=10 drop=0
video:749kB audio:49828kB subtitle:0 global headers:0kB muxing overhead -100.000042%
Received signal 2: terminating.
$
então, peguei duas informações dessa linha que começa com "frame =", a contagem de frames, 7989, e o tempo, 00: 04: 26,30. Você primeiro precisa converter o tempo em segundos e depois dividir o número de quadros por segundos para obter "quadros por segundo". "quadros por segundo" é a sua taxa de quadros.
Votei positivamente em sua resposta, mas isso só funcionará se o vídeo não contiver áudio. Se contiver, este funcionará:ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Gobe
2
Desculpe pela resposta do necro, mas talvez precise disso (pois não encontrei uma solução para os lançamentos recentes do ffmpeg.
Com ffmpeg 3.3.4 descobri que pode encontrar com o seguinte:
No final, ele emitirá contagem de quadros. Funcionou para mim em vídeos com áudio. Ele fornece duas vezes uma linha "nb_frames", mas a primeira linha era a contagem real de quadros nos vídeos que testei.
A taxa de quadros é normalmente calculada a partir de dois parâmetros. r_frame_rate = 24000/1001 (= 23,97602397602397 ...) Arredondado por ffmpeg para: 23,98 Duração = horas * 3600 + minutos * 60 + segundos.remainder = 8177,91 Enquanto parâmetro de duração = 8177,794625 Mas Quadros = 24000/1001 * 8177,794625 = 196071 fornece o número exato de quadros. (Sem brincadeiras).
Respostas:
Nota: A presença de uma lista de edição em MP4 / M4V / M4A / MOV pode afetar o número do seu quadro. Veja Editar listas abaixo.
ffprobe: Consultar o contêiner
N/A
. Veja os outros métodos listados abaixo.ffprobe: conte o número de quadros
-skip_frame nokey
opção de contar apenas os quadros-chave.ffmpeg: conta o número de quadros
Se você não tiver,
ffprobe
poderá usarffmpeg
:frame=
próximo ao final da saída do console.-discard nokey
opção de entrada (antes-i
) para contar apenas os quadros-chave.Editar listas
Ignore a lista de edição MP4 / M4V / M4A / MOV com a
-ignore_editlist 1
opção de entrada. O padrão é não ignorar a lista de edição.O que significam as opções ffprobe
-v error
Isso oculta a saída de "informações" (informações da versão, etc), o que torna a análise mais fácil.-count_frames
Conte o número de quadros por fluxo e relate-o na seção de fluxo correspondente.-select_streams v:0
Selecione apenas o fluxo de vídeo.-show_entries stream=nb_frames
ou-show_entries stream=nb_read_frames
Mostra apenas a entrada paranb_frames
ounb_read_frames
.-of default=nokey=1:noprint_wrappers=1
Defina o formato de saída (também conhecido como "escritor") comodefault
, não imprima a chave de cada campo (nokey=1
) e não imprima o cabeçalho e o rodapé da seção (noprint_wrappers=1
). Existem alternativas mais curtas, como-of csv=p=0
.Veja também
mediainfo
A
mediainfo
ferramenta bem conhecida pode gerar o número de quadros:MP4Box
Para arquivos MP4 / M4V / M4A.
MP4Box
do gpac pode mostrar o número de quadros:Consulte a
Media Info
linha na saída do stream de vídeo em questão:Neste exemplo, o fluxo de vídeo tem 2525 quadros.
boxdumper
Para arquivos MP4 / M4V / M4A / MOV.
boxdumper
é uma ferramenta simples do l-smash. Ele produzirá uma grande quantidade de informações. Nastsz
seção da caixa do tamanho da amostra, consultesample_count
o número de quadros. Neste exemplo, a entrada tem 1900 quadros de vídeo:stsz
átomo.fonte
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
No Unix, isso funciona como um charme:
fonte
ffmpeg -i 00000.avi -map 0:v:0 -c copy -f null -y /dev/null 2>&1 | grep -Eo 'frame= *[0-9]+ *' | grep -Eo '[0-9]+' | tail -1
Em vez disso, calcule com base no tempo.
Isso é o que eu faço e funciona muito bem para mim e muitos outros.) Primeiro, encontre a duração do vídeo no snippet abaixo:
Você deve ser capaz de encontrar de forma consistente e segura
Duration: hh:mm:ss.nn
para determinar o tamanho do videoclipe de origem. Então, para cada linha de atualização (CR, sem LF), você pode analisar o texto para a marca de tempo atual em:Apenas tome cuidado para não esperar uma saída perfeita dessas linhas de status. Eles podem incluir mensagens de erro como aqui:
Assim que tiver o tempo, é matemática simples:
time / durration * 100 = % done
.fonte
TimeSpan
partir dele e usarcurrentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100)
. O TimeSpan também oferece uma poderosa função Parse, verifiqueNem todos os formatos armazenam sua contagem de quadros ou duração total - e mesmo se o fizerem, o arquivo pode estar incompleto - então o ffmpeg não detecta nenhum deles com precisão por padrão.
Em vez disso, tente procurar o final do arquivo e ler a hora, depois conte a hora atual enquanto prossegue.
Alternativamente, você pode tentar
AVFormatContext->nb_index_entries
ou a duração detectada, que deve funcionar bem em AVI / MOV não danificado, ou a biblioteca FFMS2, que provavelmente é muito lenta para se preocupar com uma barra de progresso.fonte
Experimente algo como:
Ele grava o número do quadro em stderr, para que você possa recuperar o último quadro a partir dele.
fonte
Você pode usar
ffprobe
para obter o número do quadro com os seguintes comandosffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
que dizem para imprimir dados em
json
formatoselect_streams v
diráffprobe
para apenas nos fornecervideo
dados de fluxo e se você removê-los, ele forneceráaudio
informações tambéme a saída será como
2. você pode usar
que fornecerá dados de fluxo, se você quiser informações selecionadas como taxa de quadros, use o seguinte comando
que fornecem um número com base nas informações do seu vídeo, o problema é quando você usa este método, é possível obter uma
N/A
saída como.para mais informações, consulte esta página Dicas FFProbe
fonte
tente isto:
fonte
*.ts
. A saída é uma linha vazia.Como meu comentário teve alguns votos positivos, achei melhor deixá-lo como uma resposta:
Isso deve ser rápido, uma vez que nenhuma codificação está sendo executada.
ffmpeg
irá apenas demuxar o arquivo e ler (decodificar) o primeiro stream de vídeo o mais rápido possível. O primeirogrep
comando irá capturar o texto que mostra o quadro. O segundogrep
comando pegará apenas o número daquele. Otail
comando mostrará apenas a linha final (contagem final de quadros).fonte
para construir na resposta de stu. Veja como encontrei a taxa de quadros de um vídeo do meu celular. executei o seguinte comando por um tempo. Deixei a contagem de frames chegar a cerca de 10.000 antes de ficar impaciente e bater ^ C:
então, peguei duas informações dessa linha que começa com "frame =", a contagem de frames, 7989, e o tempo, 00: 04: 26,30. Você primeiro precisa converter o tempo em segundos e depois dividir o número de quadros por segundos para obter "quadros por segundo". "quadros por segundo" é a sua taxa de quadros.
a taxa de quadros do meu vídeo é de 30 fps.
fonte
A única coisa exata que consegui fazer é o seguinte:
Para ter certeza de que funciona com vídeo:
fonte
ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Desculpe pela resposta do necro, mas talvez precise disso (pois não encontrei uma solução para os lançamentos recentes do ffmpeg.
Com ffmpeg 3.3.4 descobri que pode encontrar com o seguinte:
No final, ele emitirá contagem de quadros. Funcionou para mim em vídeos com áudio. Ele fornece duas vezes uma linha "nb_frames", mas a primeira linha era a contagem real de quadros nos vídeos que testei.
fonte
Eu uso o php_ffmpeg então consigo obter todos os tempos e todos os frames de um filme. Como abaixo
E então o detalhe está na página.
http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php
fonte
fonte
linux
rubi
fonte