Como girar um vídeo e reproduzi-lo em um aparelho de TV?

Como girar um vídeo e reproduzi-lo em um aparelho de TV?

Eu tenho um vídeo que vem de um telefone e que é reproduzido sem problemas em um aparelho de TV Thomson (via USB). Os detalhes do vídeo são os seguintes:

> avprobe 20170904_065655.mp4
avprobe version 11.3-6:11.3-1~trusty, Copyright (c) 2007-2014 the Libav developers
  built on Apr 13 2015 22:25:55 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '20170904_065655.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2017-09-04 04:58:01
  Duration: 00:01:05.34, start: 0.000000, bitrate: 17094 kb/s
    Stream #0.0(eng): Video: h264 (High), yuv420p, 1920x1080, 17017 kb/s, 30 fps, 90k tbn (default)
    Metadata:
      creation_time   : 2017-09-04 04:58:01
    Side data:
      displaymatrix: rotation of -90.00 degrees
    Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2017-09-04 04:58:01
# avprobe output

O vídeo é girado 90 no sentido anti-horário. Portanto, como apontouaqui, estou tentando a seguinte linha de comando para girar o vídeo 90 graus no sentido horário:

ffmpeg -i 20170904_065655.mp4 -vf "transpose=1" test.mp4

que, infelizmente, gira o vídeo em180graus. Há algo de errado com esse comando para girar o vídeo?

De qualquer forma, consegui girar o vídeo usando avidemux, mas o novo arquivo de vídeo salvo ( rotated.mp4) não pôde ser reproduzido no aparelho de TV ('Formato de vídeo não suportado'). Tentei converter o arquivo em diferentes formatos usando comandos como

avconv -i rotated.mp4 -c:v h264 -q:v 3 -c:a libmp3lame out.avi
avconv -i rotated.mp4 -c:v mpeg1video -q:v 3 -c:a libmp3lame out.avi
avconv -i rotated.mp4 -r 25 -vb 20M  -crf 20  output.avi
avconv -i rotated.mp4  -vcodec libx264 -acodec aac -strict -2 -b:a 384k  output.mp4

Mas NADA disso funcionou. o que estou perdendo? Ou existe uma maneira de girar o vídeo na linha de comando sem alterar o formato/codificação real?

O avprobede rotated.mp4é

avprobe version 11.3-6:11.3-1~trusty, Copyright (c) 2007-2014 the Libav developers
  built on Apr 13 2015 22:25:55 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
Input #0, avi, from 'rotated.mp4':
  Duration: 00:00:30.77, start: 0.000000, bitrate: 6728 kb/s
    Stream #0.0: Video: h264 (High), yuv420p, 1080x1920 [PAR 1:1 DAR 9:16], 30 fps, 30.02 tbn, 60.04 tbc
    Stream #0.1: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s

Usando o ffmpeg deaqui a avprobesaída é a seguinte, depois de aplicar o método de 'LordNeckbeard' ao rotated.mp4:

avprobe version 11.3-6:11.3-1~trusty, Copyright (c) 2007-2014 the Libav developers
  built on Apr 13 2015 22:25:55 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.82.104
  Duration: 00:00:30.86, start: 0.000000, bitrate: 10397 kb/s
    Stream #0.0(und): Video: h264 (Constrained Baseline), yuv420p, 1080x1920 [PAR 1:1 DAR 9:16], 8860 kb/s, 30 fps, 15360 tbn, 60 tbc (default)
    Stream #0.1(und): Audio: [1][0][0][0] / 0x0001, 48000 Hz, 2 channels (default)
Unsupported codec with id 0 for input stream 1
# avprobe output

e nem o áudio nem o vídeo são suportados agora...

Responder1

ffmpeg -i input.mp4 -vf "scale=-2:1080,format=yuv420p" -c:a copy output.mp4
  • Como a TV parece ignorar os dados secundários de rotação, você terá que recodificar o vídeo para girá-lo. ffmpegfará isso automaticamente, então você não precisa fazer nada de especial.

  • Se ainda não funcionar, adicione -profile:v baselinepara obter compatibilidade adicional. Eu recomendo também tentar -profile:v maine omitir -profile:v. Se você conseguir evitar -profile:v, a próxima melhor opção éprincipal, o menos ideal élinha de base, mas isso realmente não importa muito para a reprodução de TV local: o que funcionar é melhor.

  • OescalaO filtro reduzirá o vídeo para que a altura seja 1080, caso contrário, não reproduzirá um vídeo de tamanho 1080x1920.

  • Usando oformatarfiltro garantirá um formato de pixel compatível. Sua entrada já é plana YUV 4:2:0, mas isso é apenas um seguro para outros tipos de entrada.

  • -c:a copyfoi adicionado para copiar o fluxo (re-mux) do áudio para evitar recodificação desnecessária. Para entradas que contenham áudio diferente de AAC, use -c:a aacem vez de -c:a copy.

  • As TVs podem ser exigentes, então isso pode exigir mais experimentações. Para testar rapidamente um segmento curto de 60 segundos, você pode adicionar -t 60.

  • Desde otag foi usada, presumi que você permitiria que fosse uma alternativa aceitável para avconv. Nada disso pode se aplicar, avconvpois não o uso e não estou familiarizado com ele. Certifique-se de usar uma versão recente do ffmpeg. Para Linux você pode baixar um recente ffmpegemhttps://www.johnvansickle.com/ffmpeg/

Responder2

É possível que o vídeo girado exceda as capacidades da sua TV.

A rotação alterou a resolução de 1920x1080 para 1080x1920.

Se a sua TV for 1080p (full HD), ela suporta 1.920x1.080, e se for apenas 720p, então 1.280x720.

Em ambos os casos, a altura do vídeo é superior ao máximo. Você precisaria de uma TV de 2K ou 4K para tal vídeo.

informação relacionada