菜鸟科技网

FFmpeg命令大全,常用命令有哪些?

FFmpeg 核心概念

在开始之前,了解 FFmpeg 的三个核心组件至关重要:

FFmpeg命令大全,常用命令有哪些?-图1
(图片来源网络,侵删)
  1. ffmpeg: 主命令行工具,用于处理音视频文件,它可以转换、编码、解码、转码、流式传输等。
  2. ffprobe: 分析工具,用于显示媒体文件的详细信息(如格式、编码、时长、比特率、帧率等)。
  3. ffplay: 简单的播放器,用于直接播放或测试音视频流。

基础命令

查看文件信息

使用 ffprobe 可以获取一个媒体文件的元数据。

# 查看视频文件的详细格式和流信息
ffprobe input.mp4
# 以人类可读的方式显示信息(推荐)
ffprobe -v error -show_format -show_streams input.mp4
# 只查看视频流的详细信息
ffprobe -v error -select_streams v:0 -show_streams input.mp4
# 将信息输出为 JSON 格式,方便脚本处理
ffprobe -v error -show_format -show_streams -of json input.mp4

格式转换与基本操作

这是最常见的用法,将一种格式的视频转换为另一种格式。

# 将 MP4 转换为 MKV (容器转换,不重新编码,速度最快)
ffmpeg -i input.mp4 -c copy output.mkv
# 将 AVI 转换为 MP4 (同样不重新编码)
ffmpeg -i input.avi -c copy output.mp4
# 将视频转换为 MP4 格式,并使用 H.264 编码和 AAC 音频
# 这是目前最通用的网络视频格式
ffmpeg -i input.mkv -c:v libx264 -c:a aac output.mp4

提取音频/视频

只从视频文件中提取音频或视频轨道。

# 提取音频为 MP3 格式
ffmpeg -i input.mp4 -vn -ab 192k output.mp3
# -vn: 禁用视频
# -ab 192k: 设置音频比特率为 192kbps
# 提取音频为 WAV (无损) 格式
ffmpeg -i input.mp4 -vn -acodec pcm_s16le output.wav
# 提取视频(无音频)
ffmpeg -i input.mp4 -an -c:v copy output_video_only.mp4
# -an: 禁用音频

截取视频片段

从视频的某个时间点开始,截取指定时长的片段。

FFmpeg命令大全,常用命令有哪些?-图2
(图片来源网络,侵删)
# 从第 30 秒开始,截取 10 秒的视频
ffmpeg -ss 00:00:30 -t 10 -i input.mp4 -c copy output.mp4
# -ss: 设置开始时间
# -t: 设置持续时间
# 截取从 1 分 10 秒到 1 分 30 秒的片段
ffmpeg -ss 00:01:10 -to 00:01:30 -i input.mp4 -c copy output.mp4
# -to: 设置结束时间

注意: -c copy 表示不重新编码,直接复制流,所以速度非常快,但如果你的截取点不是关键帧,可能会导致视频无法播放,如果遇到问题,可以去掉 -c copy,让 FFmpeg 重新编码,但速度会慢很多。


视频处理

调整视频尺寸

改变视频的分辨率。

# 将视频宽度调整为 640px,高度按比例自动调整
ffmpeg -i input.mp4 -vf "scale=640:-1" output.mp4
# -vf: video filter (视频过滤器) 的简写
# -1 表示高度自动按比例计算,避免变形
# 强制将视频调整为 640x480,可能导致画面变形
ffmpeg -i input.mp4 -vf "scale=640:480" output.mp4
# 将视频缩小到原来的 50%
ffmpeg -i input.mp4 -vf "scale=iw*0.5:ih*0.5" output.mp4
# iw: input width (输入宽度), ih: input height (输入高度)

修改帧率

改变视频的帧率。

# 将帧率从 30fps 降低到 15fps
ffmpeg -i input.mp4 -r 15 output.mp4
# 只降低输出视频的帧率,不改变原始编码
ffmpeg -i input.mp4 -c:v libx264 -r 15 output.mp4

旋转视频

将视频旋转 90、180 或 270 度。

FFmpeg命令大全,常用命令有哪些?-图3
(图片来源网络,侵删)
# 顺时针旋转 90 度
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
# 逆时针旋转 90 度
ffmpeg -i input.mp4 -vf "transpose=2" output.mp4
# 旋转 180 度
ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" output.mp4
# 或者
ffmpeg -i input.mp4 -vf "hflip,vflip" output.mp4

视频裁剪

从视频中裁剪出一个矩形区域。

# 从 (100,100) 坐标开始,裁剪一个 500x300 大小的区域
ffmpeg -i input.mp4 -vf "crop=500:300:100:100" output.mp4
# 语法: crop=width:height:x:y

视频速度调整

加速或慢放视频。

# 将视频速度加快 2 倍
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4
# -vf setpts=PTS*0.5: 将视频时间戳减半,实现快放
# -af atempo=2.0: 将音频速度加快 2 倍,避免音调变高
# 将视频速度减半(慢放)
ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" output.mp4

添加水印/图片叠加

在视频上添加图片或文字水印。

# 添加图片水印 (在右下角,距离边缘 10px)
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=main_w-overlay_w-10:main_h-overlay_h-10" output.mp4
# main_w: 主视频宽度, main_h: 主视频高度
# overlay_w: 水印宽度, overlay_h: 水印高度
# 添加文字水印
ffmpeg -i input.mp4 -vf "drawtext=text='FFmpeg Watermark':fontfile=/path/to/font.ttf:fontsize=24:fontcolor=white@0.8:x=10:y=10" output.mp4
# fontfile: 字体文件路径 (需要绝对路径)
# fontcolor: 颜色,支持 RGBA (白色@0.8 表示带80%透明度的白色)
# x, y: 文字位置

音频处理

调整音量

增大或减小音频音量。

# 音量增大一倍 (2.0)
ffmpeg -i input.mp4 -af "volume=2.0" output.mp4
# 音量减小一半 (0.5)
ffmpeg -i input.mp4 -af "volume=0.5" output.mp4
# 音量增加 3 分贝
ffmpeg -i input.mp4 -af "volume=1.413" output.mp4

转换音频格式

# 转换为 AAC 格式
ffmpeg -i input.wav -c:a aac output.aac
# 转换为 MP3 格式
ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3
# -q:a 2: 设置音频质量 (VBR),2 是较好的质量,0 是最好

录制系统音频/麦克风**

需要配合 pulseaudio (Linux) 或 CoreAudio (macOS) 使用。

# 在 Linux 上录制系统音频
ffmpeg -f pulse -i "alsa_output.pci-0000_00_1b.0.analog-stereo.monitor" output.wav
# 在 Linux 上录制麦克风
ffmpeg -f pulse -i "default" output.wav
# 在 macOS 上录制系统音频 (macOS 12+)
ffmpeg -f avfoundation -i "none:0" output.wav
# 在 macOS 上录制麦克风
ffmpeg -f avfoundation -i ":0" output.wav

高级与流媒体

码率控制

码率决定了视频文件大小和质量。

# 1. CBR (Constant Bitrate - 恒定码率)
# 适用于直播,码率恒定,但质量不均。
ffmpeg -i input.mp4 -b:v 1M -bufsize 2M -maxrate 1.5M -c:v libx264 output_cbr.mp4
# -b: 目标码率
# -bufsize: 缓冲区大小
# -maxrate: 最大码率
# 2. VBR (Variable Bitrate - 可变码率)
# 适用于点播,码率根据画面复杂度变化,质量更好。
# 使用 CRF (Constant Rate Factor) 是更推荐的方式。
# CRF 范围通常是 0-51,值越小质量越好,18-28 是常用范围。
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output_vbr.mp4
# -crf 23: 默认值,在文件大小和质量之间取得了很好的平衡
# 3. ABR (Average Bitrate - 平均码率)
# 设置一个平均目标码率,FFmpeg 会自动调整。
ffmpeg -i input.mp4 -b:v 1M -c:v libx264 output_abr.mp4

多码率自适应流

生成 DASH 或 HLS 格式,用于不同网络条件下的自适应播放。

# 生成 HLS (m3u8) 播放列表
# -hls_time 10: 每个切片 10 秒
# -hls_list_size 0: 列表包含所有切片
# -f hls: 输出 HLS 格式
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -f hls output.m3u8
# 生成 DASH 播放列表
# -f dash: 输出 DASH 格式
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f dash output.mpd

推送 RTMP 直播流

将本地视频文件或摄像头画面推送到 RTMP 服务器。

# 推送本地视频文件
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://live-server/live/stream_key
# 推送摄像头和麦克风
# -f v4l2: Linux 摄像头设备
# -f alsa: Linux 麦克风设备
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i default -c:v libx264 -c:a aac -f flv rtmp://live-server/live/stream_key
# -re: 以文件原始帧率读取,防止服务器过载

FFmpeg 命令结构解析

一个典型的 FFmpeg 命令通常遵循以下结构:

ffmpeg [全局选项] -i 输入文件 [输入选项] -f 输出格式 [输出选项] 输出文件
  • [全局选项]: 应用于整个命令,如 -y (覆盖输出文件)、-loglevel (日志级别)。
  • -i 输入文件: 指定输入源,可以是文件、摄像头、网络流等。
  • [输入选项]: 只应用于紧跟其后的输入文件,如 -ss 00:01:10 (从输入文件的 1 分 10 秒处开始)。
  • -f 输出格式: 指定输出格式,如 mp4, mkv, flv, hls
  • [输出选项]: 只应用于紧跟其后的输出文件,如 -c:v libx264 (使用 H.264 编码视频)。
  • 输出文件: 指定输出的文件名或 URL。

实用技巧与资源

  1. 批量处理 使用 for 循环来处理一个文件夹中的所有文件。

    # 将当前目录下所有 .mp4 文件转换为 .mkv
    for file in *.mp4; do
      ffmpeg -i "$file" -c copy "${file%.mp4}.mkv"
    done
  2. GPU 加速 如果你的电脑有 NVIDIA 或 AMD 显卡,可以使用硬件编码器来大幅提升转码速度。

    # NVIDIA (NVENC)
    ffmpeg -i input.mp4 -c:v h264_nvenc output.mp4
    # AMD (AMF/VCE)
    ffmpeg -i input.mp4 -c:v h264_amf output.mp4
  3. 查询支持的编解码器/格式

    # 查询所有支持的编解码器
    ffmpeg -codecs
    # 查询所有支持的格式
    ffmpeg -formats
  4. 官方文档 FFmpeg 的文档是学习的最佳资源,虽然有些晦涩,但非常权威。

  5. 在线工具

希望这份大全能帮助你更好地使用 FFmpeg!

分享:
扫描分享到社交APP
上一篇
下一篇