命令ffmpeg
类别: Command 标签: Linux ffmpeg GPU NVIDIA for basename目录
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
参考资料
- FFmpeg
- ffmpeg Documentation
- Using FFmpeg with NVIDIA GPU Hardware Acceleration
- FFmpeg Docker image
- ffmpeg hwaccel options
- 分辨率、帧速率、比特率、视频格式的关系
- FFmpeg硬解码
- How to extract a video frame using NVIDIA card
- Extract key frame from video with ffmpeg
- THUMBNAILS (IFRAME / SCENE CHANGE) - 2020
- Key Frame Extraction From Video
- How to extract all key frames from a video clip?
- Trying to do keyframes for a list of videos in a folder
- How to use GPU to accelerate the processing speed of ffmpeg filter?
- Hands-On-FFMPEG
- ffmpeg save images with frame type
- How do I convert a video to GIF using ffmpeg, with reasonable quality?
- High quality GIF with FFmpeg
- Extract filename and extension in Bash
- 【FFMPE系列】之FFMPEG常用命令