Bagaimana cara memutar video 180 ° dengan FFmpeg?

69

Saya punya video yang diputar 180 ° saat direkam. Apakah mungkin untuk memperbaikinya dengan FFmpeg?

Louis
sumber
Apakah Anda bertanya tentang membaliknya selama pemutaran atau pengkodean ulang dengan orientasi yang benar?
Mxx
@Mxx saya berpikir untuk menyandikan ulang, tetapi apa yang Anda maksud selama pemutaran?
Louis
Pemutar media yang menggunakan ffmpeg sebagai backend decoding juga dapat menggunakan semua filternya. Lihat tangkapan layar ini ffdshow-tryout.sourceforge.net/images/front1.png filter "Offset and flip". Lihat juga stackoverflow.com/questions/3937387/rotating-videos-with-ffmpeg
Mxx
Oh oke, keren. Itu akan berhasil bagi saya, tetapi saya juga ingin membagikannya. Saya akan melihat pada pertanyaan SO.
Louis
5
Kata-kata dan judul pertanyaan ini benar-benar membingungkan. Membalik video secara vertikal tidak sama dengan memutarnya 180 derajat (yang sama dengan flip vertikal dan flip horisontal). Berdasarkan jawaban yang diterima saya mengedit untuk menentukan rotasi. Saat ini ini mencemari hasil google untuk membalik video secara vertikal dengan ffmpeg.
Jason C

Jawaban:

102

aslidiputar


tl; dr

ffmpeg akan memutar video secara otomatis kecuali:

  • input Anda tidak mengandung metadata putar
  • kamu ffmpegterlalu tua

Metadata rotasi

Beberapa video, seperti dari iPhone, tidak diputar secara fisik, tetapi berisi data sisi displaymatrix aliran video atau putar metadata. Beberapa pemain mengabaikan metadata ini dan beberapa lainnya tidak. Lihat ffmpegoutput konsol untuk melihat apakah input Anda memiliki metadata seperti itu:

$ 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

Autorotation

ffmpeg secara otomatis akan memutar video sesuai dengan metadata rotasi aliran video yang ada.

Anda memerlukan build yang menyertakan commit 1630224, mulai 2 Mei 2015, untuk dapat menggunakan fitur autorotation.

Contoh

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

Untuk menonaktifkan perilaku ini gunakan -noautorotateopsi.


Jika input tidak mengandung metadata atau jika Anda ffmpegsudah tua

Anda harus menggunakan filter untuk memutar video, dan jika ada metadata putar, itu harus dihapus seperti yang ditunjukkan dalam contoh di bawah ini:

Contohnya

Menggunakan ffmpegAnda memiliki tiga metode pilihan menggunakan filter video untuk memutar 180 °.

hflip dan 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

Filter ini dapat diputar ke sudut sembarang dan menggunakan radian sebagai unit alih-alih derajat. Contoh ini akan memutar π / 1 radian, atau 180 °:

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

Anda bisa menggunakan derajat sebagai gantinya. Satu derajat sama dengan π / 180 radian. Jadi jika Anda ingin memutar 45 °:

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

Saat menggunakan rotatefilter, interpolasi bilinear harus dimatikan (dengan menggunakan bilinear=0) agar sudut dapat dibagi dengan 90, jika tidak maka akan terlihat buram.


Catatan

  • Penyaringan membutuhkan pengodean. Contoh-contoh ini menghasilkan output video H.264. Lihat Panduan Pengkodean Video FFmpeg H.264 untuk panduan dalam mendapatkan kualitas yang Anda inginkan.

  • Subsampling Chroma. Saya termasuk format=yuv420pkarena ffmpegakan berusaha untuk meminimalkan atau menghindari subsampel kroma (tergantung pada encoder, input, ffmpegversi, dll). Ini adalah perilaku yang baik dalam arti teknis murni, tetapi sebagian besar pemain tidak kompatibel dengan skema subsampling chroma yang lebih "canggih". Ini sama dengan menggunakan -pix_fmt yuv420, tetapi berlokasi di filterchain .

  • Salin audio. The -codec:a copypilihan akan streaming copy (re-mux) bukan encode. Tidak ada alasan untuk menyandikan ulang audio jika Anda hanya ingin memanipulasi video saja (kecuali jika Anda ingin mengonversi ke format audio yang berbeda). Ini akan menghemat waktu karena pengodean memakan waktu dan itu akan menjaga kualitas audio.


Putar setelah pemutaran

Atau Anda dapat memutar pada pemutaran dan menghindari pengkodean ulang. ffplayotomatis akan berputar:

ffplay input.mp4

Jika tidak ada data sisi displaymatrix atau putar metadata maka Anda dapat menggunakan filter:

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

... atau merujuk ke pemain favorit Anda. Kebanyakan pemain layak digunakan, seperti VLC, memiliki kemampuan ini.


Mendapatkan ffmpeg

Pembuatan ffmpeg yang lebih lama tidak mencakup kemampuan pemfilteran. Lihat halaman unduh FFmpeg untuk beberapa opsi termasuk build yang nyaman untuk Linux, OS X, dan Windows, atau lihat FFmpeg Wiki untuk panduan kompilasi ffmpeg langkah-demi-langkah .

llogan
sumber
Terima kasih, saya baru saja selesai mencoba -vf vflipdan itu bekerja seperti pesona. Tapi itu adalah penyandian ulang. Saya tidak yakin apakah saya membaca Anda dengan benar. Apakah Anda mengatakan -vf hflip,vfliptidak akan menyandikan ulang?
Louis
@ Louis ffmpegmengharuskan Anda menyandikan ulang saat menggunakan filter video dan audio. Namun, ffplaydapat juga menggunakan banyak filter selama pemutaran seperti yang ditunjukkan pada contoh kedua saya.
Logan
Ah, tidak menyadari itu adalah program yang berbeda.
Louis
Saya ingin tahu apakah ada cara menjaga kualitas video selain -codec:v libx264? Bisakah ffmpeghanya menggunakan pengkodean yang sama tanpa pengguna mencoba mengetahuinya?
Sadi
1
@ Louis rotatemenggunakan radian sebagai unit, bukan derajat. Saya pikir orang lebih mengenal derajat, jadi saya berusaha menunjukkan bagaimana menggunakan derajat dalam contoh. Satu derajat sama dengan π / 180 radian. Jadi jika Anda ingin memutar 45 ° cukup gunakan rotate="45*(PI/180)".
llogan
7

FFMPEG mengubah perilaku default menjadi otomatis memutar sumber video input dengan metadata "rotate" di rilis v2.7 di 2015 .

Jika Anda tahu skrip atau perintah Anda tidak akan pernah berjalan pada rilis ffmpeg yang lebih lama dari 2,7, solusi paling sederhana adalah menghapus setiap rotasi khusus berdasarkan metadata.

Untuk kasus lain, Anda dapat melakukan pembuktian di masa mendatang dengan menjaga kode rotasi khusus Anda dan menambahkan -noautorotatebendera (ini didukung dalam versi yang lebih lama yang masih dipertahankan pada saat itu).

Albin
sumber
2

Pemutar media yang menggunakan ffmpeg sebagai backend decoding juga dapat menggunakan semua filternya. Lihat tangkapan layar ini dengan filter "Offset & flip".masukkan deskripsi gambar di sini

Atau, jika Anda ingin menyandikan ulang video Anda, lihat Memutar video dengan FFmpeg di Stackoverflow.

Mxx
sumber
1
Sayangnya transposefilter yang dirujuk dalam Rotating videos with FFmpeg tidak akan berputar 180 ° sejauh yang saya tahu.
llogan
1
@ LordNeckbeard tidak secara langsung, tetapi Anda dapat menghubungkan dua transposefilter secara bersamaan untuk mencapai efeknya.
evilsoup
1
@ evilsoup Ah, ya, saya tidak memikirkan itu. Penalaran spasial sulit; Ayo Belanja. Jangan ragu untuk memperbarui jawaban saya dengan sebuah contoh.
llogan
1

Berikut ini adalah skrip bash yang akan menampilkan file dengan struktur direktori di bawah "fixFiles". Ini mengubah dan memutar video iOS dan transcodes AVI. Skrip bergantung pada menginstal kedua exiftool dan 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
David Costa Faidella
sumber
1

Saya diminta untuk mengedit ini, untuk kata pengantar teks, menunjukkan solusi yang akhirnya saya temukan adalah di akhir teks. Jadi, pada akhirnya Anda akan menemukan dua perintah ffmpeg berturut-turut yang berhasil memutar video saya ke arah yang benar. Teks sebelumnya yang dimaksudkan untuk memberikan informasi sebanyak mungkin, seperti yang saya lihat pesan lain yang ditolak karena kurangnya informasi. Pokoknya saya berharap ini membantu orang lain menggunakan ffmpeg. Menurut saya tujuan hflip dan vflip di ffmpeg, paling tidak, membingungkan, dan bertentangan dengan apa yang saya harapkan.

File merlin.mov adalah salinan video yang saya ambil di iphone saya, pertama diunggah ke Dropbox, kemudian diunduh ke laptop saya, menjalankan Ubuntu:

    $ 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

Saya tahu saya seharusnya bisa memasang iphone saya melalui USB dan menyalin file secara langsung, tetapi itu tidak berhasil; laptop saya akan mengenali bahwa iphone itu terhubung, tetapi tidak akan me-mount sistem file-nya, dan saya tidak meminta pada iphone saya untuk "mempercayai" laptop itu.

Perintah yang saya gunakan untuk menyalin dari Dropbox ke laptop saya adalah ini:

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

File asli adalah Video 1920 x 1080 Codec HEVC / H.265 Framerate 30 / detik, Bitrate 8140 kbps, Audio Codec MPEG-4 AAC audio Channels audio Stereo, sample rate 44100 Hz, Bitrate 85 kbps. Ketika saya memutarnya di iphone, itu berorientasi dengan benar, dan suaranya disinkronkan. Ketika saya memutarnya dalam Video di laptop saya, keduanya terbalik dan terbalik secara horizontal, dan suaranya tidak disinkronkan. Berikut ini sebagian output dari "ffmpeg -i merlin.mov":

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

Inilah baris pertama keluaran dari "ffmpeg -version":

ffmpeg versi 3.3.3 Hak cipta (c) 2000-2017 para pengembang FFmpeg

Berikut ini meninggalkan pemutaran terbalik baik secara vertikal maupun horizontal, meskipun itu dikonversi ke video MPEG-4 (video / mp4) dan menyinkronkan suara:

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

Berikut terbalik secara vertikal sehingga pemutaran tegak, menyinkronkan suara, dan dikonversi ke MPEG-4, tetapi meninggalkan horizontal terbalik terbalik untuk akhir (ini bukan salah ketik, saya memang menentukan 'hflip'):

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

Berikut ini membalik horizontal ke orientasi yang benar, tetapi meninggalkan pemutaran terbalik:

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

Yang berikut ini tampaknya tidak berpengaruh apa pun:

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

Saya juga mencoba ini, berdasarkan pada perintah yang saya temukan di superuser.com. Ini berhasil menyinkronkan suara, dan dikonversi ke MPEG-4, tetapi orientasi horisontal dan vertikal tetap salah:

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

Saya juga mencoba ini, yang tidak berhasil dalam hal memperbaiki orientasi:

    ffmpeg -noautorotate -i merlin.mov merlinnoautorotate.mp4

Proses 2 langkah berikut akhirnya mendapatkan apa yang saya inginkan; vertikal dan horizontal baik terbalik, suara disinkronkan, dan format dikonversi ke MPEG-4 (Sekali lagi, ini bukan salah ketik; Saya menggunakan hflip di kedua perintah):

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'hflip' merlin2stepB.mp4
Thomas Smith
sumber
Sementara lama - ini memang terlihat seperti jawaban bagi saya - dia hanya berjalan melalui proses pemecahan masalahnya.
Journeyman Geek
@JourneymanGeek Memang Anda benar. Saya sekarang melihat di paragraf terakhirnya. Proses 2 langkah berikut ini akhirnya mendapatkan apa yang saya inginkan . Mata yang bagus (Saya benar-benar membaca seluruh posting tetapi mata saya mungkin telah mengkilap pada saat saya sampai di sana).
Saya katakan Reinstate Monica
Pekerjaan bagus meningkatkan jawaban Anda. Anda telah melakukannya dengan baik untuk memasukkan perincian yang cukup untuk jawaban Anda. Saat Anda melihat-lihat situs, coba amati bagaimana jawaban bagus lainnya menyeimbangkan kejelasan dengan detail.
Saya katakan Reinstate Monica
0

Berikut langkah-langkahnya:

  1. Pertama buka file video Anda di QuickTime. Anda dapat mengaktifkan QuickTime terlebih dahulu, pergi ke "File" dan kemudian ke "Open File". Atau Anda bisa mengklik kanan file itu sendiri, pilih "Buka Dengan" dan kemudian pilih QuickTime.

  2. Setelah video terbuka klik "Edit" dan Anda akan menemukan opsi rotate dan flip tepat di bawah

  3. Setelah Anda mengunci orientasi yang Anda inginkan, Anda kemudian harus mengekspor video Anda dengan perubahan baru yang Anda tambahkan. Anda akan menemukan opsi "Ekspor" di bawah menu "File" di QuickTime.

Pilih pengaturan file yang ingin Anda ekspor dan klik "Oke", untuk memulai ekspor.

Ketika operasi ekspor selesai, Anda akan menemukan file baru di mana pun Anda memilih untuk menyimpannya dengan orientasi yang benar!

Seluruh perbaikan ini membutuhkan waktu kurang dari 5 menit untuk saya selesaikan, tetapi tergantung pada panjang video, ini bisa memakan waktu lebih lama (atau lebih pendek, lagi, bervariasi).

sumber blog

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

Apakah trik untuk saya. Tidak yakin mengapa filter transpos tidak memberikan kemungkinan untuk memutar 180 derajat sekaligus, tetapi apa pun. Periksa Documents untuk info lebih lanjut.

panepeter
sumber