การหมุนวิดีโอด้วย FFmpeg


417

ฉันพยายามหาวิธีหมุนวิดีโอด้วย FFmpeg ฉันทำงานกับวิดีโอ iPhone ที่ถ่ายในโหมดแนวตั้ง ฉันรู้วิธีกำหนดองศาการหมุนปัจจุบันโดยใช้MediaInfo (ไลบรารียอดเยี่ยม btw) แต่ตอนนี้ฉันติดอยู่ที่ FFmpeg

จากสิ่งที่ฉันอ่านสิ่งที่คุณต้องใช้คือตัวเลือกvfilter ตามที่ฉันเห็นมันควรมีลักษณะเช่นนี้:

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

อย่างไรก็ตามฉันไม่สามารถใช้งานได้ ครั้งแรก-vfiltersไม่อยู่อีกต่อไปก็ตอนนี้เพียงแค่-vf ประการที่สองฉันได้รับข้อผิดพลาดนี้:

No such filter: 'rotate'
Error opening filters!

เท่าที่ฉันรู้ฉันมีตัวเลือกทั้งหมดของ build ของ 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 องศาจะเป็นตัวเลือกที่ยอดเยี่ยมที่จะมีเช่นกัน ตัวเลือกการหมุนหายไปไหน


อัปเดตคำตอบของฉัน ดูเหมือนว่าตัวกรองนั้นเพิ่งถูกเพิ่มไปยังแหล่งที่มาเมื่อเดือนที่แล้ว
rwilliams

76
สำหรับใครก็ตามที่กำลังมองหาการหมุน 180 องศา:-vf "vflip,hflip"
OrangeDog

4
ฉันสงสัยว่าถ้าสิ่งนี้สามารถทำได้โดยไม่ต้องถอดรหัสแล้วเข้ารหัสวิดีโออีกครั้ง - วิธีที่ jpegtran สามารถหมุนภาพ JPEG ได้โดยไม่สูญเสีย ...
Mikhail T.

2
ดูที่นี่สำหรับธงการหมุน: stackoverflow.com/questions/15335073/…
Davor Josipovic

1
ฉันเพิ่งอัปโหลดวิดีโอที่หมุนรอบ 180 °ด้วย "transpose = 1, transpose = 1" ไปยัง vimeo แม้ว่าฉันจะสามารถเล่นวิดีโอที่หมุนแล้วมันถูกปฏิเสธโดย vimeo @ แนวทางของ OrangeDog นั้น-vf "vflip,hflip"ทำงานได้อย่างมีเสน่ห์
เบซี

คำตอบ:


682

หมุนตามเข็มนาฬิกา 90:

ffmpeg -i in.mov -vf "transpose=1" out.mov

สำหรับพารามิเตอร์ transpose คุณสามารถผ่าน:

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

ใช้-vf "transpose=2,transpose=2"180 องศา

ตรวจสอบให้แน่ใจว่าคุณใช้ ffmpeg รุ่นล่าสุดจากที่นี่ (บิลด์สแตติกจะทำงานได้ดี)

โปรดทราบว่าสิ่งนี้จะเข้ารหัสส่วนเสียงและวิดีโออีกครั้ง โดยปกติคุณสามารถคัดลอกเสียงโดยไม่ต้องสัมผัสโดยใช้-c:a copyคุณมักจะสามารถคัดลอกเสียงโดยไม่ต้องสัมผัสได้โดยใช้หากต้องการเปลี่ยนคุณภาพวิดีโอให้ตั้งค่าบิตเรต (ตัวอย่างเช่น-b:v 1M) หรือดูคู่มือการเข้ารหัส H.264หากคุณต้องการตัวเลือก VBR

วิธีแก้ไขคือใช้สคริปต์อำนวยความสะดวกนี้


8
วิดีโอจะยังมีข้อมูลปฐมนิเทศดังนั้นตอนนี้วิดีโอจะถูกแก้ไขบน iphone
srcspider

25
เมื่อผมใช้คำสั่งนี้ผมได้รับสัญญาณวิดีโอที่มีคุณภาพต่ำเว้นแต่ - เท่าที่ฉันเพิ่งค้นพบ - -vcodec libx264ฉันใช้พารามิเตอร์นี้เช่นกัน: แต่มันจะดีถ้าฉันไม่ต้องการค้นหาการเข้ารหัสที่จะใช้เพราะ ffmpeg ควรรู้แล้ว ข้อเสนอแนะใด ๆ
Sadi

8
ในบรรทัดเดียวกันกับ Sadi มีวิธี "คัดลอก" คุณภาพของวิดีโอต้นฉบับหรือไม่
Alec Jacobson

58
สำหรับ 180 คุณสามารถใช้-vf "transpose=2,transpose=2"
Alex Pliutau

23
เอกสารปัจจุบันทราบว่า "ค่าตัวเลขเลิกใช้แล้วและควรถูกทิ้งไว้ในค่าคงที่เชิงสัญลักษณ์" ffmpeg.org/ffmpeg-filters.html#transposeดังนั้นcclock_flip, clock, cclockหรือclock_flipแทน0, 1, หรือ2 3
l --marc l

149

หากคุณไม่ต้องการเข้ารหัสวิดีโออีกครั้งและเครื่องเล่นของคุณสามารถจัดการข้อมูลเมตาการหมุนได้คุณสามารถเปลี่ยนการหมุนในเมทาดาทาโดยใช้ ffmpeg:

ffmpeg -i input.m4v -metadata:s:v rotate="90" -codec copy output.m4v

11
ตรวจสอบเมตาดาต้าหมุนได้ก่อนด้วยffmpeg -i input.m4v 2>&1 | grep rotate
lidaobing

60
นี่คือคำตอบที่ดีที่สุด แต่มีการปรับปรุงเล็กน้อยที่ต้องทำ เพื่อหลีกเลี่ยงการสูญเสียข้อมูลเมตาที่เหลือ (เช่นวันที่กล้อง) ffmpeg -i input.m4v -map_metadata 0 -metadata:s:v rotate="90" -codec copy output.m4vบนทำวิดีโอ วิธีนี้เมทาดาทาส่วนกลางทั้งหมดในไฟล์อินพุตจะถูกคัดลอกเป็นเมทาดาทาส่วนกลางไปยังไฟล์เอาต์พุตและเฉพาะเมตาดาต้าการหมุนเท่านั้นที่มีการเปลี่ยนแปลง
โยกย้าย

11
หากคุณมีวิดีโอภาพโหมดและเพียงแค่ต้องการที่จะ "สหประชาชาติหมุน" มันจะมีมาตรฐาน 1920x1080 rotate=0แล้วคุณอาจต้องการ
mivk

1
พยายาม-metadata:s:v rotate="180"ไม่ทำงาน มันควรจะทำงานเหรอ
Ondra Žižka

7
IMHO ทางออกที่ดีที่สุดเพราะไม่จำเป็นต้องมีการเข้ารหัสซ้ำและเครื่องเล่นวิดีโอส่วนใหญ่รองรับการหมุนเมตาดาต้า นอกจากนี้บริการคลาวด์เช่น Google Photos อย่างไรก็ตามโปรดจำไว้ว่า ffmpeg ไม่จำเป็นต้องคัดลอกข้อมูลเมตาทั้งหมดจากไฟล์ต้นฉบับ! ดังนั้นฉันขอแนะนำให้ระบุอย่างชัดเจนเพื่อคัดลอกข้อมูลเมตาอื่น ๆ ทั้งหมดจากไฟล์ต้นฉบับ:ffmpeg -i input.mp4 -codec copy -map_metadata 0 -metadata:s:v:0 rotate=0 output.mp4
Andreas

83

คุณเคยลองแล้วtransposeหรือยัง? กดไลค์ (จากคำตอบอื่น ๆ )

 ffmpeg -i input -vf transpose=2 output

หากคุณใช้เวอร์ชั่นเก่าคุณต้องอัปเดต ffmpeg หากคุณต้องการใช้คุณสมบัติการแปลงข้อมูลตามที่เพิ่มเข้ามาในเดือนตุลาคม 2554

หน้าดาวน์โหลด FFmpeg เสนอการสร้างแบบคงที่ที่คุณสามารถดำเนินการโดยตรงโดยไม่ต้องรวบรวม


1
ไม่ฉันไม่มี. ฉันไม่รู้ว่ามันมีอยู่จริง ฉันจะให้นัดนั้น
jocull

ดูเหมือนว่าตัวกรอง transpose จะไม่มีอยู่ในการสร้าง FFmpeg ใด ๆ ของฉัน ฉันควรจะเพิ่มมันยังไง?
jocull

ในเวอร์ชันของเอกสารตั้งแต่ 2011-05-15 ลิงก์ที่ถูกต้องคือตอนนี้ffmpeg.org/ffmpeg-doc.html#SEC93
Peter Hansen

6
รู้สึกเหมือนฉันถูกลงโทษเพราะเสนอคำตอบที่มีประโยชน์ 1.5 ปีก่อนคำตอบที่ยอมรับ
rwilliams

1
@JonasB คั่นตัวกรองด้วยเครื่องหมายจุลภาค ดูstackoverflow.com/questions/6195872/…
rwilliams

19

ฉันเจอหน้านี้ในขณะที่ค้นหาคำตอบเดียวกัน ตอนนี้เป็นเวลาหกเดือนนับตั้งแต่เริ่มมีการถามและการสร้างได้รับการปรับปรุงหลายครั้งตั้งแต่นั้นมา อย่างไรก็ตามฉันต้องการเพิ่มคำตอบสำหรับคนอื่น ๆ ที่มาที่นี่เพื่อค้นหาข้อมูลนี้

ฉันใช้รุ่น 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

ขอบคุณสำหรับข้อมูล! ฉันไม่สามารถทำงานนี้ได้จริงเพราะโดยทั่วไปฉันมีปัญหาในการสร้างแหล่งที่มา ฉันอาจดูว่าฉันสามารถทำให้มันทำงานอีกครั้งตอนนี้
jocull

transpose = 3 ทำให้ภาพเป็นภาพสะท้อน
Daniel Kobe

transpose = 2 ทำงานโดยไม่ทำมิเรอร์วิดีโอวิดีโอที่หมุนได้ 270 ของฉัน
Daniel Kobe

17

ในการหมุนภาพตามเข็มนาฬิกาคุณสามารถใช้ฟิลเตอร์หมุนเพื่อระบุมุมบวกเป็นเรเดียน ด้วย 90 องศาที่เท่ากับ PI / 2 คุณสามารถทำได้ดังนี้:

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

สำหรับทวนเข็มนาฬิกามุมจะต้องเป็นลบ

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

ตัวกรองขนย้ายจะทำงานได้ดีอย่างเท่าเทียมกันสำหรับ 90 องศา แต่สำหรับมุมอื่น ๆ นี่เป็นตัวเลือกที่เร็วกว่าหรือเป็นทางเลือกเดียว


2
มันเยี่ยมมาก ฉันพบว่าเป็นไปได้ที่จะได้ความละเอียดเรเดียนที่ละเอียดกว่าเนื่องจาก*มีการคูณ: ffmpeg -i in.avi -vf "rotate=-8*PI/40" -q 1 out.avi (การหมุนน้อยกว่า -PI / 4 = -10 * PI / 40)
eqzx

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

จะไม่ทำงานแม้จะมีแหล่งข้อมูลล่าสุด ...

ต้องเปลี่ยนลำดับ:

ffmpeg -i input.mp4 -vf vflip output.mp4

ทำงานได้ดี


เพราะคุณกำลังใช้ตัวกรองกับไฟล์ที่ไม่ถูกต้อง ... ลอง ffmpeg -i input.mp4 -vf "หมุน = 90" output.mp4 จากนั้นมันจะใช้งานได้
patrick

2
"หมุนวิดีโอตามมุมโดยพลการที่แสดงเป็นเรเดียน " เอกสารประกอบ: ffmpeg.org/ffmpeg-filters.html#rotateดังนั้นเรเดียนrotate=PI/2หรือrotate=90*PI/180จำเป็นต้องใช้
l --marc l

นี่คือสิ่งที่ยอดเยี่ยม
Tessaracter

7

หากคุณได้รับข้อผิดพลาด "ตัวแปลงสัญญาณเป็นแบบทดสอบ แต่ไม่ได้เปิดใช้งานตัวแปลงสัญญาณรุ่นทดลอง" ให้ใช้สิ่งนี้:

ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile

เกิดขึ้นกับฉันสำหรับไฟล์. mov บางไฟล์ที่มี aac audio


นี่เป็นเพียงตัวอย่างเดียวที่ทำงานได้สำหรับฉัน แต่คุณภาพแย่มากและปิดกั้นมาก นอกจากนี้ยังลดขนาดวิดีโอ 1080x1920 เป็น 352x640 ฉันเดาว่าฉันไม่มีสวิตช์หรือสองตัว ข้อเสนอแนะใด ๆ
LOlliffe

1
@LOlliffe เพิ่ม-sameq
Andrew Schleifer

2
@AndrewSchleifer ขอบคุณ ฉันพยายามแล้ว แต่ ffmpeg โยนกลับมาที่ฉันOption 'sameq' was removed. If you are looking for an option to preserve the quality (which is not what -sameq was for), use -qscale 0 or an equivalent quality factor option. Failed to set value '1' for option 'sameq': Invalid argument -qscale ก็ทำให้เกิดข้อผิดพลาด Please use -q:a or -q:v, -qscale is ambiguousแต่ยังใช้งานได้
LOlliffe

3

สคริปต์นี้ที่จะส่งออกไฟล์ที่มีโครงสร้างไดเรกทอรีภายใต้ "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

2
อุ๊ย ... มันอาจใช้งานได้ แต่มันน่าเกลียดที่สุด ก่อนอื่นกฎทั่วไปของการเขียนโปรแกรมเชลล์: คุณไม่จำเป็นต้องมี grep, cut, awk หรือ sed มากกว่าหนึ่งอย่างในท่อ grep | cut | sed ใด ๆ สามารถทำได้ทั้งแบบ sed หรือ awk เพียงอย่างเดียว จากนั้นเฉพาะ exiftool สามารถถูกขอให้ส่งออกเฉพาะแท็กที่คุณต้องการ - ดังนั้นแทนที่จะกรองการหมุนเพียงแค่ "exiftool -Rotation" ประการที่สามคุณไม่จำเป็นต้องมี "evals" จำนวนมากและ "if test ... " ของคุณควรถูกแทนที่ด้วย case $ ROTATION ใน - สำหรับทั้งการอ่านและประสิทธิภาพ โชคดี!
มิคาอิลต.

ไม่มีลูกเต๋า: [Parsed_pad_2 @ 0x7f8b15c3a580] Input area -420:0:1500:1080 not within the padded area 0:0:1080:1080 or zero-sized\ n ` [Parsed_pad_2 @ 0x7f8b15c3a580] Failed to configure input pad on Parsed_pad_2\ n Error reinitializing filters!\ n Failed to inject frame into filter network: Invalid argument\ n Error while processing the decoded data for stream #0:0\ nConversion failed!
slipp D. ธ อมป์สัน

2

คำตอบของ Alexy เกือบจะได้ผลสำหรับฉันยกเว้นว่าฉันได้รับข้อผิดพลาดนี้:

timebase 1/90000 ไม่รองรับมาตรฐาน MPEG 4 ค่าสูงสุดที่ยอมรับสำหรับตัวหารฐานเวลาคือ 65535

ฉันแค่ต้องเพิ่มพารามิเตอร์ (-r 65535/2733) ไปยังคำสั่งและใช้งานได้ คำสั่งเต็มจึง:

ffmpeg -i in.mp4 -vf "transpose=1" -r 65535/2733 out.mp4

หากคุณกำลังมองหาอัตราเฟรม "NTSC-film" 24000/1001จะมีความแม่นยำมากขึ้น
Reino

2

โซลูชันเพิ่มเติมด้วยแนวทางที่แตกต่างจากโซลูชันที่กล่าวถึงล่าสุดคือการตรวจสอบว่าไดรเวอร์กล้องของคุณรองรับการควบคุมกล้อง v4l2 หรือไม่ (ซึ่งเป็นเรื่องปกติมาก)
ในเทอร์มินัลเพียงพิมพ์:

v4l2-ctl -L

หากไดรเวอร์กล้องของคุณรองรับการควบคุมกล้อง v4l2 คุณควรได้รับสิ่งนี้ (รายการด้านล่างขึ้นอยู่กับการควบคุมที่ไดรเวอร์กล้องของคุณรองรับ):

               contrast (int)    : min=0 max=255 step=1 default=0 value=0 flags=slider
             saturation (int)    : min=0 max=255 step=1 default=64 value=64 flags=slider
                    hue (int)    : min=0 max=359 step=1 default=0 value=0 flags=slider
white_balance_automatic (bool)   : default=1 value=1 flags=update
            red_balance (int)    : min=0 max=4095 step=1 default=0 value=128 flags=inactive, slider
           blue_balance (int)    : min=0 max=4095 step=1 default=0 value=128 flags=inactive, slider
               exposure (int)    : min=0 max=65535 step=1 default=0 value=885 flags=inactive, volatile
         gain_automatic (bool)   : default=1 value=1 flags=update
                   gain (int)    : min=0 max=1023 step=1 default=0 value=32 flags=inactive, volatile
        horizontal_flip (bool)   : default=0 value=0
          vertical_flip (bool)   : default=0 value=0

และถ้าคุณโชคดีที่จะสนับสนุนการhorizontal_flipและvertical_flip
สิ่งที่คุณต้องทำคือตั้งค่าhorizontal_flipโดย:

v4l2-ctl --set-ctrl horizontal_flip=1

หรือvertical_flipโดย:

v4l2-ctl --set-ctrl vertical_flip=1

จากนั้นคุณสามารถโทรหาอุปกรณ์วิดีโอของคุณเพื่อจับภาพวิดีโอใหม่ (ดูตัวอย่างด้านล่าง) และวิดีโอจะหมุน / พลิก

ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -vcodec libx264 -f mpegts input.mp4

แน่นอนว่าหากคุณต้องการประมวลผลวิดีโอที่มีอยู่แล้วกว่าวิธีนี้ไม่ใช่วิธีที่คุณต้องการ

ข้อได้เปรียบในวิธีการนี้คือเราพลิกภาพในระดับเซ็นเซอร์ดังนั้นเซ็นเซอร์ของคนขับทำให้เราพลิกภาพแล้วและนั่นเป็นการบันทึกแอปพลิเคชัน (เช่น FFmpeg) การประมวลผลเพิ่มเติมและไม่จำเป็น


ข้อมูลที่ยอดเยี่ยมเกี่ยวกับ v4l2 ที่นี่ หมุนไปยังทิศทางที่ถูกต้องในเวลาที่บันทึกจะเห็นได้ชัดดีกว่า :) เกือบ 10 ปีนี้คำถามเดิม (ว้าว!) แต่เดิมถูกถามเกี่ยวกับวิดีโอถูกอัปโหลดจากอุปกรณ์ iOS ว่าจะช่วยให้บริบทใด ๆ :)
jocull

ฉันค่อนข้างใหม่ในชุมชนนี้และคำถามนี้เก่ากว่ามากแล้วตอนนี้รุ่นพี่ของฉัน ... ฉันคิดว่ามันเป็นคำถามที่ดี (และทั่วไป) ดังนั้นฉันเชื่อว่าคำถามเก่านี้จะช่วยผู้ใช้ FFmpeg จำนวนมาก
JM

1

น่าเสียดายที่ ffmpeg รุ่น Ubuntu นั้นรองรับวิดีโอเทป

คุณต้องใช้ avidemux หรือโปรแกรมแก้ไขอื่น ๆ เพื่อให้ได้ผลเหมือนกัน

ในทางโปรแกรม mencoder ได้รับการแนะนำ


1
คุณหมายถึง "ffmpeg เวอร์ชั่นอูบุนตูไม่รองรับวิดีโอเทป" หรือไม่?
user1438038

2
FYI: "FFmpeg ได้กลับมาใน Ubuntu 15.04 Vivid Vervet" หรือสามารถรวบรวมได้สำหรับ Ubuntu -> trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
l --marc l

avconv ทำ (ใน 14.04) และดูเหมือนว่าจะทำงานเหมือนกันทุกประการ (แต่สำหรับรุ่นต่อมาให้ใช้ FFmpeg แน่นอน)
SilverWolf - Reinstate Monica

1

สมาร์ทโฟน: บันทึกวิดีโอในรูปแบบแนวตั้ง

ต้องการที่จะส่งไปยังเว็บไซด์มันเป็น 90 °ไปทางซ้าย (ต่อต้านตามเข็มนาฬิกา, รูปแบบแนวนอน) hmm

ffmpeg -i input.mp4 -vf "rotate=0" output.mp4

ทำมัน. ฉันได้รูปแบบแนวตั้งกลับมาอีกครั้ง

เดเบียนบัสเตอร์: ffmpeg --version รุ่น ffmpeg 4.1.4-1 ~ deb10u1 ลิขสิทธิ์ (c) 2000-2019 นักพัฒนา FFmpeg

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.