Como alterar o framerate de um vídeo sem reencodificar

13

Estou tentando mudar o framerate de um vídeo MP4 (é um vídeo GoPro de 120fps, quero reproduzi-lo a 30fps para um efeito de câmera lenta).

Estou usando o avconv para isso:

avconv -i SourceMovie.mp4 -vf setpts=4.0*PTS -r 30 DestMovie.mp4

Isso tecnicamente funciona, mas reencode o filme. Além de ser lento, é obviamente um problema de qualidade. Tecnicamente, deve haver uma maneira de definir apenas o fps no cabeçalho do vídeo. Como posso alterar isso? (Qualquer ferramenta diferente de avconv também funcionaria.)

    
por EboMike 03.11.2013 / 23:42

4 respostas

12

MP4Box pode fazer isso.

O comando

MP4Box -add SourceMovie.mp4#video -raw 1 -new test

cria os arquivos test e test_track1.h264 . Agora você pode criar um arquivo mp4 com qualquer framerate suportada (30 neste exemplo):

MP4Box -add test_track1.h264:fps=30 -new DestMovie.mp4

O MP4Box faz parte do pacote gpac , portanto, verifique se ele está instalado.

    
por Mitch 04.11.2013 / 07:30
6

A alteração da taxa de quadros no cabeçalho do vídeo (contêiner) não afeta o videostream (ou audiostream) em si. A reencodificação é a única opção.

Videostreams têm registro de data e hora e na maioria dos vídeos os quadros são interdependentes entre si devido à compactação entre quadros. Alguns jogadores podem acelerar e desacelerar o vídeo, mas não por comandos incorporados ou algo assim. Nenhum jogador pode alterar a taxa de quadros imediatamente quando um comandante de container pede para fazer isso. O videofile vai acabar fora da especificação (ou seja, não seguindo os padrões) e 99,9% dos jogadores se recusarão a cumpri-lo. É completamente impossível fazer o que você quer sem recodificar. Claro que você pode esperar com a recodificação até o último passo da sua edição.

    
por thom 04.11.2013 / 01:30
3

No caso em que sua maior intenção seja reproduzi-lo em câmera lenta e não manter o arquivo como MP4, você pode usar a ferramenta GUI do MKVmerge para remodi-lo em um contêiner Matroska que pode facilmente alterar a taxa de quadros. O remuxing é muito melhor que a reencodificação, porque ele apenas altera os metadados e não o fluxo em si.

Primeiro você instala o pacote

sudo apt-get install mkvtoolnix-gui

Então você inicia a GUI do MKVmerge. Você vai se deparar com uma janela como esta

Basta pressionar o botão Adicionar e selecionar o arquivo ou arrastar e soltar o arquivo na área "Arquivos de entrada". Neste ponto, você poderá selecionar o fluxo de vídeo em seu vídeo. Você também pode excluir outros fluxos, já que eles apenas atrapalharão de qualquer maneira.

Depois de selecionar, você verá as guias inferiores se tornando ativas:

Altere para "Formatar ações específicas"

Você pode ver que existe um campo "FPS", onde você pode inserir o valor de quadros por segundo. Parecia que você estava planejando desacelerar as coisas quatro vezes, então cerca de 7 quadros por segundo seria o seu objetivo. Você também pode usar a opção "Esticar por".

Depois disso, você pode apenas alterar o nome do arquivo de saída (se quiser) e pressionar "Start muxing".

O programa será executado e você deverá ter seu arquivo.

    
por v010dya 10.11.2014 / 18:52
1

Eu também queria diminuir a perda dos meus filmes de 120 FPS para 30 FPS. Eu fiz o script que faz isso alterando o andamento do som e modificando o FPS diretamente no container MP4. As seguintes ferramentas são necessárias:

  1. avconv para converter fluxos de áudio
  2. sondstretch para diminuir o ritmo do áudio
  3. gpac para que MP4Box mude para o FPS

O script usado para conversão está aqui:

#!/bin/bash
#########################################
# Lossless slow down from 120 to 30 FPS #
#                                       #
# Use:                                  #
#                                       #
#   slow.bash <mp4_file>                #
#                                       #
#                           #-= OSi =-# #
#########################################


# Prepare basic variables
IN_FILE=""
NAME=$(echo "${IN_FILE}" | sed 's/\.[^.]*//')


# Clean up before start
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264" "${NAME}_slow.mp4"


# Slow down sound
avconv -i "${IN_FILE}" -vn -acodec pcm_s16le "${NAME}_.wav"
soundstretch "${NAME}_.wav" "${NAME}.wav" -tempo=-75
avconv -i "${NAME}.wav" -vn -codec:a ac3_fixed -b:a 448k "${NAME}.ac3"


# Change video frame rate and multiplex with slowed sound
MP4Box -add "${IN_FILE}#video" -raw 1 -new "${NAME}"
MP4Box -add "${NAME}_track1.h264:fps=30" -add "${NAME}.ac3" -new "${NAME}_slow.mp4"


# Clean up when we are done
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264"

Este script cria uma cópia do MP4 com o postfix _slow.

    
por OSi 28.02.2016 / 11:43