Como gerar o vídeo de pré-visualização para a web com alguns quadros usando o ffmpeg?

2

Como gerar um vídeo de pré-visualização para a web com apenas alguns quadros usando o ffmpeg? Como quando você passa o mouse sobre um vídeo e ele reproduz alguns quadros para visualização antes de carregar o vídeo real?

    
por Azevedo 13.09.2016 / 15:38

1 resposta

2

O script em lote abaixo faz isso. Otimizado para web, produz um vídeo de pré-visualização com 10 imagens tiradas do vídeo original. Cada imagem aparece por 1s. O script obtém amostras de imagens de maneira que as imagens de visualização sejam tiradas de todo o vídeo.

  • Requer apenas o ffmpeg. (e ffprobe que faz parte do pacote ffmpeg)

  • Saída: mp4 / h.264 ~ 120Kb (independentemente do tamanho do vídeo original) .

  • Totalmente configurável.

  • Lanczos otimizados e filtro de nitidez.

  • Mantém a proporção do vídeo original ajustando-o em um quadro 16: 9 (384x216) (preencha as barras pretas nas laterais quando necessário).

  • Nenhum arquivo temporário usado. (pipe on-the-fly de ffmpeg para ffmpeg)

  • HTML5 amigável.

Aqui estão dois exemplos de gif somente para visualização. A saída real é mp4 / h.264:

Fonte de vídeo 16: 9. Saída:

Fontedevídeo4:3.Saída:

ExecutenoWindows,maselepodeserfacilmenteconvertidoemscriptbash(Linux).

Oscriptcriaumapasta./preview,ondearmazenatodasaspré-visualizaçõesgeradas:

/Myvideosmovie1.mp4~anysizemovie2.mp4~anysize/previewmovie1.mp4~120Kbmovie2.mp4~120Kb

Podeserajustadoparaserexecutadoemarquivosindividuais.

previewGenerator.cmd:

REM----------------------------------------------setfolder=C:\Myvideossetvframes=10setwidth=384setheight=216remw=h*16/9setfiletypes=*.mp4REM----------------------------------------------setlocalEnableDelayedExpansionpushd"%folder%"
if not exist preview md preview
for /f "usebackq delims=" %%f in ('dir /b %filetypes%') do (
    if not exist "preview\%%~nf.mp4" (  
        for /f %%i in ('ffprobe -v error -show_entries format^=duration "%%f" -of default^=noprint_wrappers^=1:nokey^=1') do set length=%%i
        set /a length=!length!+0
        set /a fps=!length!/%vframes%
        ffmpeg -threads 2 -i "%%f" -an -qscale:v 1 -vf "fps=1/!fps!, scale=iw*min(%width%/iw\,%height%/ih):ih*min(%width%/iw\,%height%/ih):flags=lanczos, pad=%width%:%height%:(%width%-iw*min(%width%/iw\,%height%/ih))/2:(%height%-ih*min(%width%/iw\,%height%/ih))/2, unsharp=5:5:0.5:5:5:0.5" -vframes %vframes% -f image2pipe -vcodec ppm - ^
        | ffmpeg -y -threads 2 -framerate 1 -i pipe:0 -c:v libx264 -profile:v baseline -level 3.0 -tune stillimage -r 30 -pix_fmt yuv420p "preview\%%~nf.mp4"
    )
cls
)

Atualização: Você pode controlar facilmente a taxa de reprodução em HTML5 <video> , conforme mostrado aqui

Por que não usar gif em vez disso?

    O formato
  • .gif tem uma pior qualidade (cores de pixelate / máximo de 256 cores)

  • O tamanho do arquivo .gif é pelo menos 2x maior.

  • Você não pode controlar as animações gif de velocidade de reprodução / pausa após sua criação.

por 13.09.2016 / 15:38

Tags