मेरे पास एक वीडियो है जिसे रिकॉर्ड किए जाने पर 180 ° घुमाया गया था। क्या FFmpeg के साथ इसे ठीक करना संभव है?
मेरे पास एक वीडियो है जिसे रिकॉर्ड किए जाने पर 180 ° घुमाया गया था। क्या FFmpeg के साथ इसे ठीक करना संभव है?
जवाबों:
ffmpeg
जब तक वीडियो स्वचालित रूप से घुमाएगी:
ffmpeg
बहुत पुराना हैकुछ वीडियो, जैसे कि iPhones से, भौतिक रूप से फ़्लिप नहीं किए जाते हैं, लेकिन वीडियो स्ट्रीम डिस्प्लेमेट्रिक्स साइड डेटा या मेटाडेटा को घुमाते हैं। कुछ खिलाड़ी इन मेटाडेटा की उपेक्षा करते हैं और कुछ नहीं करते हैं। ffmpeg
यदि आपके इनपुट में इस तरह का मेटाडेटा है, तो यह देखने के लिए आउटपुट को कंसोल करें:
$ 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
स्वचालित रूप से किसी भी मौजूदा वीडियो स्ट्रीम रोटेशन मेटाडेटा के अनुसार वीडियो को घुमाएगा।
आपको एक निर्माण की जरूरत है जिसमें 1630224, 2 मई 2015 से, ऑटोरोटेशन सुविधा का उपयोग करने में सक्षम होना शामिल है।
ffmpeg -i input.mp4 -c:a copy output.mp4
इस व्यवहार को अक्षम करने के लिए -noautorotate
विकल्प का उपयोग करें ।
ffmpeg
पुराना हैआपको वीडियो को घुमाने के लिए एक फिल्टर का उपयोग करना होगा, और यदि कोई भी रोटेट मेटाडेटा मौजूद है, तो इसे उदाहरणों में दिखाए अनुसार हटा दिया जाएगा:
का उपयोग करते हुए ffmpeg
आप 180 डिग्री बारी बारी से करने के लिए वीडियो फिल्टर का उपयोग कर के तीन विधियों में से एक विकल्प नहीं है।
hflip
तथा 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
यह फिल्टर किसी भी मनमाने कोण पर घूम सकता है और डिग्री के बजाय एक इकाई के रूप में रेडियन का उपयोग करता है। यह उदाहरण example / 1 रेडियन या 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
आप इसके बजाय डिग्री का उपयोग कर सकते हैं। एक डिग्री π / 180 रेडियन के बराबर है। तो अगर आप 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
rotate
फ़िल्टर का उपयोग करते समय , बाइलाइनियर इंटरपोलेशन को bilinear=0
90 से विभाज्य कोणों के लिए बंद (उपयोग करके ) किया जाना चाहिए , अन्यथा यह धुंधला दिख सकता है।
फ़िल्टरिंग के लिए एन्कोडिंग की आवश्यकता होती है। ये उदाहरण H.264 वीडियो आउटपुट बनाते हैं। FFmpeg H.264 वीडियो एन्कोडिंग गाइड को उस गुणवत्ता के मार्गदर्शन के लिए देखें जिसे आप चाहते हैं।
क्रोमा सबसम्पलिंग। मैंने शामिल किया है format=yuv420p
क्योंकि ffmpeg
क्रोमा सबमिशनिंग (एनकोडर, इनपुट, ffmpeg
संस्करण, आदि के आधार पर ) को कम करने या उससे बचने का प्रयास करेगा । यह विशुद्ध रूप से तकनीकी अर्थों में अच्छा व्यवहार है, लेकिन अधिकांश खिलाड़ी अधिक "उन्नत" क्रोमा सबसम्पलिंग योजनाओं के साथ असंगत हैं। यह उपयोग करने के समान है -pix_fmt yuv420
, लेकिन फ़िल्टरचेन में आसानी से स्थित है ।
ऑडियो कॉपी करें। -codec:a copy
विकल्प होगा प्रतिलिपि स्ट्रीम एन्कोड करने के बजाय (फिर से mux)। ऑडियो को फिर से एनकोड करने का कोई कारण नहीं है यदि आप केवल वीडियो को हेरफेर करना चाहते हैं (जब तक कि आप एक अलग वीडियो प्रारूप में बदलना नहीं चाहते हैं)। इससे समय की बचत होगी क्योंकि एन्कोडिंग में समय लगता है और यह ऑडियो की गुणवत्ता को बनाए रखेगा।
वैकल्पिक रूप से आप प्लेबैक को घुमा सकते हैं और पुनः एन्कोडिंग से बच सकते हैं। ffplay
स्वचालित रूप से घूमेगा:
ffplay input.mp4
अगर कोई डिस्प्लेमेट्रिक्स साइड डेटा नहीं है या मेटाडेटा को घुमाता है तो आप फ़िल्टर का उपयोग कर सकते हैं:
ffplay -vf "hflip,vflip" -i input.mp4
... या अपने पसंदीदा खिलाड़ी को देखें। वीएलसी की तरह उपयोग करने वाले अधिकांश खिलाड़ियों में यह क्षमता है।
ffmpeg
Ffmpeg के पुराने बिल्ड में फ़िल्टरिंग क्षमताओं को शामिल नहीं किया जाता है। देखें FFmpeg डाउनलोड या लिनक्स, ओएस एक्स, और Windows के लिए बनाता है सुविधाजनक सहित अनेक विकल्प के लिए पेज, का उल्लेख FFmpeg विकी के लिए कदम-दर-कदम ffmpeg गाइड संकलन ।
-vf vflip
और यह एक आकर्षण की तरह काम करता है। लेकिन यह फिर से एनकोड था। मुझे यकीन नहीं है कि मैं आपको सही पढ़ रहा हूं। क्या आप कह रहे हैं कि -vf hflip,vflip
फिर से एनकोड नहीं होगा?
ffmpeg
आवश्यक है कि आप वीडियो और ऑडियो फ़िल्टर का उपयोग करते समय पुनः एनकोड करें। हालाँकि, ffplay
प्लेबैक के दौरान कई फिल्टर का भी उपयोग कर सकते हैं जैसा कि मेरे दूसरे उदाहरण में दिखाया गया है।
-codec:v libx264
? क्या ffmpeg
केवल उपयोगकर्ता बिना इसे समझे ही एन्कोडिंग का उपयोग कर सकता है?
rotate
उपयोग करता है । मुझे लगता है कि लोग डिग्री से अधिक परिचित हैं, इसलिए मैंने उदाहरण में डिग्री का उपयोग करने का तरीका दिखाने का प्रयास किया। एक डिग्री π / 180 रेडियन के बराबर है। इसलिए यदि आप 45 ° घुमाना चाहते हैं तो बस उपयोग करें । rotate="45*(PI/180)"
FFMPEG ने 2015 में v2.7 रिलीज में "रोटेट" मेटाडेटा के साथ ऑटो रोटेट इनपुट वीडियो स्रोतों के लिए डिफ़ॉल्ट व्यवहार को बदल दिया ।
यदि आप जानते हैं कि आपकी स्क्रिप्ट या कमांड 2.7 से अधिक पुराने ffmpeg रिलीज़ पर कभी नहीं चलेगी, तो सबसे सरल उपाय मेटाडेटा पर आधारित किसी भी कस्टम रोटेशन को हटाना है।
अन्य मामलों के लिए आप अपने कस्टम रोटेशन कोड को रख कर और -noautorotate
फ्लैग को जोड़कर भविष्य में प्रूफ कर सकते हैं (यह पुराने संस्करणों में समर्थित है जो उस समय भी बनाए हुए थे)।
मीडिया प्लेयर जो एक डिकोडिंग बैकेंड के रूप में ffmpeg का उपयोग करते हैं, वे भी इसके सभी फिल्टर का उपयोग कर सकते हैं। इस स्क्रीनशॉट को "ऑफसेट और फ्लिप" फ़िल्टर के साथ देखें।
वैकल्पिक रूप से, यदि आप अपने वीडियो को फिर से एनकोड करना चाहते हैं, तो Stackoverflow पर FFmpeg के साथ रोटेटिंग वीडियो देखें ।
transpose
फिल्टर FFmpeg के साथ घूमने वाले वीडियो में संदर्भित 180 ° तक नहीं घूमेगा जहाँ तक मैं बता सकता हूँ।
transpose
प्रभाव को प्राप्त करने के लिए एक साथ दो फ़िल्टर श्रृंखला कर सकते हैं ।
निम्नलिखित एक बैश स्क्रिप्ट है, जो "फिक्स्ड फ़ाइल्स" के तहत निर्देशिका संरचना के साथ फ़ाइलों को आउटपुट करेगी। यह iOS वीडियो को रूपांतरित और घुमाता है और AVI को ट्रांसकोड करता है। स्क्रिप्ट एक्सफ़ाल्टूल और 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
मुझे इसे संपादित करने के लिए कहा गया था, पाठ को प्रस्तुत करने के लिए, जो समाधान मुझे अंततः मिला वह पाठ के अंत में था। तो, अंत में आपको दो लगातार ffmpeg कमांड मिलेंगे जिन्होंने मेरे वीडियो को सही ओरिएंटेशन के लिए सफलतापूर्वक घुमाया। पाठ पूर्ववर्ती था जो जितना संभव हो उतना जानकारी देने के लिए था, जैसा कि मैंने अन्य संदेशों को देखा था जो जानकारी की कमी के कारण फटकार लगा रहे थे। वैसे भी मुझे उम्मीद है कि यह दूसरों को ffmpeg का उपयोग करने में मदद करता है। यह मुझे ffmpeg में hflip और vflip का उद्देश्य लगता है, न्यूनतम, भ्रामक है, और जो मुझे उम्मीद है उसके विपरीत है।
फ़ाइल merlin.mov एक वीडियो की एक प्रति है जिसे मैंने अपने iPhone पर लिया है, पहले ड्रॉपबॉक्स पर अपलोड किया गया, फिर अपने लैपटॉप पर डाउनलोड किया गया, रनिंग टाइमबॉक्स:
$ 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
मुझे पता है कि मुझे USB के माध्यम से अपने iPhone को माउंट करने में सक्षम होना चाहिए और फ़ाइलों को सीधे कॉपी करना चाहिए, लेकिन यह काम नहीं किया; मेरा लैपटॉप पहचान लेगा कि iphone जुड़ा हुआ है, लेकिन वह अपने फाइल सिस्टम को माउंट नहीं करेगा, और मुझे अपने iPhone पर लैपटॉप पर "विश्वास" करने का कोई संकेत नहीं मिला।
ड्रॉपबॉक्स से अपने लैपटॉप में कॉपी करने के लिए मैं जो कमांड इस्तेमाल करता था वह यह था:
cp ~/Dropbox/Camera\ Uploads/Video\ Nov\ 02\,\ 9\ 41\ 55\ AM.mov \
merlin.mov
मूल फ़ाइल वीडियो 1920 x 1080 कोडेक HEVC / H.265 Framerate 30 / sec, बिटरेट 8140 केबीपीएस, ऑडियो कोडेक एमपीईजी -4 एएसी ऑडियो चैनल स्टीरियो, नमूना दर 44100 हर्ट्ज, बिटरेट 85 केबीपीएस है। जब मैं इसे अपने iPhone पर खेलता हूं तो यह ठीक से उन्मुख होता है, और ध्वनि सिंक्रनाइज़ होती है। जब मैं इसे अपने लैपटॉप पर वीडियो में खेलता हूं तो यह दोनों उल्टा हो जाता है और क्षैतिज रूप से उलट हो जाता है, और ध्वनि सिंक्रनाइज़ नहीं होती है। यहाँ आंशिक उत्पादन "ffmpeg -i merlin.mov" से लिया गया है:
Metadata:
rotate : 180
creation_time : 2017-11-02T14:41:55.000000Z
handler_name : Core Media Data Handler
encoder : HEVC
यहाँ "ffmpeg -version" से आउटपुट की पहली पंक्ति है:
ffmpeg संस्करण 3.3.3 कॉपीराइट (c) 2000-2017 FFmpeg डेवलपर्स
निम्नलिखित पार्श्व ने लंबवत और क्षैतिज रूप से दोनों को उल्टा कर दिया, हालांकि यह MPEG-4 वीडियो (वीडियो / mp4) में परिवर्तित हो गया और ध्वनि को सिंक्रनाइज़ किया गया:
ffmpeg -i merlin.mov -vf 'hflip,vflip' merlinhflipvflip.mp4
निम्नलिखित उल्टा है, तो पार्श्व सीधा है, ध्वनि सिंक्रनाइज़, और MPEG-4 में परिवर्तित, लेकिन क्षैतिज गलत तरीके से अंत के लिए फ़्लिप छोड़ दिया (यह कोई टाइपो नहीं है, मैंने 'hflip' निर्दिष्ट किया है):
ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
निम्नलिखित ने क्षैतिज को सही अभिविन्यास के लिए फ़्लिप किया, लेकिन पार्श्व को उल्टा छोड़ दिया:
ffmpeg -i merlin.mov -vf 'vflip' merlinvflip.mp4
निम्नलिखित के लिए कोई प्रभाव नहीं लग रहा था:
ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
ffmpeg -i merlinhflip.mp4 -vf 'vflip' merlin2stepA.mp4
मैंने यह भी कोशिश की, मुझे superuser.com पर मिली एक कमांड के आधार पर। इसने ध्वनि को सफलतापूर्वक सिंक्रनाइज़ किया, और MPEG-4 में परिवर्तित कर दिया, लेकिन क्षैतिज और ऊर्ध्वाधर अभिविन्यास दोनों गलत रहे:
ffmpeg -i merlin.mov \
-vf "rotate=PI:bilinear=0,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 \
-codec:a copy merlinrotate.mp4
मैंने यह भी कोशिश की, जो अभिविन्यास को सही करने के मामले में भी काम नहीं किया:
ffmpeg -noautorotate -i merlin.mov merlinnoautorotate.mp4
निम्नलिखित 2-चरण प्रक्रिया को अंततः वही मिला जो मुझे चाहिए था; ऊर्ध्वाधर और क्षैतिज दोनों फ़्लिप, ध्वनि सिंक्रनाइज़ किए गए, और प्रारूप MPEG-4 में परिवर्तित हो गए (फिर, यह कोई टाइपो नहीं है; मैंने दोनों आदेशों में hflip का उपयोग किया है):
ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
ffmpeg -i merlinhflip.mp4 -vf 'hflip' merlin2stepB.mp4
यहाँ कदम हैं:
सबसे पहले अपने विडियो फ़ाइल को क्विकटाइम में खोलें। आप या तो पहले आग लगा सकते हैं, पहले "फाइल" पर जाएं और फिर "ओपन फाइल" पर जाएं। या आप फ़ाइल को राइट-क्लिक कर सकते हैं, "ओपन विथ" चुनें और फिर क्विकटाइम चुनें।
एक बार वीडियो खुला होने के बाद "संपादित करें" पर क्लिक करें और फिर आप सीधे नीचे दिए गए रोटेट और फ्लिप विकल्पों को देखेंगे
एक बार जब आप अपने इच्छित अभिविन्यास को बंद कर देते हैं, तो आपको अपने वीडियो को आपके द्वारा जोड़े गए नए परिवर्तनों के साथ निर्यात करना होगा। आपको क्विकटाइम में "फ़ाइल" मेनू के तहत "निर्यात" विकल्प मिलेगा।
फ़ाइल सेटिंग्स चुनें जिसे आप निर्यात करना चाहते हैं और निर्यात बंद करने के लिए "ओके" पर क्लिक करें।
जब निर्यात ऑपरेशन पूरा हो जाता है, तो आपको अपनी नई फ़ाइल मिल जाएगी, जहाँ आपने इसे सही ओरिएंटेशन के साथ सहेजने के लिए चुना है!
इस पूरे फिक्स को पूरा होने में मुझे 5 मिनट से भी कम समय लगा, लेकिन वीडियो की लंबाई के आधार पर, इसमें बहुत अधिक समय (या कम, फिर से, यह भिन्न होता है) हो सकता है।