تدوير الفيديوهات مع FFmpeg


Answers

هل حاولت transpose حتى الآن؟ مثل (من الجواب الآخر)

 ffmpeg -i input -vf transpose=2 output

إذا كنت تستخدم إصدارًا قديمًا ، فيجب عليك تحديث ffmpeg إذا كنت تريد استخدام ميزة التحويل ، حيث تمت إضافته في أكتوبر 2011.

تقدم صفحة download FFmpeg تصميمات ثابتة يمكنك تنفيذها مباشرة دون الحاجة إلى تجميعها.

Question

لقد كنت أحاول معرفة كيفية تدوير مقاطع الفيديو باستخدام FFmpeg. أعمل مع مقاطع فيديو iPhone مأخوذة في الوضع الرأسي. أنا أعرف كيفية تحديد درجات الدوران الحالية باستخدام MediaInfo (مكتبة ممتازة ، راجع للشغل) ولكن أنا عالقة على FFmpeg الآن.

من ما قرأته ، ما تحتاج إلى استخدامه هو خيار vfilter . وفقا لما أراه ، يجب أن تبدو كما يلي:

ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4

ومع ذلك ، لا أستطيع الحصول على هذا العمل. أولاً ، لم تعد الفلاتر موجودة ، إنها الآن -vf . ثانيًا ، أحصل على هذا الخطأ:

No such filter: 'rotate'
Error opening filters!

بقدر ما أعرف ، لدي كل الخيارات على بناء FFmpeg. تشغيل ffmpeg -filters يعرض هذا:

Filters:
anull            Pass the source unchanged to the output.
aspect           Set the frame aspect ratio.
crop             Crop the input video to x:y:width:height.
fifo             Buffer input images and send them when they are requested.
format           Convert the input video to one of the specified pixel formats.
hflip            Horizontally flip the input video.
noformat         Force libavfilter not to use any of the specified pixel formats
 for the input to the next filter.
null             Pass the source unchanged to the output.
pad              Pad input image to width:height[:x:y[:color]] (default x and y:
 0, default color: black).
pixdesctest      Test pixel format definitions.
pixelaspect      Set the pixel aspect ratio.
scale            Scale the input video to width:height size and/or convert the i
mage format.
slicify          Pass the images of input video on to next video filter as multi
ple slices.
unsharp          Sharpen or blur the input video.
vflip            Flip the input video vertically.
buffer           Buffer video frames, and make them accessible to the filterchai
n.
color            Provide an uniformly colored input, syntax is: [color[:size[:ra
te]]]
nullsrc          Null video source, never return images.
nullsink         Do absolutely nothing with the input video.

وجود خيارات ل vflip و hflip كبيرة وكل شيء ، ولكنهم فقط لن يحصل لي حيث أحتاج للذهاب. أحتاج إلى القدرة على تدوير الفيديو 90 درجة على أقل تقدير. 270 درجة سيكون خيار ممتاز أن يكون كذلك. أين اختفت خيارات التدوير؟




لسوء الحظ ، فإن إصدار Ubuntu من ffmpeg يدعم مرشحات الفيديو.

تحتاج إلى استخدام avidemux أو محرر آخر لتحقيق نفس التأثير.

بطريقة برمجية ، وقد تم الموصى بها Mencoder.




لتدوير الصورة في اتجاه عقارب الساعة يمكنك استخدام مرشح التدوير ، مشيرا إلى وجود زاوية إيجابية في راديان. مع 90 درجة متساوية مع PI / 2 ، يمكنك القيام بذلك على النحو التالي:

ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4

لعكس اتجاه عقارب الساعة يجب أن تكون الزاوية سالبة

ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4

سيعمل مرشح الترانزستورات بشكل جيد على 90 درجة ، ولكن بالنسبة للزوايا الأخرى يكون هذا الخيار أسرع أو فقط.




هذا البرنامج النصي الذي سيتم إخراج الملفات مع بنية الدليل تحت "fixedFiles". في الوقت الحالي يتم إصلاح ملفات MOV وسيتم تنفيذ عدد من التحويلات بناءً على "الدوران" الأصلي للفيديو. يعمل مع مقاطع الفيديو التي تم التقاطها بنظام iOS على جهاز Mac يعمل بنظام التشغيل Mavericks ، ولكن يجب أن يكون قابلاً للتصدير بسهولة. يعتمد على تثبيت كل من exiftool و 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



لقد عثرت على هذه الصفحة أثناء البحث عن نفس الإجابة. لقد مضى الآن ستة أشهر منذ طلب ذلك في الأصل وتم تحديث البنايات عدة مرات منذ ذلك الحين. ومع ذلك ، أردت إضافة إجابة لأي شخص آخر يأتي هنا للبحث عن هذه المعلومات.

أستخدم إصدار Debian Squeeze و FFmpeg من تلك المستودعات.

توضح صفحة MAN لـ ffmpeg الاستخدام التالي

ffmpeg -i inputfile.mpg -vf "transpose=1" outputfile.mpg

المفتاح هو أنك لا تستخدم متغير درجة ، ولكن متغير محدد مسبقا من صفحة MAN.

0=90CounterCLockwise and Vertical Flip  (default) 
1=90Clockwise 
2=90CounterClockwise 
3=90Clockwise and Vertical Flip