ffmpeg的使用记录
首先FFmpeg 是一款开源、免费、跨平台的音视频处理工具集。无论你用过的什么音视频处理工具,大概都有FFmpeg的“成分”在,说一句万物基于FFmpeg也不为过。以下,是我在macOS平台学习使用FFmpeg的简单记录。
一、FFmpeg 简介:不仅仅是转换器
许多人对 FFmpeg 的第一印象可能是一个视频格式转换器。的确,格式转换是 FFmpeg 的一个重要功能,但它的能力远不止于此。FFmpeg 实际上是一个包含了多个组件的工具集:
- ffmpeg: 核心命令行工具,用于处理音视频文件。
- ffplay: 一个简单的媒体播放器,基于 FFmpeg 和 SDL 库。
- ffprobe: 一个用于分析多媒体流信息的工具。
- libavcodec: 包含各种编码器和解码器的库。
- libavformat: 用于处理各种多媒体容器格式的库。
- libavutil: 包含各种实用函数的库,如哈希、加密等。
- libavfilter: 用于实现各种音视频滤镜的库。
- libswscale: 用于执行高度优化的图像缩放和色彩空间转换的库。
- libswresample: 用于执行高度优化的音频重采样、remixing 和采样格式转换的库。
这些组件的协同工作,使得 FFmpeg 成为一个功能极其强大的多媒体处理框架。
二、macOS安装FFmpeg
这里我选择使用homebrew进行安装:
- 安装 Homebrew(如果尚未安装):
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
- 安装 FFmpeg:
在终端中运行以下命令:
brew install ffmpeg
Homebrew 将自动下载并安装 FFmpeg 及其依赖项。
验证安装:
安装完成后,在终端中运行以下命令:ffmpeg -version
如果看到 FFmpeg 的版本信息,则表示安装成功。
三、FFmpeg 基本命令语法
FFmpeg 的命令通常遵循以下基本语法:
ffmpeg [全局选项] [输入文件选项] -i 输入文件 [输出文件选项] 输出文件
- ffmpeg: 命令本身。
- 全局选项: 影响整个 FFmpeg 行为的选项,如 -y(自动覆盖输出文件)。
- 输入文件选项: 针对输入文件的选项,如 -ss(指定起始时间)。
- -i 输入文件: 指定输入文件,-i 是 “input” 的缩写。
- 输出文件选项: 针对输出文件的选项,如 -c:v(指定视频编码器)。
- 输出文件: 指定输出文件名。
示例:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4
这个命令将 input.mp4 文件转换为 H.264 视频编码和 AAC 音频编码的 output.mp4 文件。
四、FFmpeg 常用命令及示例
下面介绍一些 FFmpeg 最常用的命令和示例,涵盖视频转换、剪辑、提取、合并、添加水印等方面。
- 视频格式转换
这是 FFmpeg 最基本的功能之一。
转换为 MP4 (H.264 + AAC):
ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4
转换为 WebM (VP9 + Opus):
ffmpeg -i input.mp4 -c:v libvpx-vp9 -c:a libopus output.webm
转换为 GIF:
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
这个命令稍微复杂一些,使用了滤镜来控制 GIF 的帧率、大小和调色板。
- 视频剪辑
从指定时间开始剪辑:
ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:20 output.mp4
这个命令从 input.mp4 的第 10 秒开始剪辑到第 20 秒。-ss 指定起始时间,-to 指定结束时间。
剪辑指定时长的片段:
ffmpeg -i input.mp4 -ss 00:01:00 -t 15 output.mp4
这个命令从input.mp4的第1分钟开始,截取15秒时长的片段
快速剪辑(无需重新编码):
ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:20 -c copy output.mp4
使用 -c copy 选项可以避免重新编码,剪辑速度非常快,但剪辑点可能不精确。
- 音视频提取
提取视频中的音频:
ffmpeg -i input.mp4 -vn -c:a copy output.aac
-vn 表示禁用视频,-c:a copy 表示直接复制音频流。
提取视频(无音频):
ffmpeg -i input.mp4 -an -c:v copy output.mp4
-an 表示禁用音频。
- 音视频合并
合并多个视频文件:
首先创建一个文本文件 mylist.txt,内容如下:
file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'
然后运行以下命令:
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4
-f concat 表示使用 concat 分离器,-safe 0 允许使用相对路径。
合并音视频:
ffmpeg -i video.mp4 -i audio.aac -c copy output.mp4
- 添加水印
添加图片水印:
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
-filter_complex 用于指定复杂的滤镜链。overlay=10:10 表示将水印放置在距离左上角 10 像素的位置。
添加文字水印:
ffmpeg -i input.mp4 -vf "drawtext=text='My Watermark':x=10:y=10:fontsize=24:fontcolor=white" output.mp4
drawtext 滤镜用于添加文字水印。可以自定义文字内容、位置、字体大小和颜色。
- 调整视频参数
改变视频分辨率:
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
scale 滤镜用于改变分辨率。
改变视频帧率:
ffmpeg -i input.mp4 -r 30 output.mp4
-r 选项用于设置帧率。
改变视频比特率
ffmpeg -i input.mp4 -b:v 2M output.mp4
-b:v选项用于设置视频比特率
改变音频采样率:
ffmpeg -i input.mp4 -ar 44100 output.mp4
-ar 选项用于设置音频采样率。
- 屏幕录制
FFmpeg 也可以用于屏幕录制。
ffmpeg -f avfoundation -i "1:0" -r 30 output.mp4
-f avfoundation指定使用avfoundation框架。-i "1:0"中的1代表屏幕索引,0代表麦克风索引。不同设备索引号可能不同。
要找到正确的屏幕和麦克风索引,可以使用以下命令列出所有可用的输入设备:
ffmpeg -f avfoundation -list_devices true -i ""
五、FFmpeg 高级应用
除了上述基本命令,FFmpeg 还有许多高级应用:
使用滤镜链 (filtergraph): FFmpeg 的滤镜系统非常强大,可以通过组合多个滤镜来实现复杂的效果,如画中画、色彩校正、锐化等。
硬件加速: FFmpeg 支持利用 GPU 进行硬件加速,可以显著提高编码速度。
流媒体推流: FFmpeg 可以将音视频流推送到流媒体服务器,如 RTMP、HLS 等。
多路复用和解复用: FFmpeg 可以处理各种复杂的容器格式,进行多路复用和解复用操作。
编写脚本: 可以将多个 FFmpeg 命令组合成脚本,实现自动化批量处理。
六、macOS 优雅地使用ffmpeg
建立自动操作
打开系统自带的“自动操作”->资源库->实用工具->运行Shell脚本:(如下图)
代码内容如下:
for f in "$@"
do
/opt/homebrew/bin/ffmpeg \
-i "$f" \
-c:v libx264 -crf 25 -r 20 -an \
-vf scale=360:-1 \
-preset slow \
"${f%.*}_压缩_360P.mp4"
done
根据上面学习的内容可知该命令为调用ffmpeg将传入(也就是你在访达中选择的视频文件)文件用libx264编码为“360x自动”尺寸的无音频(-an)mp4文件。
我的用途是将提前录制的竖屏视频压缩后用obs给腾讯会议用作参会人的摄像头,因些不需要声音且360p足够了。
用法
当然如果你想要调用硬解转码,可以这样写。
for f in "$@"
do
/opt/homebrew/bin/ffmpeg -hwaccel videotoolbox \
-i "$f" \
-c:v h264_videotoolbox \
-b:v 1000k \
-preset slow \
"${f%.*}_压缩GPU_H264.mp4"
done
不过效果很差,至少对于我用iphone拍的视频来说不果不是限制了1000k的低码率,反而会越压越大~!
调用方法
见下图
另外备注一下,这些脚本的文件位置是在:/Users/用户名/Library/Services
里面,后续直接改文件会更方便。
本文最后更新时间为 2025-04-14 13:18
本站仅用作个人记录,不交流、不讨论,留言板可以留言但无邮件回复。