FFmpeg的初步学习

FFmpeg 是一个功能极其强大且开源的多媒体框架,用于处理音视频内容。它被誉为音视频领域的"瑞士军刀",是几乎所有主流视频播放器、转码工具和流媒体服务的底层核心。

FFmpeg官网https://ffmpeg.org/

核心定义

FFmpeg 本质上是一套包含多个核心工具一系列编解码库的完整解决方案。它的核心价值在于:

  • 开源免费:遵循 LGPL/GPL 许可。

  • 跨平台:可在 Linux、macOS、Windows 等系统上运行。

  • 命令行驱动:通过命令参数进行操作,灵活高效,易于集成到脚本或程序中。

  • 功能全面:几乎涵盖了音视频处理的所有环节。

核心组件(命令行工具)

用户最常接触的是它的命令行工具集,主要包括三个工具:

1.ffmpeg - 核心转换工具

  • 功能 :主要用于格式转换(转码)、编码、解码、封装、解封装、滤镜处理等。绝大多数音视频处理任务都通过它完成。

  • 基本命令结构

bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mkv
  • -i input.mp4:指定输入文件。

  • -c:v libx264:设置视频编码器为 H.264。

  • -c:a aac:设置音频编码器为 AAC。

  • output.mkv:输出文件。

2.ffplay - 简易播放器

  • 功能 :一个基于 FFmpeg 库的轻量级媒体播放器。主要用于快速测试和调试,查看视频流信息或预览滤镜效果。

3.ffprobe - 媒体分析器

  • 功能 :用于分析媒体文件或流,并以人类可读或机器可读(如 JSON)的形式输出详细的流信息(编码格式、分辨率、码率、时长、元数据等)。

  • 常用命令

bash 复制代码
ffprobe -v error -show_format -show_streams input.mp4

核心库(开发者使用)

FFmpeg 的强大功能源自其模块化的库,开发者可以用这些库来构建自己的多媒体应用。

libavcodec编解码库,提供了数百种音视频编解码器的实现(如 H.264/AVC, H.265/HEVC, VP9, AV1, AAC, MP3)。

libavformat格式库,处理多媒体容器格式(如 MP4, MKV, FLV, MPEG-TS, AVI)的封装(Muxing)和解封装(Demuxing)。

libavutil工具库,包含各种通用辅助函数,如数学运算、内存管理、数据结构等。

libavfilter滤镜库,提供强大的音视频滤镜处理能力,如缩放、裁剪、叠加水印、降噪、色彩调整等。多个滤镜可以连接成滤镜链(Filtergraph)。

libavdevice设备库,用于访问采集设备(摄像头、麦克风)和输出设备。

libswscale图像缩放/色彩空间转换库,处理像素格式转换(如 YUV 到 RGB)和图像缩放。

libswresample / libavresample音频重采样库,处理音频格式转换、采样率调整、声道布局调整等。

常用指令

一、基础信息查看

查看媒体文件信息

bash 复制代码
# 显示简要信息
ffmpeg -i input.mp4

# 显示详细信息(JSON格式,便于解析)
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

# 查看支持的编码器
ffmpeg -encoders

# 查看支持的容器格式
ffmpeg -formats

二、视频转码与转换

基础格式转换

bash 复制代码
# MP4转MKV(保持原质量)
ffmpeg -i input.mp4 -c copy output.mkv

# AVI转MP4(重新编码)
ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4

# 转换为GIF
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1" output.gif

调整视频质量

bash 复制代码
# 指定码率(视频1500k,音频128k)
ffmpeg -i input.mp4 -b:v 1500k -b:a 128k output.mp4

# CRF模式(18-28质量可接受,越小质量越高)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

# 指定分辨率(宽高设为1280x720)
ffmpeg -i input.mp4 -s 1280x720 output.mp4

# 保持宽高比,宽度设为640,高度自动计算
ffmpeg -i input.mp4 -vf "scale=640:-1" output.mp4

三、音视频处理

提取音视频流

bash 复制代码
# 提取音频(不重新编码)
ffmpeg -i video.mp4 -vn -c:a copy audio.m4a

# 提取视频(去掉音频)
ffmpeg -i video.mp4 -an -c:v copy video_noaudio.mp4

# 提取特定音频流(如第二个音频流)
ffmpeg -i input.mkv -map 0:a:1 -c:a copy audio2.aac

音视频合并

bash 复制代码
# 合并视频和音频(重新编码)
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac output.mp4

# 合并多个视频(使用concat)
echo "file 'part1.mp4'" > list.txt
echo "file 'part2.mp4'" >> list.txt
ffmpeg -f concat -i list.txt -c copy output.mp4

四、剪辑与分割

精确剪辑

bash 复制代码
# 从第30秒开始,截取10秒(不重新编码,快速)
ffmpeg -ss 00:00:30 -i input.mp4 -t 10 -c copy output.mp4

# 从第1分钟到第2分钟(重新编码)
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c:v libx264 -c:a aac output.mp4

# 只保留前5分钟
ffmpeg -i input.mp4 -t 300 -c copy output.mp4

分割视频

bash 复制代码
# 按时间分割(每10分钟一段)
ffmpeg -i input.mp4 -c copy -map 0 -segment_time 600 -f segment output_%03d.mp4

# 按大小分割(每100MB一段)
ffmpeg -i input.mp4 -c copy -map 0 -segment_size 100M -f segment output_%03d.mp4

五、滤镜特效(最强大功能)

视频滤镜

bash 复制代码
# 裁剪画面
ffmpeg -i input.mp4 -vf "crop=w=640:h=480:x=100:y=50" output.mp4

# 添加文字水印
ffmpeg -i input.mp4 -vf "drawtext=text='My Watermark':fontcolor=white:fontsize=24:x=10:y=10" output.mp4

# 添加图片水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4

# 旋转视频(逆时针90度)
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

# 调整亮度/对比度
ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2" output.mp4

# 视频加速/减速
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4  # 2倍速
ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" output.mp4  # 0.5倍速

音频滤镜

bash 复制代码
# 调整音量
ffmpeg -i input.mp3 -af "volume=1.5" output.mp3  # 增加50%
ffmpeg -i input.mp3 -af "volume=0.5" output.mp3  # 减小50%

# 去除静音部分
ffmpeg -i input.mp3 -af "silenceremove=start_periods=1:start_duration=1:start_threshold=-50dB" output.mp3

# 提取人声(简单版,效果有限)
ffmpeg -i input.mp3 -af "pan=stereo|c0=c0|c1=c1,asplit[a][b];[a]aecho=0.8:0.88:60:0.4[echo];[b][echo]amerge" output.mp3

六、硬件加速(大幅提升速度)

NVIDIA GPU加速

bash 复制代码
# NVIDIA硬编码
ffmpeg -i input.mp4 -c:v h264_nvenc -preset fast output.mp4
ffmpeg -i input.mp4 -c:v hevc_nvenc output.mp4

# 同时硬解码和硬编码
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4

Intel GPU加速

bash 复制代码
# Intel QSV加速
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv output.mp4

AMD GPU加速

bash 复制代码
# AMD AMF加速
ffmpeg -i input.mp4 -c:v h264_amf output.mp4

七、截图与预览

截图功能

bash 复制代码
# 在指定时间截图
ffmpeg -ss 00:01:30 -i input.mp4 -vframes 1 -q:v 2 screenshot.jpg

# 每秒截图一张
ffmpeg -i input.mp4 -vf "fps=1" thumbnails_%03d.jpg

# 每10秒截图一张
ffmpeg -i input.mp4 -vf "fps=1/10" thumbnails_%03d.jpg

# 生成雪碧图(Sprite sheet)
ffmpeg -i input.mp4 -vf "fps=1/60,scale=320:-1,tile=10x10" sprite.jpg

八、直播相关

推流与拉流

bash 复制代码
# 推流到RTMP服务器
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/streamkey

# 拉取RTMP流并保存
ffmpeg -i rtmp://server/live/streamkey -c copy output.mp4

# 转封装流(RTSP转RTMP)
ffmpeg -i rtsp://camera/stream -c copy -f flv rtmp://server/live/stream

九、实用技巧组合

常用组合命令

bash 复制代码
# 压缩视频(减小文件大小)
ffmpeg -i input.mp4 -vcodec libx264 -crf 28 -preset veryfast -acodec aac -b:a 128k output.mp4

# 提取关键帧
ffmpeg -i input.mp4 -vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr keyframes_%03d.jpg

# 批量处理当前目录所有MP4文件
for file in *.mp4; do
    ffmpeg -i "$file" -c:v libx264 -crf 23 "converted_${file}"
done

# 制作静音视频(用于测试)
ffmpeg -f lavfi -i color=c=black:s=1280x720:d=10 -c:v libx264 -t 10 silent_video.mp4

十、参数优化与调试

优化参数

bash 复制代码
# 多线程编码(提升速度)
ffmpeg -i input.mp4 -threads 4 output.mp4

# 指定编码预设(平衡速度和质量)
ffmpeg -i input.mp4 -preset faster -crf 23 output.mp4
# 预设值:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow

# 只处理I帧和P帧(跳过B帧,提升压缩速度)
ffmpeg -i input.mp4 -x264-params "bframes=0" output.mp4
相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习