Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用FFmpeg旋转视频_Ffmpeg_Rotation_Video Processing - Fatal编程技术网

使用FFmpeg旋转视频

使用FFmpeg旋转视频,ffmpeg,rotation,video-processing,Ffmpeg,Rotation,Video Processing,我一直在想如何用FFmpeg旋转视频。我正在处理以肖像模式拍摄的iPhone视频。我知道如何使用(极好的库,顺便说一句)确定当前的旋转度,但我现在仍停留在FFmpeg上 据我所知,您需要使用的是vfilter选项。据我所见,应该是这样的: ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4 然而,我不能让它工作。首先,-vfilters不再存在,它现在只是-vf。其次,我得到了这个错误: No such filter: 'rotate' E

我一直在想如何用FFmpeg旋转视频。我正在处理以肖像模式拍摄的iPhone视频。我知道如何使用(极好的库,顺便说一句)确定当前的旋转度,但我现在仍停留在FFmpeg上

据我所知,您需要使用的是vfilter选项。据我所见,应该是这样的:

ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4
然而,我不能让它工作。首先,-vfilters不再存在,它现在只是-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.
拥有vfliphflip的选项非常棒,但它们无法让我达到我需要的目的。我需要的能力,旋转视频至少90度。270度也是一个很好的选择。旋转选项到哪里去了?

你试过了吗?喜欢(从另一个答案)

如果您使用的是旧版本,那么如果您想使用转置功能,就必须更新ffmpeg,因为它是在2011年10月添加的


FFmpeg页面提供了可以直接执行的静态构建,而无需编译它们。

我在搜索相同答案时遇到了此页面。从最初提出这个问题到现在已经六个月了,自那时以来,构建已经更新了很多次。然而,我想为任何其他在这里寻找这些信息的人添加一个答案

我正在使用这些存储库中的Debian压缩和FFmpeg版本

ffmpeg的手册页说明了以下用途

ffmpeg -i inputfile.mpg -vf "transpose=1" outputfile.mpg
关键是您不需要使用度数变量,而是要使用手册页中预定义的设置变量

0=90CounterCLockwise and Vertical Flip  (default) 
1=90Clockwise 
2=90CounterClockwise 
3=90Clockwise and Vertical Flip
不起作用,即使是最新的来源

必须更改顺序:

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

工作正常

不幸的是,Ubuntu版本的ffmpeg确实支持视频过滤器

您需要使用avidemux或其他编辑器来实现相同的效果

以编程方式,建议使用mencoder。

顺时针旋转90:

ffmpeg -i in.mov -vf "transpose=1" out.mov
对于转置参数,可以传递:

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
)或查看是否需要VBR选项

解决方案也是使用此错误。

如果您遇到“编解码器是实验性的,但实验性编解码器未启用”错误,请使用此错误:

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

发生在我身上的一些带有aac音频的.mov文件。

亚历克西的回答几乎对我有用,只是我遇到了以下错误:

No such filter: 'rotate'
Error opening filters!
MPEG 4标准不支持时基1/90000,最大 时基分母的允许值为65535

我只需要在命令中添加一个参数(-r 65535/2733),它就可以工作了。因此,全权指挥是:

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

此脚本将使用“fixedFiles”下的目录结构输出文件。目前已固定为MOV文件,并将根据视频的原始“旋转”执行许多变换。可在运行Mavericks的Mac上使用iOS捕获的视频,但应易于导出。依赖于同时安装了exiftoolffmpeg

#!/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
#/bin/bash
#旋转90度。必须连接。
#ffmpeg-i-metadata:s:v:0 rotate=0-vf“transpose=1”
#/VLC-I虚拟-vvv-sout='#转码{width=1280,vcodec=mp4v,vb=16384,vfilter={canvas{width=1280,height=1280}:rotate{angle=-90}}}:std{access=file,mux=mp4,dst=}vlc://quit
#允许在文件名中使用空格
SAVEIFS=$IFS
IFS=$(echo-en“\n\b”)
#比特率
BR=16384
#在哪里存储固定文件
已修复文件\u DIR=“fixedFiles”
#rm-rf$已修复\u文件\u目录
mkdir$FIXED_FILES_DIR
#VLC
VLC_START=“/Applications/VLC.app/Contents/MacOS/VLC-I dummy-vvv”
VLC_端=”vlc://quit"
#############################################
#MOV在错误方向上的处理
对于f in`find-正则表达式'\./.*\.MOV'`
做
旋转=`exiftool“$f”|格雷普旋转|切割-c 35-38`
SHORT|u DIMENSION=`exiftool“$f”| grep“图像大小”|剪切-c 39-43 | sed's/x/'`
比特率INT=`exiftool“$f”| grep“平均比特率”| cut-c 35-38 | sed's/\..*/'`
回显短维度[$Short\u dimension]$BITRATE\u INT
如果测试“$旋转”!=""; 然后
DEST=$(dirname${f})
echo“在目录$DEST中使用旋转$rotation处理$f”
mkdir-p$FIXED\u FILES\u DIR/“$DEST”
如果测试“$旋转”==“0”;然后
cp“$f”“$FIXED\u FILES\u DIR/$f”
elif测试“$旋转”=“180”;然后
#$(eval$VLC_START\“$f\”--sout=“\””{vfilter={rotate{angle=-“$ROTATION”},vcodec=mp4v,vb=$BR}:std{access=file,mux=mp4,dst=\“$FIXED\u FILES\u DIR/$f”}'$VLC\END)
$(eval ffmpeg-i\“$f\”-vf hflip,vflip-r30-元数据:s:v:0 rotate=0-b:v“$BITRATE\u INT”M-vcodec libx264-acodec copy\“$FIXED\u FILES\u DIR/$f\”)
elif测试“$ROTATION”=“270”;然后
$(eval ffmpeg-i\“$f\”-vf“scale=$SHORT\u DIMENSION:-1,transpose=2,pad=$SHORT\u DIMENSION:$SHORT\u DIMENSION:\(ow iw\)/2:0“-r 30-s”$SHORT\u DIMENSION“x”$SHORT\u DIMENSION”-元数据:s:v:0旋转=0-b:v“$BITRATE\u INT”M-vcodec libx264-acodec copy\“$FIXED\u FILES\u DIR/$f\”)
其他的
#$(eval$VLC\u START\“$f\”--sout=“\””{scale=1,width=$SHORT\u DIMENSION,vcodec=mp4v,vb=$BR,vfilter={canvas{width=$SHORT\u DIMENSION,height=$SHORT\u DIMENSION}:rotate{angle=-“$ROTATION”}}}:std{access=file,mux=mp4,dst=\\'$FIXED\u FILES\u-DIR f/$f'''$VLC\END)
echo ffmpeg-i\“$f\”-vf“缩放=$SHORT\U维度:-1,转置=1,pad=$SHORT\U维度:$SHORT\U维度:\(ow iw\)/2:0“-r 30-s”$SHORT\U维度“x”$SHORT\U维度”-元数据:s:v:0旋转=0-b:
#!/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 -i in.mp4 -vf "rotate=PI/2" out.mp4
ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4
ffmpeg -i input.m4v -map_metadata 0 -metadata:s:v rotate="90" -codec copy output.m4v
v4l2-ctl -L
               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
v4l2-ctl --set-ctrl horizontal_flip=1
v4l2-ctl --set-ctrl vertical_flip=1
ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -vcodec libx264 -f mpegts input.mp4
 ffmpeg -i "path_source_video.mp4" -filter:v "transpose=1" "path_output_video.mp4"
 ffmpeg -i "path_source_video.mp4" -filter:v "transpose=0,transpose=1,transpose=0" -acodec copy "path_output_video.mp4"
ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=270 output.mp4
ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile