学习ffmpeg-从了解开始


前言:从安装开始
sudo apt update
sudo apt install ffmpeg


ffmpeg的基本组成

模块名称 功能描述 主要用途
AVFormat 实现媒体封装格式的处理,支持多种音视频容器格式(如 MP4、AVI、MKV 等)。 - 读取和解析音视频文件的容器格式 - 封装和复用音视频流 - 支持流媒体协议(如 RTMP、HTTP)
AVCodec 提供音视频编解码器,支持多种编解码格式(如 H.264、AAC、MP3 等)。 - 编码音视频数据 - 解码音视频数据 - 支持硬件加速编解码(如 NVENC、VAAPI)
AVFilter 提供音视频滤镜处理框架,用于对音视频数据进行处理和转换。 - 视频滤镜(如裁剪、旋转、添加水印) - 音频滤镜(如调整音量、混音) - 创建复杂的滤镜链
AVDevice 提供对音视频设备的访问接口,支持摄像头、麦克风、显示器等设备。 - 捕获音视频数据(如从摄像头或麦克风) - 输出音视频数据(如到显示器或扬声器) - 列举和控制设备
AVUtil 提供通用工具函数,支持数学运算、内存管理、数据结构等。 - 提供辅助函数(如哈希计算、时间戳处理) - 支持像素格式和音频样本格式的转换 - 提供错误处理和日志功能
swscale 用于视频图像的缩放和像素格式转换。 - 将图像从一种分辨率缩放到另一种分辨率 - 将像素格式从一种转换为另一种(如 YUV 到 RGB)
swresample 用于音频的重采样、声道转换和音频格式转换。 - 将音频从一种采样率转换为另一种采样率 - 调整声道数(如单声道到立体声) - 转换音频格式
说明
  • AVFormat:负责处理音视频文件的容器格式,支持多种格式的读取和写入。
  • AVCodec:提供编解码器,支持多种音视频编解码格式。
  • AVFilter:提供音视频滤镜框架,用于处理音视频数据。
  • AVDevice:提供对音视频设备的访问接口,支持设备输入和输出。
  • AVUtil:提供通用工具函数,支持多种辅助功能。
  • swscale:专门用于视频图像的缩放和像素格式转换。
  • swresample:专门用于音频的重采样和格式转换。

ffmpeg的核心组件

工具名称 功能描述 主要用途
ffmpeg FFmpeg 的核心工具,用于多媒体文件的解码、编码、转码及特效添加。其主要工作流程包括解封装、解码、处理、编码和封装。 - 音视频编解码 - 格式转换 - 视频剪辑与合并 - 添加视频滤镜和特效 - 性能优化与调试
ffplay 基于 FFmpeg 的 avformat 和 avcodec 实现媒体文件或流的播放。依赖于 SDL 库,可以进行音视频显示和播放相关信息的查看。 - 播放本地音视频文件 - 播放网络流媒体 - 基本播放控制(暂停、快进等) - 显示播放信息
ffprobe 多媒体分析工具,可从媒体文件或流中获取音频、视频、媒体容器等参数。支持多种输出格式。 - 显示多媒体文件的详细信息(如编解码器、帧率、分辨率等) - 分析音视频流的详细信息 - 输出信息为 JSON、CSV 等格式 - 提取元数据和章节信息

ffmpeg:

功能 :核心工具,用于音视频的编解码、转码、格式转换、特效添加等。
工作流程

  • 解封装:从输入文件中提取音视频流。
  • 解码:将压缩的音视频数据解码为原始数据。
  • 处理:对音视频数据进行处理(如裁剪、拼接、添加滤镜等)。
  • 编码:将处理后的音视频数据重新编码。
  • 封装:将编码后的音视频数据封装到输出文件中。
    用途
  • 音视频编解码
  • 格式转换
  • 视频剪辑与合并
  • 添加视频滤镜和特效
  • 性能优化与调试

ffplay:

功能 :基于 FFmpeg 的 avformat 和 avcodec 实现媒体文件或流的播放。

特点:

  • 支持多种音视频格式。
  • 提供基本的播放控制功能(如暂停、快进、快退等)。
  • 可以显示音视频的播放信息。

用途

  • 播放本地音视频文件
  • 播放网络流媒体
  • 基本播放控制
  • 显示播放信息

ffprobe:

功能:多媒体分析工具,可从媒体文件或流中获取音频、视频、媒体容器等参数。

特点

支持多种输出格式(如 JSON、CSV、XML)。

可以提取文件的元数据和章节信息。
用途

  • 显示多媒体文件的详细信息(如编解码器、帧率、分辨率等)
  • 分析音视频流的详细信息
  • 输出信息为 JSON、CSV 等格式
  • 提取元数据和章节信息

ffmpeg命令

信息查询

  • ffmpeg -formats:封装格式
  • ffmpeg -encoders :支持编码器
  • ffmpeg -decoders: 查看支持的解码器
  • ffmpeg -filters

封装转换

封装转换功能由 AVFormat 模块实现,通过 libavformat 库操作。可以使用以下参数:

  • 通用参数:

  • avioflags:设置 I/O 操作的标志。

    avioflags 是一个用于设置 I/O(输入/输出)操作标志的参数。它主要用于控制 FFmpeg 在读取或写入文件时的行为。
    direct :启用直接 I/O 模式,减少缓冲区的使用。
    nonblock:启用非阻塞模式,使 I/O 操作不会阻塞程序的执行

  • probesize:设置读取文件头的大小,用于检测文件格式。

    文件格式检测:

    FFmpeg 在处理多媒体文件时,需要先读取文件头来确定文件的格式(如 MP4、AVI、MKV 等)。

    probesize 参数控制 FFmpeg 读取文件头的大小,影响格式检测的准确性和效率。kb为单位

ffmpeg -i input.mp4 -probesize 5000000 - avioflags direct output.mp4

转码参数

转码功能由 AVCodec 模块完成,通过 libavcodec 库实现。可以使用以下参数
设置协议

  • c✌️ 可以是copy 也可以转协议
  • c:a 可以是copy 也可以转协议
    设置码率
  • b:v:设置视频比特率。
  • b:a:设置音频比特率。
    设置关键帧间隔:
  • g:设置关键帧间隔。
    ffmpeg -i input.mp4 -c:v libx264 -b:v 1000k -c:a aac -b:a 128k -g 30 output.mp4

将输入文件 input.mp4 转码为 output.mp4,设置视频比特率为 1000 kbps,音频比特率为 128 kbps,关键帧间隔为 30。使用H.264和aac协议

补充知识点

关键帧:也称为 I 帧(Intra-coded frame),是一种包含完整图像信息的视频帧。它不依赖于其他帧进行解码,可以独立解码和显示。

关键帧的间隔(关键帧间隔)影响视频的质量和压缩效率。关键帧间隔越短视频的随机访问性能越好,但文件大小会增加;关键帧间隔越长,文件大小会减小,但随机访问性能会下降。

比特率(Bitrate):视频比特率表示每秒传输的视频数据量。较高的比特率意味着视频数据更丰富,图像质量更好,但文件大小也更大。

基本转码原理

FFmpeg 的转码过程包括以下步骤:

  • 解封装:从输入文件中提取音视频流。
  • 解码:将压缩的音视频数据解码为原始数据。
  • 处理:对音视频数据进行处理(如裁剪、拼接、添加滤镜等)。
  • 编码:将处理后的音视频数据重新编码。
  • 封装:将编码后的音视频数据封装到输出文件中

FFplay

1 设置窗口大小

-x:设置播放窗口的宽度。

-y:设置播放窗口的高度。

-s:设置播放窗口的大小(宽x高)。

示例:
ffplay -s 800x600 input.mp4
2 全屏显示
ffplay -fs input.mp4
3 屏蔽音频、视频、字幕
-an:屏蔽音频流,不播放音频。 -vn:屏蔽视频流,不显示视频。 -sn:屏蔽字幕流,不显示字幕。
4 定位播放

-ss:定位播放,跳转到指定的时间点开始播放。时间可以是秒数或时间戳格式(如 00:01:30).
ffplay -ss 00:01:30 input.mp4
5 设置播放时长

-t:设置播放时长,指定播放的持续时间(单位为秒)
ffplay -ss 00:01:30 -t 30 input.mp

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习