Saya punya video yang diputar 180 ° saat direkam. Apakah mungkin untuk memperbaikinya dengan FFmpeg?
Saya punya video yang diputar 180 ° saat direkam. Apakah mungkin untuk memperbaikinya dengan FFmpeg?
Jawaban:
ffmpeg
akan memutar video secara otomatis kecuali:
ffmpeg
terlalu tuaBeberapa 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 ffmpeg
output 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
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.
ffmpeg -i input.mp4 -c:a copy output.mp4
Untuk menonaktifkan perilaku ini gunakan -noautorotate
opsi.
ffmpeg
sudah tuaAnda harus menggunakan filter untuk memutar video, dan jika ada metadata putar, itu harus dihapus seperti yang ditunjukkan dalam contoh di bawah ini:
Menggunakan ffmpeg
Anda 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 rotate
filter, interpolasi bilinear harus dimatikan (dengan menggunakan bilinear=0
) agar sudut dapat dibagi dengan 90, jika tidak maka akan terlihat buram.
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=yuv420p
karena ffmpeg
akan berusaha untuk meminimalkan atau menghindari subsampel kroma (tergantung pada encoder, input, ffmpeg
versi, 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 copy
pilihan 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.
Atau Anda dapat memutar pada pemutaran dan menghindari pengkodean ulang. ffplay
otomatis 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.
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 .
-vf vflip
dan itu bekerja seperti pesona. Tapi itu adalah penyandian ulang. Saya tidak yakin apakah saya membaca Anda dengan benar. Apakah Anda mengatakan -vf hflip,vflip
tidak akan menyandikan ulang?
ffmpeg
mengharuskan Anda menyandikan ulang saat menggunakan filter video dan audio. Namun, ffplay
dapat juga menggunakan banyak filter selama pemutaran seperti yang ditunjukkan pada contoh kedua saya.
-codec:v libx264
? Bisakah ffmpeg
hanya menggunakan pengkodean yang sama tanpa pengguna mencoba mengetahuinya?
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 -noautorotate
bendera (ini didukung dalam versi yang lebih lama yang masih dipertahankan pada saat itu).
Pemutar media yang menggunakan ffmpeg sebagai backend decoding juga dapat menggunakan semua filternya. Lihat tangkapan layar ini dengan filter "Offset & flip".
Atau, jika Anda ingin menyandikan ulang video Anda, lihat Memutar video dengan FFmpeg di Stackoverflow.
transpose
filter yang dirujuk dalam Rotating videos with FFmpeg tidak akan berputar 180 ° sejauh yang saya tahu.
transpose
filter secara bersamaan untuk mencapai efeknya.
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
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
Berikut langkah-langkahnya:
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.
Setelah video terbuka klik "Edit" dan Anda akan menemukan opsi rotate dan flip tepat di bawah
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).