Kaydedildiğinde 180 ° döndürülmüş bir videom var. Bunu FFmpeg ile düzeltmek mümkün mü?
Kaydedildiğinde 180 ° döndürülmüş bir videom var. Bunu FFmpeg ile düzeltmek mümkün mü?
Yanıtlar:
ffmpeg
videoyu otomatik olarak döndürür:
ffmpeg
çok eskiİ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 ffmpeg
bö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
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.
ffmpeg -i input.mp4 -c:a copy output.mp4
Bu davranışı devre dışı bırakmak için -noautorotate
seçeneği kullanın.
ffmpeg
eskiyseVideoyu 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:
Kullanma ffmpeg
180 ° 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
rotate
Filtreyi kullanırken, bilinear enterpolasyon bilinear=0
90 ile bölünebilen açılar için (kullanılarak ) kapatılmalıdır , aksi takdirde bulanık görünebilir.
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=yuv420p
Zira ffmpeg
chroma alt örneklemesini en aza indirmeye veya engellemeye çalışacağımdan beri (enkodere, girişe, ffmpeg
versiyona 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 copy
Seç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.
Alternatif olarak, çalma sırasında döndürebilir ve yeniden kodlamayı engelleyebilirsiniz. ffplay
otomatik 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.
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 .
-vf vflip
ve bir cazibe gibi çalıştı. Ancak bu bir yeniden kodlama oldu. Seni doğru okudum mu bilmiyorum. -vf hflip,vflip
Tekrar kodlamayacağını mı söylüyorsun ?
ffmpeg
, video ve ses filtreleri kullanırken yeniden kodlamanızı gerektirir. Ancak, ffplay
ikinci örneğimde gösterildiği gibi oynatma sırasında filtrelerin çoğunu da kullanabilir.
-codec:v libx264
mı? Can ffmpeg
Sadece anlamaya çalışıyorum kullanıcıya olmadan aynı kodlamasını kullanır?
rotate
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)"
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 -noautorotate
bayrak ekleyerek geleceğe hazırlayabilirsiniz (bu, o sırada hala tutulan eski sürümlerde desteklenir).
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.
Alternatif olarak, videonuzu yeniden kodlamak istiyorsanız , Stackoverflow'ta FFmpeg ile videoları döndürmeyi işaretleyin .
transpose
filtre , söyleyebileceğim kadarıyla 180 ° dönmeyecek .
transpose
efekti elde etmek için iki filtreyi birlikte zincirleyebilirsiniz .
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
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
İşte adımlar:
Ö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.
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
İ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).
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.