FFmpeg ile bir video 180 ° nasıl döndürülebilir?


69

Kaydedildiğinde 180 ° döndürülmüş bir videom var. Bunu FFmpeg ile düzeltmek mümkün mü?


Oynatma sırasında çevirme veya doğru yönlendirme ile yeniden kodlama hakkında mı soruyorsunuz?
Mxx

@Mxx Yeniden kodlamayı düşünüyordum, ancak oynatma sırasında ne demek istediniz?
Louis,

Kod çözme arka ucu olarak ffmpeg kullanan ortam yürütücüleri de tüm filtrelerini kullanabilir. Bu ekran görüntüsüne ffdshow-tryout.sourceforge.net/images/front1.png "Offset and flip" filtresini görün. Ayrıca bkz. Stackoverflow.com/questions/3937387/rotating-videos-with-ffmpeg
Mxx

Oh tamam, güzel. Bu benim için işe yarayacak, ama ben de paylaşmak istiyorum. SO sorusuna bir göz atacağım.
Louis,

5
Bu sorunun ifadesi ve başlığı gerçekten kafa karıştırıcı. Bir videoyu dikey olarak çevirmek, onu 180 derece döndürmekle aynı değildir (dikey çevirme ve yatay çevirme ile aynıdır ). Kabul edilen cevaba göre rotasyon belirtmek için düzenleme yapıyorum. Şu anda bu ffmpeg ile dikey olarak saygısız videolar için google sonuçlarını kirletiyor.
Jason C

Yanıtlar:


102

orijinaldöndürülmüş


tl; Dr.

ffmpeg videoyu otomatik olarak döndürür:

  • girişiniz meta veri içermiyor
  • senin ffmpegçok eski

Döndürme meta verileri

İPhone'lar gibi bazı videolar fiziksel olarak çevrilmiyor ancak video akışı displaymatrix yan verilerini içeriyor veya meta verileri döndürüyor. Bazı oyuncular bu meta verileri dikkate almaz, bazıları ise vermez. Girişinizde ffmpegböyle bir meta veri olup olmadığını görmek için konsol çıktısına bakın:

$ ffmpeg -i input.mp4
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Duration: 00:00:05.00, start: 0.000000, bitrate: 43 kb/s
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 39 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      rotate          : 180
    Side data:
      displaymatrix: rotation of -180.00 degrees

Otomatik döndürme

ffmpeg var olan herhangi bir video akışı döndürme meta verilerine göre videoyu otomatik olarak fiziksel olarak döndürür.

Otorotasyon özelliğini kullanabilmek için 2 Mayıs 2015 tarihinden itibaren 1630224 numaralı taahhüdü içeren bir yapıya ihtiyacınız var.

Örnek

ffmpeg -i input.mp4 -c:a copy output.mp4

Bu davranışı devre dışı bırakmak için -noautorotateseçeneği kullanın.


Girdi meta veri içermiyorsa veya ffmpegeskiyse

Videoyu döndürmek için bir filtre kullanmanız gerekecek ve herhangi bir döndürme meta verisi varsa, aşağıdaki örneklerde gösterildiği gibi kaldırılması gerekir:

Örnekler

Kullanma ffmpeg180 ° döndürmek için video filtreleri kullanmak için üç yöntem seçeneğiniz vardır.

hflip ve vflip

ffmpeg -i input.mp4 -vf "hflip,vflip,format=yuv420p" -metadata:s:v rotate=0 \
-codec:v libx264 -codec:a copy output.mkv

transpose

ffmpeg -i input.mp4 -vf "transpose=2,transpose=2,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

rotate

Bu filtre isteğe bağlı herhangi bir açıyla dönebilir ve radyanları derece yerine bir birim olarak kullanır. Bu örnek π / 1 radyan veya 180 ° döndürecektir:

ffmpeg -i input.mp4 -vf "rotate=PI:bilinear=0,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

Bunun yerine dereceleri kullanabilirsiniz. Bir derece π / 180 radyan'a eşittir. Öyleyse 45 ° döndürmek istiyorsanız:

ffmpeg -i input.mp4 -vf "rotate=45*(PI/180),format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

rotateFiltreyi kullanırken, bilinear enterpolasyon bilinear=090 ile bölünebilen açılar için (kullanılarak ) kapatılmalıdır , aksi takdirde bulanık görünebilir.


notlar

  • Filtreleme kodlama gerektirir. Bu örnekler, H.264 video çıkışları yapar. Bkz FFmpeg H.264 Video Kodlama Kılavuzu istediğiniz kaliteyi alma konusunda rehberlik için.

  • Chroma alt örneklemesi. format=yuv420pZira ffmpegchroma alt örneklemesini en aza indirmeye veya engellemeye çalışacağımdan beri (enkodere, girişe, ffmpegversiyona vb. Bağlı) dahil ettim . Bu tamamen teknik anlamda iyi bir davranış, ancak çoğu oyuncu daha "gelişmiş" kroma alt örnekleme programları ile uyumsuz. Bu, kullanımı ile aynıdır -pix_fmt yuv420, ancak filtre zincirinde uygun bir şekilde bulunur .

  • Sesi kopyala. -codec:a copySeçenek olacaktır kopya akışı yerine kodlamak (yeniden mux). Yalnızca videoyu değiştirmek isterseniz (farklı bir ses formatına dönüştürmek istemiyorsanız) sesi yeniden kodlamak için hiçbir neden yoktur. Bu, kodlama zaman alıcı olduğundan ve ses kalitesini koruyacağından zaman kazandıracaktır.


Oynatma üzerine döndür

Alternatif olarak, çalma sırasında döndürebilir ve yeniden kodlamayı engelleyebilirsiniz. ffplayotomatik olarak dönecek:

ffplay input.mp4

Displaymatrix tarafı verileri yoksa veya meta verileri döndürürseniz, filtreleri kullanabilirsiniz:

ffplay -vf "hflip,vflip" -i input.mp4

... veya en sevdiğiniz oyuncuya bakın. VLC gibi kullanmaya değer çoğu oyuncu bu özelliğe sahiptir.


Alma ffmpeg

Daha eski ffmpeg yapıları filtreleme yetenekleri içermez. Bkz FFmpeg indir Linux, OS X ve Windows için inşa çeşitli seçenekler elverişli dahil için sayfa ya bakın FFmpeg Wiki için adım-adım ffmpeg kılavuzları derlemek .


Teşekkürler, denemeyi yeni bitirdim -vf vflipve bir cazibe gibi çalıştı. Ancak bu bir yeniden kodlama oldu. Seni doğru okudum mu bilmiyorum. -vf hflip,vflipTekrar kodlamayacağını mı söylüyorsun ?
Louis,

@Louis ffmpeg, video ve ses filtreleri kullanırken yeniden kodlamanızı gerektirir. Ancak, ffplayikinci örneğimde gösterildiği gibi oynatma sırasında filtrelerin çoğunu da kullanabilir.
llogan

Ah, farklı bir program olduğunu fark etmedim.
Louis,

Acaba video kalitesini korumanın başka bir yolu var -codec:v libx264mı? Can ffmpegSadece anlamaya çalışıyorum kullanıcıya olmadan aynı kodlamasını kullanır?
Sadi

1
@Louis , dereceleri yerine birimler olarak radyanrotate kullanır . İnsanların derecelere daha aşina olduklarını düşünüyorum, bu yüzden örnekte dereceleri nasıl kullanacağımı göstermeye çalıştım. Bir derece π / 180 radyan'a eşittir. Yani 45 ° döndürmek istiyorsanız sadece kullanın . rotate="45*(PI/180)"
lgagan

7

FFMPEG, giriş video kaynaklarını 2015 yılında v2.7 sürümünde "döndür" meta verileriyle otomatik olarak döndürmek için varsayılan davranışı değiştirdi .

Komut dosyanızın veya komutunuzun asla 2.7'den daha eski ffmpeg sürümlerinde çalıştırılmayacağını biliyorsanız, en basit çözüm meta verilere göre herhangi bir özel döndürmeyi kaldırmaktır.

Diğer durumlar için, özel rotasyon kodunuzu koruyarak ve -noautorotatebayrak ekleyerek geleceğe hazırlayabilirsiniz (bu, o sırada hala tutulan eski sürümlerde desteklenir).


2

Kod çözme arka ucu olarak ffmpeg kullanan ortam yürütücüleri de tüm filtrelerini kullanabilir. Bu ekran görüntüsünü "Offset & flip" filter.görüntü tanımını buraya girin

Alternatif olarak, videonuzu yeniden kodlamak istiyorsanız , Stackoverflow'ta FFmpeg ile videoları döndürmeyi işaretleyin .


1
Maalesef FFmpeg ile videoları döndürme bölümünde belirtilen transposefiltre , söyleyebileceğim kadarıyla 180 ° dönmeyecek .
llogan

1
@ LordNeckbeard doğrudan değil, ancak transposeefekti elde etmek için iki filtreyi birlikte zincirleyebilirsiniz .
evilsoup

1
@ evilsoup Ah, evet, bunu düşünmedim. Mekansal muhakeme zordur; Hadi alışverişe gidelim. Cevabımı bir örnekle güncellemekten çekinmeyin.
llogan

1

Aşağıda, "fixedFiles" altındaki dizin yapısına sahip dosyaları çıkaran bir bash betiği verilmektedir. İOS videolarını dönüştürür ve döndürür ve AVI'leri dönüştürür. Senaryo hem taktıktan dayanır ExifTool ve ffmpeg .

#!/bin/bash

# rotation of 90 degrees. Will have to concatenate.
#ffmpeg -i <originalfile> -metadata:s:v:0 rotate=0 -vf "transpose=1" <destinationfile>
#/VLC -I dummy -vvv <originalfile> --sout='#transcode{width=1280,vcodec=mp4v,vb=16384,vfilter={canvas{width=1280,height=1280}:rotate{angle=-90}}}:std{access=file,mux=mp4,dst=<outputfile>}\' vlc://quit

#Allowing blanks in file names
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

#Bit Rate
BR=16384

#where to store fixed files
FIXED_FILES_DIR="fixedFiles"
#rm -rf $FIXED_FILES_DIR
mkdir $FIXED_FILES_DIR

# VLC
VLC_START="/Applications/VLC.app/Contents/MacOS/VLC -I dummy -vvv"
VLC_END="vlc://quit"


#############################################
# Processing of MOV in the wrong orientation
for f in `find . -regex '\./.*\.MOV'` 
do
  ROTATION=`exiftool "$f" |grep Rotation|cut -c 35-38`
  SHORT_DIMENSION=`exiftool "$f" |grep "Image Size"|cut -c 39-43|sed 's/x//'`
  BITRATE_INT=`exiftool "$f" |grep "Avg Bitrate"|cut -c 35-38|sed 's/\..*//'`
  echo Short dimension [$SHORT_DIMENSION] $BITRATE_INT

  if test "$ROTATION" != ""; then
    DEST=$(dirname ${f})
    echo "Processing $f with rotation $ROTATION in directory $DEST"
    mkdir -p $FIXED_FILES_DIR/"$DEST"

    if test "$ROTATION" == "0"; then
      cp "$f" "$FIXED_FILES_DIR/$f"

    elif test "$ROTATION" == "180"; then
#      $(eval $VLC_START \"$f\" "--sout="\'"#transcode{vfilter={rotate{angle=-"$ROTATION"}},vcodec=mp4v,vb=$BR}:std{access=file,mux=mp4,dst=\""$FIXED_FILES_DIR/$f"\"}'" $VLC_END )
      $(eval ffmpeg -i \"$f\" -vf hflip,vflip -r 30 -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\")

    elif test "$ROTATION" == "270"; then
      $(eval ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=2,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" )

    else
#      $(eval $VLC_START \"$f\" "--sout="\'"#transcode{scale=1,width=$SHORT_DIMENSION,vcodec=mp4v,vb=$BR,vfilter={canvas{width=$SHORT_DIMENSION,height=$SHORT_DIMENSION}:rotate{angle=-"$ROTATION"}}}:std{access=file,mux=mp4,dst=\""$FIXED_FILES_DIR/$f"\"}'" $VLC_END )
      echo ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=1,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" 
      $(eval ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=1,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" )

    fi

  fi

echo 
echo ==================================================================
sleep 1
done

#############################################
# Processing of AVI files for my Panasonic TV
# Use ffmpegX + QuickBatch. Bitrate at 16384. Camera res 640x424
for f in `find . -regex '\./.*\.AVI'` 
do
  DEST=$(dirname ${f})
  DEST_FILE=`echo "$f" | sed 's/.AVI/.MOV/'`
  mkdir -p $FIXED_FILES_DIR/"$DEST"
  echo "Processing $f in directory $DEST"
  $(eval ffmpeg -i \"$f\" -r 20 -acodec libvo_aacenc -b:a 128k -vcodec mpeg4 -b:v 8M -flags +aic+mv4 \"$FIXED_FILES_DIR/$DEST_FILE\" )
echo 
echo ==================================================================

done

IFS=$SAVEIFS

1

Sonunda bulduğum çözümün metnin sonunda olduğunu belirten metni düzenlemesi istendi. Böylece, sonunda videomu başarılı bir şekilde doğru yöne döndüren iki ardışık ffmpeg komutunu bulacaksınız. Bundan önceki metin, bilgi eksikliği nedeniyle reddedilen diğer mesajları gördüğüm kadar elimden geldiğince bilgi vermeyi amaçlıyordu. Neyse, bu ffmpeg kullanarak başkalarına yardımcı olur umarım. Bana göre ffmpeg'deki hflip ve vflip'in amacı, en azından, kafa karıştırıcı ve beklentilerimin aksine.

Merlin.mov dosyası, iphone'umda çektiğim, ilk önce Dropbox'a yüklenen, daha sonra dizüstü bilgisayarıma yüklenen ve Ubuntu çalıştıran bir videonun kopyası:

    $ uname -a
    Linux gazelle 3.13.0-135-generic #184-Ubuntu SMP
    Wed Oct 18 11:55:51 UTC 2017 x86_64 x86_64 x86_64
    GNU/Linux

İphone'umu USB üzerinden bağlayabilmem ve dosyaları doğrudan kopyalayabilmem gerektiğini biliyorum, ancak bu işe yaramadı; dizüstü bilgisayarım iphone'un bağlandığını fark ederdi, ancak dosya sistemini takmazdı ve dizüstü bilgisayarıma "güvenmek" için iphone'umda herhangi bir istekte bulunmadım.

Dropbox'tan dizüstü bilgisayarıma kopyalamak için kullandığım komut şuydu:

    cp ~/Dropbox/Camera\ Uploads/Video\ Nov\ 02\,\ 9\ 41\ 55\ AM.mov \
            merlin.mov

Orijinal dosya Video 1920 x 1080 Codec HEVC / H.265 Framerate 30 / sn, Bitrate 8140 kbps, Ses Kodek MPEG-4 AAC ses Kanalları Stereo, Örnekleme hızı 44100 Hz, Bitrate 85 kbps'dir. İPhone'umda çaldığımda düzgün bir şekilde yönlendiriliyor ve ses senkronize ediliyor. Dizüstü bilgisayarımdaki Videolar'da oynattığımda hem baş aşağı hem de yatay olarak ters çevriliyor ve ses senkronize edilmiyor. İşte "ffmpeg -i merlin.mov" un kısmi çıktısı:

    Metadata:
    rotate          : 180
    creation_time   : 2017-11-02T14:41:55.000000Z
    handler_name    : Core Media Data Handler
    encoder         : HEVC

İşte "ffmpeg -version" den ilk çıktı satırı:

ffmpeg sürüm 3.3.3 Telif Hakkı (c) 2000-2017 FFmpeg geliştiricileri

Aşağıda, oynatma işlemi hem dikey hem de yatay olarak ters çevrilmiş, ancak MPEG-4 videoya (video / mp4) dönüştü ve sesi senkronize etti:

    ffmpeg -i merlin.mov -vf 'hflip,vflip' merlinhflipvflip.mp4

Aşağıdakiler dikey olarak ters çevrilir, böylece çalma işlemi diktir, sesi senkronize eder ve MPEG-4'e dönüştürülür, ancak yatay olarak yanlış çevrilen ucu sonlandırır (bu bir yazım hatası değildir, 'hflip' belirttim):

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4

Aşağıdakiler yatayda doğru yöne çevrilmiş ancak oynatmayı baş aşağı bırakmış:

    ffmpeg -i merlin.mov -vf 'vflip' merlinvflip.mp4

Aşağıdakilerin hiçbir etkisi olmadığına karar verildi:

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'vflip' merlin2stepA.mp4

Bunu, superuser.com'da bulduğum bir komuta dayanarak da denedim. Sesi başarıyla senkronize etti ve MPEG-4'e dönüştürdü, ancak hem yatay hem de dikey yönelim yanlış kaldı:

    ffmpeg -i merlin.mov \
            -vf "rotate=PI:bilinear=0,format=yuv420p" \
            -metadata:s:v rotate=0 -codec:v libx264 \
            -codec:a copy merlinrotate.mp4

Ayrıca oryantasyonu düzeltmek için işe yaramayan bir şeyi de denedim:

    ffmpeg -noautorotate -i merlin.mov merlinnoautorotate.mp4

Aşağıdaki 2 aşamalı süreç sonunda istediğimi elde etti; dikey ve yatay olarak çevrilmiş, ses senkronize edilmiş ve MPEG-4'e dönüştürülmüş format (Yine, bu yazım hatası değil; her iki komutta hflip kullandım):

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'hflip' merlin2stepB.mp4

Uzun süredir - bu bana bir cevap gibi görünüyor - sadece problem çözme sürecinde yürüdü.
Journeyman Geek

@JourneymanGeek Gerçekten de haklısınız. Şimdi son paragrafında görüyorum. Aşağıdaki 2 adımlık süreç sonunda istediğimi elde etti . Güzel göz. (Ben gerçekten bütün yazıyı okudum ama gözlerim muhtemelen oraya geldiğimde sırlanıyordu).
Twisty Impersonator

Cevabınızı geliştirmek iyi iş. Cevabınız için yeterli ayrıntıyı eklemek için iyi yaptınız. Sitenin etrafına bakarken, diğer iyi cevapların netliği ayrıntılarla nasıl dengelediğini gözlemlemeye çalışın.
Twisty Impersonator

0

İşte adımlar:

  1. Önce video dosyanızı QuickTime uygulamasında açın. QuickTime'ı ilk önce ateşleyebilir, “Dosya” ya ve ardından “Açık Dosya” ya gidebilirsiniz. Veya dosyayı sağ tıklayıp “Birlikte Aç” ı ve ardından QuickTime'ı seçebilirsiniz.

  2. Video açıldıktan sonra “Düzenle” yi tıkladığınızda, döndürme ve çevirme seçeneklerini hemen aşağı bulacaksınız

  3. İstediğiniz yönlendirmeyi kilitledikten sonra, videonuzu eklediğiniz yeni değişikliklerle dışa aktarmanız gerekir. QuickTime'daki “Dosya” menüsünde “Dışa Aktar” seçeneğini bulabilirsiniz.

Dışa aktarmak istediğiniz dosya ayarlarını seçin ve dışa aktarımı başlatmak için “Tamam” ı tıklayın.

Dışa aktarma işlemi tamamlandığında, yeni dosyanızı doğru yöne doğru kaydetmeyi seçtiğiniz yeri bulacaksınız!

Bu düzeltmenin tamamlanması 5 dakikadan daha az sürdü, ancak videonun uzunluğuna bağlı olarak çok daha uzun sürebilir (veya daha kısa, yine de değişebilir).

blog kaynağı


0
ffmpeg -i input.mp4 -filter:v "transpose=1,transpose=1" output.mp4

Numaramı benim için yaptım. Transpozetin neden aynı anda 180 derece dönme olasılığı sağlamadığından emin değiliz, ama her neyse. Daha fazla bilgi için Dokümanlar'a bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.