沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • API网关

  • RPC

  • 消息队列

  • Spring Cloud

  • 分布式事务

  • 云存储

  • 搜索引擎

  • 多媒体框架

    • ffmpeg入门
    • ffmpeg参数篇
      • FFmpeg 命令格式概述
        • 示例解析
      • 参数分类
        • 全局参数(Global Options)
        • 输入参数(Input Options)
        • 输出参数(Output Options)
      • 参数顺序与位置的重要性
      • 高级参数与调优技巧
        • 编码优化
        • 多路复用与流媒体
        • 复杂滤镜链
      • 注意事项
    • ffmpeg实现视频转码
    • ffmpeg实现视频流抽帧
  • 虚拟机

  • 微服务
  • 多媒体框架
沉梦听雨
2025-02-07
目录

ffmpeg参数篇

# ffmpeg 参数篇

下面介绍 FFmpeg 参数相关的知识以及命令格式,从基本语法到参数分类,再到一些常见用法,帮助你更深入地理解 FFmpeg 命令行工具的工作原理。

# FFmpeg 命令格式概述

FFmpeg 命令行工具的基本语法大致如下:

ffmpeg [全局参数] {[输入选项] -i 输入文件}... {[输出选项] 输出文件}...
1
  • 全局参数:对整个命令有效,如 -y(覆盖输出文件)、-loglevel(设置日志级别)等。
  • 输入选项:放在 -i 前面的参数,只对紧跟其后的输入文件生效,例如 -ss 用于设置起始时间(快速定位输入流)。
  • 输出选项:出现在输入文件之后,专门控制输出文件的编码、格式等,如 -c:v(指定视频编码器)、-b:a(音频比特率)等。

这类结构让 FFmpeg 的命令既灵活又具有明确的定位意义,输入选项和输出选项分别对应数据的不同处理阶段。

# 示例解析

ffmpeg -y -ss 00:01:00 -t 10 -i input.mp4 -c:v libx264 output.mp4
1
  • -y:全局参数,强制覆盖输出文件。
  • -ss 00:01:00:输入选项,从输入文件的 1 分钟处开始读取。
  • -t 10:输出选项,输出视频时长为 10 秒。
  • -i input.mp4:输入文件。
  • -c:v libx264:输出选项,指定视频编码器为 H.264。
  • output.mp4:输出文件路径。

# 参数分类

# 全局参数(Global Options)

  • 作用范围:对整个命令生效(包括所有输入和输出),通常在命令开头设置。
    • 控制命令的整体行为(如日志、线程、文件覆盖)。
  • 常见参数:
    • -y:覆盖已存在的输出文件(无需确认)。
    • -n:禁止覆盖输出文件。
    • -loglevel <level>:设置日志输出级别(如 error, warning, info, debug)。
    • -threads <num>:指定处理线程数。
    • -hide_banner:隐藏 FFmpeg 版本和编译信息,使命令输出更简洁。

示例

ffmpeg -hide_banner -y -i input.mp4 output.avi
1

# 输入参数(Input Options)

  • 作用范围:仅对紧随其后的 -i 输入文件或流生效。
    • 针对每个输入文件设置读取规则(如时间定位、解码方式)。
  • 常见参数:
    • -ss <time>:快速定位到输入文件的某个时间点(基于关键帧跳跃,速度快但精度低)。
    • -to <time>:设置输入文件的结束时间。
    • -t <duration>: 指定持续时间(如 -t 10 表示处理 10 秒)。
    • -f <format>:强制指定输入文件的格式(如 -f rawvideo 处理原始视频流)。
    • -hwaccel <type>:指定硬件加速解码方式(如 cuda, qsv)。
    • -re:以真实速率读取输入流,通常用于实时流媒体传输。

示例

# 从输入文件的 30 秒处开始读取,持续 5 秒
# 由于未指定编码参数,FFmpeg 将根据输入文件的编解码器和输出文件的容器格式,自动选择适当的编解码器进行转码
ffmpeg -ss 00:00:30 -t 5 -i input.mp4 output.mp4
1
2
3

# 输出参数(Output Options)

  • 作用范围:仅控制输出文件的编码、格式和内容质量。
    • 定义输出文件的编码、格式和内容(如码率、分辨率、滤镜)。
  • 核心参数:
    • 编码器选择:
      • -c:v <codec>:视频编码器(如 libx264(H.264 编码器)、libx265(H.265 编码器), copy 表示不转码)。
      • -c:a <codec>:音频编码器(如 aac, mp3)。
      • -c:s <codec>:字幕编码器(如 srt, mov_text)。
    • 码率与质量:
      • -b:v 2M:设置视频码率(2Mbps)。
      • -b:a:设置音频比特率。
      • -crf 23:常用在 H.264/AVC 编码中,用于控制视频质量(数值越低,视频质量越高,文件越大)。
      • -vn:禁用视频流。
      • -q:a 2:MP3 音频质量(0-9,值越小质量越高)。
    • 帧率和分辨率:
      • -r:设置帧率,如 -r 30 表示输出视频为 30 帧每秒。
      • -s:设置分辨率,如 -s 1280x720。
    • 格式与容器:
      • -f:指定输出文件格式,例如 -f mp4、-f flv 等,有时可以省略,由输出文件扩展名自动识别。
    • 滤镜处理:
      • -vf "scale=1280:720":缩放视频分辨率。-vf 可用于执行缩放、裁剪、叠加文字等操作
      • -af "volume=0.5":降低音频音量。
    • 时间控制:
      • -ss <time>:输出文件的起始时间(需与输入选项的 -ss 区分)。
      • -t <duration>:输出文件的持续时间。

示例

# 将输入视频缩放为 720p,转码为 H.265,并降低音频码率
ffmpeg -i input.mp4 -vf "scale=1280:720" -c:v libx265 -crf 25 -c:a aac -b:a 128k output.mp4

# 快速剪切视频(不转码)
ffmpeg -ss 00:00:30 -to 00:02:00 -i input.mp4 -c copy output.mp4

# 硬件加速转码(NVIDIA GPU)
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -b:v 5M output.mp4

# 提取音频并转换格式
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3

# 应用了两个滤镜:缩放和添加文本
# 将视频缩放至宽度 640 像素,高度 360 像素。scale 滤镜常用于调整视频尺寸。
# 添加文本“Hello”。文本颜色为白色(fontcolor=white),字体大小为 24(fontsize=24)。drawtext 滤镜用于在视频帧上渲染文本。
ffmpeg -y -i input.mp4 -vf "scale=640:360,drawtext=text='Hello':fontcolor=white:fontsize=24" output.mp4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

需要注意的是,使用 -c copy 时,

  • FFmpeg 只能在关键帧(I 帧)上进行剪辑。
  • 如果指定的开始时间 00:00:30 不是关键帧,FFmpeg 将自动调整到最近的关键帧,这可能导致剪辑的起始时间与预期不完全一致。
  • 因此,如果您需要精确地从特定时间点开始剪辑,建议不使用 -c copy,让 FFmpeg 重新编码视频,以确保准确性。

# 参数顺序与位置的重要性

在 FFmpeg 命令行中,参数的位置非常重要。常见注意事项包括:

  • 输入选项与输出选项: 例如,-ss 如果放在 -i 之前会影响读取速度(跳转到指定位置),而放在输出参数中则会影响剪辑精度。
  • 多个输入或输出: 当存在多个 -i 时,每个输入可以单独设置相应的选项,输出选项也会分别对应前面的输入。正确设置顺序有助于确保每个文件按照预期处理。

# 高级参数与调优技巧

# 编码优化

  • CRF 与预设: 对于 H.264 编码,常使用 -crf 控制质量,同时使用 -preset 调整编码速度和压缩效率。数值较低表示更高质量但文件更大;预设从 ultrafast 到 veryslow 不等。
  • GOP 结构调整: 通过 -g 参数设置关键帧间隔(GOP size),合理的 GOP 结构可以提高视频的播放流畅度和压缩率。

# 多路复用与流媒体

  • 容器格式:

    使用 -f 参数可以指定输出格式,如实时流媒体传输时常用 flv 格式:

    ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f flv rtmp://server/app/stream
    
    1
  • 优化 MP4 文件:

    使用 -movflags +faststart 参数可以使 MP4 文件在网络环境下更快开始播放,因为它将关键元数据移至文件开头。

# 复杂滤镜链

使用 -filter_complex 参数可以实现多路输入和多路输出的高级处理,比如视频拼接、画中画(PIP)等。

例如,将两个视频并排拼接:

ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2" output.mp4
1

# 注意事项

  1. 输入/输出选项的 -ss 区别:
    • 输入选项 -ss:快速定位,但精度低。
    • 输出选项 -ss:逐帧处理,精度高但速度慢。
  2. 流选择冲突:
    • 默认情况下,FFmpeg 会为每个输出文件自动选择一个视频流、一个音频流和一个字幕流。使用 -map 手动指定流可避免意外结果。
  3. 格式兼容性:
    • 输出文件的封装格式(如 MP4、MKV)需支持所选编码器(如 H.265 需 MP4 支持)。
上次更新: 2025/2/8 18:02:22
ffmpeg入门
ffmpeg实现视频转码

← ffmpeg入门 ffmpeg实现视频转码→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式