Eu tenho tentado descobrir como girar vídeos com FFmpeg. Estou trabalhando com vídeos do iPhone tirados no modo retrato. Eu sei como determinar os graus atuais de rotação usando o MediaInfo (excelente biblioteca, btw), mas estou preso no FFmpeg agora.
Pelo que li, o que você precisa usar é uma opção vfilter . De acordo com o que vejo, deve ficar assim:
ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4
No entanto, não consigo fazer isso funcionar. Primeiro, -vfilters não existe mais, agora é apenas -vf . Segundo, recebo este erro:
No such filter: 'rotate'
Error opening filters!
Até onde eu sei, tenho uma compilação do FFmpeg com todas as opções. A execução de ffmpeg -filters mostra isso:
Filters:
anull Pass the source unchanged to the output.
aspect Set the frame aspect ratio.
crop Crop the input video to x:y:width:height.
fifo Buffer input images and send them when they are requested.
format Convert the input video to one of the specified pixel formats.
hflip Horizontally flip the input video.
noformat Force libavfilter not to use any of the specified pixel formats
for the input to the next filter.
null Pass the source unchanged to the output.
pad Pad input image to width:height[:x:y[:color]] (default x and y:
0, default color: black).
pixdesctest Test pixel format definitions.
pixelaspect Set the pixel aspect ratio.
scale Scale the input video to width:height size and/or convert the i
mage format.
slicify Pass the images of input video on to next video filter as multi
ple slices.
unsharp Sharpen or blur the input video.
vflip Flip the input video vertically.
buffer Buffer video frames, and make them accessible to the filterchai
n.
color Provide an uniformly colored input, syntax is: [color[:size[:ra
te]]]
nullsrc Null video source, never return images.
nullsink Do absolutely nothing with the input video.
Ter as opções para vflip e hflip são ótimas e tudo, mas elas simplesmente não me levam aonde eu preciso ir. Eu preciso da capacidade de girar vídeos 90 graus, no mínimo. 270 graus seria uma excelente opção para ter também. Para onde foram as opções de rotação?
fonte
-vf "vflip,hflip"
-vf "vflip,hflip"
funciona como um encanto.Respostas:
Gire 90 no sentido horário:
Para o parâmetro transpose, você pode passar:
Use
-vf "transpose=2,transpose=2"
para 180 graus.Certifique-se de usar uma versão ffmpeg recente daqui (uma compilação estática funcionará bem).
Observe que isso irá recodificar as partes de áudio e vídeo. Geralmente, você pode copiar o áudio sem tocá-lo usando
-c:a copy
. Para alterar a qualidade do vídeo, defina a taxa de bits (por exemplo, com-b:v 1M
) ou consulte o guia de codificação H.264, se desejar opções de VBR.Uma solução também é usar esse script de conveniência .
fonte
-vcodec libx264
. Mas seria ótimo se eu não precisasse procurar qual codificação usar como ffmpeg já deveria saber. Alguma sugestão?-vf "transpose=2,transpose=2"
cclock_flip
,clock
,cclock
ouclock_flip
em vez de0
,1
,2
ou3
.Se você não deseja recodificar o vídeo e seu player pode lidar com metadados de rotação, basta alterar a rotação nos metadados usando ffmpeg:
fonte
ffmpeg -i input.m4v 2>&1 | grep rotate
ffmpeg -i input.m4v -map_metadata 0 -metadata:s:v rotate="90" -codec copy output.m4v
. Dessa forma, todos os metadados globais no arquivo de entrada serão copiados como metadados globais para o arquivo de saída e apenas os metadados de rotação serão alterados.rotate=0
.-metadata:s:v rotate="180"
, não funcionou. Isso deveria funcionar?ffmpeg -i input.mp4 -codec copy -map_metadata 0 -metadata:s:v:0 rotate=0 output.mp4
Você já tentou
transpose
? Curtir (da outra resposta)Se você estiver usando uma versão antiga, precisará atualizar o ffmpeg se quiser usar o recurso de transposição, como foi adicionado em outubro de 2011.
A página de download do FFmpeg oferece compilações estáticas que você pode executar diretamente sem precisar compilá-las.
fonte
Me deparei com esta página enquanto procurava a mesma resposta. Agora faz seis meses que isso foi solicitado originalmente e as construções foram atualizadas várias vezes desde então. No entanto, eu queria adicionar uma resposta para qualquer pessoa que se deparar aqui procurando essas informações.
Estou usando a versão Debian Squeeze e FFmpeg desses repositórios.
A página MAN para ffmpeg indica o seguinte uso
A chave é que você não deve usar uma variável de grau, mas uma variável de configuração predefinida na página MAN.
fonte
Para girar a imagem no sentido horário, você pode usar o filtro de rotação, indicando um ângulo positivo em radianos. Com 90 graus igualando PI / 2, você pode fazer o seguinte:
no sentido anti-horário, o ângulo deve ser negativo
O filtro de transposição funcionará igualmente bem em 90 graus, mas para outros ângulos, essa é uma opção mais rápida ou única.
fonte
*
se comporta como multiplicação:ffmpeg -i in.avi -vf "rotate=-8*PI/40" -q 1 out.avi
(um pouco menos do que a rotação -PI / 4 = -10 * PI / 40)não funcionará, mesmo com a fonte mais recente ...
deve alterar a ordem:
funciona bem
fonte
rotate=PI/2
ourotate=90*PI/180
éSe você receber um erro "O codec é experimental, mas os codecs experimentais não estão ativados", use este:
Aconteceu comigo para algum arquivo .mov com áudio aac.
fonte
-sameq
Option 'sameq' was removed. If you are looking for an option to preserve the quality (which is not what -sameq was for), use -qscale 0 or an equivalent quality factor option. Failed to set value '1' for option 'sameq': Invalid argument
-qscale também dá um erro.Please use -q:a or -q:v, -qscale is ambiguous
, mas ainda funciona.Este script que produzirá os arquivos com a estrutura de diretórios em "FixedFiles". No momento, é fixado em arquivos MOV e executará várias transformações, dependendo da "rotação" original do vídeo. Funciona com vídeos capturados no iOS em um Mac executando o Mavericks, mas deve ser facilmente exportável. Depende da instalação do exiftool e do ffmpeg .
fonte
[Parsed_pad_2 @ 0x7f8b15c3a580] Input area -420:0:1500:1080 not within the padded area 0:0:1080:1080 or zero-sized
\ n `[Parsed_pad_2 @ 0x7f8b15c3a580] Failed to configure input pad on Parsed_pad_2
\ nError reinitializing filters!
\ nFailed to inject frame into filter network: Invalid argument
\ nError while processing the decoded data for stream #0:0
\ nConversion failed!
A resposta de Alexy quase funcionou para mim, exceto que eu estava recebendo este erro:
Eu apenas tive que adicionar um parâmetro (-r 65535/2733) ao comando e funcionou. O comando completo foi assim:
fonte
24000/1001
seria mais preciso.Uma solução adicional com uma abordagem diferente das últimas soluções mencionadas é verificar se o driver da câmera suporta os controles da câmera v4l2 (o que é muito comum).
No terminal, basta digitar:
Se o driver da câmera suportar os controles da câmera v4l2, você deverá obter algo assim (a lista abaixo depende dos controles que o driver da câmera suporta):
E se você tiver sorte, ele suporta horizontal_flip e vertical_flip .
Então, tudo o que você precisa fazer é definir o horizontal_flip :
ou o vertical_flip por:
e então você pode ligar para o seu dispositivo de vídeo para capturar um novo vídeo (veja o exemplo abaixo) e o vídeo será girado / invertido.
Obviamente, se você precisar processar um vídeo já existente, esse método não será a solução que você está procurando.
A vantagem dessa abordagem é que invertemos a imagem no nível do sensor, para que o sensor do driver já nos dê a imagem invertida e isso economiza para o aplicativo (como o FFmpeg) qualquer processamento adicional e desnecessário.
fonte
Infelizmente, a versão Ubuntu do ffmpeg suporta filtros de vídeo.
Você precisa usar o avidemux ou algum outro editor para obter o mesmo efeito.
De maneira programática, o mencoder foi recomendado.
fonte
Smartphone: gravou um vídeo no formato vertical
Deseja enviá-lo para um lado da Web, a 90 ° à esquerda (anti-horário, formato paisagem) hmm.
ffmpeg -i input.mp4 -vf "rotate=0" output.mp4
faz isso. Voltei ao formato vertical
debian buster: ffmpeg --version ffmpeg versão 4.1.4-1 ~ deb10u1 Copyright (c) 2000-2019 the FFmpeg developers
fonte