目录

FFmpeg

  • 格式转换 -y(覆盖输出文件)
    ffmpeg -y -i input.mp4 output.avi
    
  • 生成gif(低质量) -pix_fmt(像素格式) -s(设置帧大小WxH)
    ffmpeg -y -i input.mp4 -pix_fmt rgb8 -r 10 -s 320x240 output.gif
    ffmpeg -y -i input.mp4 -pix_fmt rgb8 -r 10 -vf 'scale=320:-1' output.gif
    
  • 生成gif(高质量) -ss(开始时间偏移) -t(持续时间)
    ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
    ffmpeg -y -ss 5 -t 5 -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
    
  • 每秒抽取一张图片 -r(设置帧速率)
    ffmpeg -i input.mp4 -r 1 -s 1024x768 -f image2 input-%03d.jpeg
    
  • 抽取关键帧(IPB)图片
    ffmpeg -y -vsync 0 -i input.mp4 -vf select='eq(pict_type\,I)' -f image2 I-input-%03d.jpeg
    ffmpeg -y -vsync 0 -i input.mp4 -vf select='eq(pict_type\,P)' -f image2 P-input-%03d.jpeg
    ffmpeg -y -vsync 0 -i input.mp4 -vf select='eq(pict_type\,B)' -f image2 B-input-%03d.jpeg
    
ffmpeg -y -vsync 0 -i input.mts -vf "select='eq(pict_type,PICT_TYPE_I)'" -f image2 I-input-%03d.jpeg
ffmpeg -y -vsync 0 -i input.mts -vf "select='eq(pict_type,PICT_TYPE_P)'" -f image2 P-input-%03d.jpeg
ffmpeg -y -vsync 0 -i input.mts -vf "select='eq(pict_type,PICT_TYPE_B)'" -f image2 B-input-%03d.jpeg
  • 从多个视频文件中抽取关键帧
    for file in *.mp4
    do
      fname=`basename $file`
      filename=${fname%%.*}
      extname=${fname##*.}
      ffmpeg -y -vsync 0 -i $file -vf select='eq(pict_type\,I)' -f image2 i-$filename-%03d.jpeg;
    done
    
for file in *.jpg; do fname=`basename $file`; filename=${fname%%.*}; extname=${fname##*.}; ffmpeg -y -vsync 0 -i $file -vf select='eq(pict_type\,I)' -f image2 i-$filename-%03d.jpeg; done
  • 使用一组图片生成视频
    ffmpeg -f image2 -framerate 3 -i input-%03d.jpeg -s 1024x768 input.avi
    

NVIDIA GPU 加速

  • 格式转换
    ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4
    
  • 缩放
    ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 \
      -vf scale_npp=1920:1080 -c:a copy -c:v h264_nvenc -b:v 5M output-1080p.mp4 \
      -vf scale_npp=1280:720 -c:a copy -c:v h264_nvenc -b:v 8M output-720p.mp4
    
  • GPU解码视频,CPU抽取图片。
    ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -vf "hwdownload,format=nv12" -r 1 input-%03d.jpeg
    ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -vf "scale_npp=format=yuv420p,hwdownload,format=yuv420p" -r 1 input-%03d.jpeg
    

FFmpeg容器

Alpine

  • 使用
    docker run --rm -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:4.3-alpine 参数
    
  • 例子:抽取关键帧
    docker run --rm -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:4.3-alpine \
      -y -vsync 0 -i input.mp4 -vf select='eq(pict_type\,I)' \
      -f image2 I-input-%03d.jpeg
    

NVIDIA

  • 使用
    docker run --rm --runtime nvidia -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:4.3-nvidia 参数
    
  • 例子:格式转换
    docker run --rm --runtime nvidia -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:4.3-nvidia \
      -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda \
      -i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4
    

参考资料