AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 500649
Accepted
林果皞
林果皞
Asked: 2019-02-15 07:20:52 +0800 CST2019-02-15 07:20:52 +0800 CST 2019-02-15 07:20:52 +0800 CST

Como extrair os “frames armazenados” sem depender de fps?

  • 772

Percebi se extraio frames com este comando:

ffmpeg -i sample_nosound.mp4 $filename%03d.jpg

Ele irá extrair depende de fps por padrão. ffmpeg -i sample_nosound.mp4mostra que este vídeo tem 6 fps, então ele extraiu 1630 arquivos de quadros jpg, que 1630/6 = 271,6 segundos equivalentes à duração total do vídeo de 4:32.

Mas o tamanho total de 1630 quadros jpg é de 13 MB:

$ du -h extracted_jpg_folder
13M      extracted_jpg_folder

, enquanto o tamanho do arquivo do mp4 é de 1,8 MB, muito menor que o tamanho total dos quadros:

$ ls -la sample_nosound.mp4
-rw-rw-r-- 1 xiaobai xiaobai 1814889 Feb  13 15:42 'sample_nosound.mp4'

Isso significa que o ffmpeg extrai quadros consultando informações de fps com quadros duplicados.

Portanto, minha pergunta é: como fazer ffmpeg extrair quadros por "quadros armazenados" sem depender de fps?

Espero que eu possa obter o tamanho total dos quadros que é quase equivalente ao tamanho dos arquivos mp4.

Não espero um tamanho de arquivo de correspondência exata, pois o mp4 pode conter alguns metadados.

Saída de ffprobe -i sample_nosound.mp4:

ffprobe version 3.4.4-0ubuntu0.18.04.1 Copyright (c) 2007-2018 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
  configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  WARNING: library configuration mismatch
  avcodec     configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'sample_nosound.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.83.100
  Duration: 00:04:32.00, start: 0.000000, bitrate: 53 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt470bg/bt709/bt709), 640x330 [SAR 1:1 DAR 64:33], 53 kb/s, 6 fps, 6 tbr, 12288 tbn, 12 tbc (default)
    Metadata:
      handler_name    : VideoHandler
video ffmpeg
  • 1 1 respostas
  • 592 Views

1 respostas

  • Voted
  1. Best Answer
    Hermann
    2019-02-15T09:12:02+08:002019-02-15T09:12:02+08:00

    Pelo que entendi a pergunta, você deseja extrair os quadros do vídeo. Cada quadro deve ser armazenado em um arquivo separado. Espera-se que a soma dos tamanhos de todos os arquivos corresponda ao tamanho do arquivo do vídeo. Isso é verdade apenas para alguns vídeos específicos. Vou tentar explicar as coisas de forma ampla.

    TL;DR

    Não é possível extrair quadros de vídeo codificado em h264 com a mesma qualidade visual e tamanho de arquivo.

    Os formatos de contêiner de vídeo são confusos

    O arquivo de vídeo neste caso é um arquivo MP4. MP4 é um contêiner para dados de vídeo. O tipo de contêiner, no entanto, não diz nada sobre o conteúdo real. Na verdade, muitos tipos diferentes de formatos de vídeo podem residir dentro de um arquivo MP4 – assim como um arquivo zip (ou um arquivo PDF).

    Existem vários tipos de vídeo

    Um vídeo é uma sequência de imagens. Há muitas maneiras de armazenar essas imagens em um fluxo de vídeo (codificar) e como lê-las posteriormente (decodificar). Os algoritmos são normalmente chamados de codecs .

    Tenha em mente que nem todos os codecs fazem compressão. Neste exemplo, h264 é o codec. Por padrão, o codificador h264 calcula a diferença de um quadro para o próximo. No caso de uma pequena diferença, o codificador armazena apenas a diferença. O quadro real é descartado. Apenas o primeiro¹ quadro é armazenado como uma imagem completa. Isso economiza muito espaço e é uma das estratégias de compressão. O decodificador h264 aplicará a diferença armazenada ao quadro anterior, recriando o original.

    Como você pode ver, os quadros do seu vídeo dependem um do outro. Se você quer arquivos únicos, você quer que eles sejam independentes. Isso significa que você sempre precisa armazenar as informações completas para cada quadro. Isso significa que você não pode simplesmente pegar os dados existentes e copiá-los para arquivos, mas deve recodificar o vídeo. Ao longo do caminho, a soma dos tamanhos dos arquivos deve aumentar.

    Você pode ler os vários tipos de imagem na compactação de vídeo , especificamente os inter-quadros "baseados em diferenças" ou uma visão geral da compactação de vídeo em geral .

    h264 não é JPEG

    Mesmo se estivermos falando de imagens individuais. O JPEG usa um método de compactação conhecido como DCT . O H.264 usa uma versão semelhante, mas aprimorada. Isso significa que o JPEG não pode compactar tão eficientemente quanto o h264. A propósito, você pode colocar uma imagem compactada h264 em um arquivo usando HEIF (isso se comporta essencialmente como um vídeo de um quadro).


    ¹Isso não é totalmente verdade, mas quero simplificar por enquanto. Na verdade, é mais como "o primeiro quadro de uma cena". Se você quiser saber os detalhes:
    O codificador percebe o início de cenas individuais (na cinematografia, isso geralmente é chamado de "corte"). A diferença de um quadro para outro é muito alta e, portanto, não é boa para compactar. O codificador decide não usar um interquadro "baseado em diferenças". Em vez disso, ele usa a imagem completa (isso é chamado de "intra-quadro", também conhecido como "quadro-chave").
    Há também uma razão técnica: apenas para intra-frames você pode pular rapidamente ao procurar pelo vídeo. Consequentemente, os intraquadros também são colocados no fluxo de vez em quando (independentemente do conteúdo de vídeo real). Comumente,

    Agora aprendemos muito sobre compressão de vídeo. Este vídeo demonstra algumas das coisas: Devido à corrupção do arquivo, este vídeo perdeu um intra-quadro. O decodificador consegue reproduzi-lo com mais ou menos sucesso. O quadro perdido provavelmente mostrava a mulher olhando para o lado. Agora ela vira a cabeça para trás, o decodificador só tem os dados dos inter-quadros que incluem algumas informações de movimento. Parece que a mulher acabou com o rosto na lateral da cabeça. Enquanto isso, uma pessoa caminha pelo fundo. Essa pessoa não estava presente no intra-quadro perdido e, portanto, parece muito bem.
    Saída interessante de arquivo de vídeo danificado

    • 3

relate perguntas

  • H.264/MPEG-4 de quadros PNG: como fazer e como ajustar a compressão

  • O comando ffmpeg falha silenciosamente dentro do script, mas funciona quando executado diretamente

  • Converta áudio dentro de MKV para AC3 ou DTS preservando 6.1 canais

  • ffmpeg: 'Protocolo não encontrado' para nome de arquivo normal

  • Gire a webcam e a tela (modo retrato)

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve