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
相关推荐
FAREWELL000751 小时前
Lua学习记录(6) --- Lua中的元表相关内容
开发语言·学习·lua
c***21299 小时前
Springboot3学习(5、Druid使用及配置)
android·学习
GISer_Jing10 小时前
jx前端架构学习
前端·学习·架构
灰灰勇闯IT11 小时前
隐语MOOC三期学习感悟:解锁数据要素流通的“三维认知”与落地逻辑
笔记·学习
好奇龙猫11 小时前
日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(25):语法和单词 第5-6课
学习
calvinpaean12 小时前
VGGT 论文学习
学习
毕设源码-邱学长12 小时前
【开题答辩全过程】以 基于Java的公职备考在线学习系统的设计与实现为例,包含答辩的问题和答案
java·开发语言·学习
wdfk_prog12 小时前
[Linux]学习笔记系列 -- [block][mq-deadline]
linux·笔记·学习
('-')12 小时前
《从根上理解MySQL是怎样运行的》第二十二章学习笔记
笔记·学习·mysql