前言
因为突然有人来问我,OBS录频时为什么画面会出现漂移(60/120帧),同时画面卡顿的问题。
通过检查,发现录频时游戏画面内容为120帧,在检查OBS录频内容帧率时没有内容显示,因此通过ffmpeg工具来辅助检查视频文件帧率。(不过录频画面漂移的问题还是没有解决就是了,我严重怀疑是电脑显卡渲染的问题)
引言如果你曾经需要转换视频格式、提取音频、剪辑片段或处理多媒体文件,那么FFmpeg很可能就是你一直在寻找的工具。这个开源、跨平台的命令行工具集被誉为"音视频处理的瑞士军刀",是每个开发者和内容创作者都应该掌握的利器。
什么是FFmpeg?FFmpeg是一个完整的、跨平台的解决方案,用于录制、转换和流式传输音频和视频。它包含了libavcodec ------一个领先的音视频编解码库,以及libavformat------一个多媒体容器格式的复用和解复用库。
安装FFmpeg
官方链接:https://ffmpeg.org/

macOS
bash
brew install ffmpeg
Ubuntu/Debian
bash
sudo apt update
sudo apt install ffmpeg
Windows
- 访问FFmpeg官网下载预编译版本


- 解压并将bin目录添加到系统PATH

从源码编译(最新功能)
bash
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
./configure --enable-gpl --enable-libx264 --enable-libvpx
make
sudo make install
常用命令
常用参数说明
-i:输入文件-c:v:视频编码器-c:a:音频编码器-vf:视频过滤器-af:音频过滤器-ss:开始时间-t:持续时间-to:结束时间-b:v:视频比特率-b:a:音频比特率-r:帧率-s:分辨率
查看文件信息
bash
ffmpeg -i input.mp4
实用技巧
- 保持原质量:
bash
ffmpeg -i input.mp4 -c copy output.mkv
- 批量处理(bash脚本示例):
bash
for file in *.mov; do
ffmpeg -i "$file" "${file%.mov}.mp4"
done
- 添加水印:
bash
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4
注意事项
- FFmpeg 命令顺序很重要
- 先指定输入文件,再设置参数,最后是输出文件
- 使用
-c copy可以避免重新编码,加快处理速度 - 复杂操作可能需要使用滤镜链(filter_complex)
核心组件
- ffmpeg:主要的多媒体处理工具
- ffplay:简单的媒体播放器
- ffprobe:媒体文件分析工具
- 多个编码/解码库
FFmpeg能做什么?
1. 格式转换(转码)
bash
# 将MP4转换为AVI
ffmpeg -i input.mp4 output.avi
# 将视频转换为H.264编码的MP4
ffmpeg -i input.mov -c:v libx264 output.mp4
# 批量转换所有MKV文件为MP4
for f in *.mkv; do ffmpeg -i "$f" "${f%.mkv}.mp4"; done
2. 提取音频
bash
# 从视频中提取音频为MP3
ffmpeg -i video.mp4 -q:a 0 -map a audio.mp3
# 提取高质量音频
ffmpeg -i input.mp4 -vn -acodec copy output.aac
3. 视频剪辑与合并
bash
# 剪辑视频片段(从第10秒开始,持续15秒)
ffmpeg -i input.mp4 -ss 00:00:10 -t 15 -c copy clip.mp4
# 合并多个视频
echo "file 'part1.mp4'" > list.txt
echo "file 'part2.mp4'" >> list.txt
ffmpeg -f concat -i list.txt -c copy output.mp4
4. 调整视频参数
bash
# 调整分辨率
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
# 调整比特率
ffmpeg -i input.mp4 -b:v 1M output.mp4
# 调整帧率
ffmpeg -i input.mp4 -r 30 output.mp4
5. 添加水印和字幕
bash
# 添加图片水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
# 添加文字水印
ffmpeg -i input.mp4 -vf "drawtext=text='Your Text':x=10:y=10:fontsize=24:fontcolor=white" output.mp4
# 添加字幕
ffmpeg -i video.mp4 -vf "subtitles=subtitle.srt" output.mp4
6. 屏幕录制
bash
# Linux屏幕录制
ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4
# macOS屏幕录制
ffmpeg -f avfoundation -i "1" output.mov
# Windows屏幕录制(需要安装额外组件)
7. 直播推流
bash
# 推流到RTMP服务器
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/streamkey
# 从摄像头直播
ffmpeg -f avfoundation -i "0" -f flv rtmp://server/live/streamkey
8. 创建GIF动图
bash
# 从视频创建高质量GIF
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v gif output.gif
# 从视频片段创建GIF
ffmpeg -ss 00:00:05 -t 3 -i input.mp4 -vf "fps=15,scale=400:-1:flags=lanczos" output.gif
9. 视频压缩
bash
# 高质量压缩
ffmpeg -i input.mp4 -vcodec libx264 -crf 28 output.mp4
# 极速压缩
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast output.mp4
10. 音频处理
bash
# 合并音频和视频
ffmpeg -i video.mp4 -i audio.mp3 -c copy output.mp4
# 调整音频音量
ffmpeg -i input.mp3 -af "volume=1.5" output.mp3
# 音频格式转换
ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3
实用技巧与高级用法
1. 硬件加速
bash
# NVIDIA GPU加速(需要安装NVIDIA驱动和CUDA)
ffmpeg -hwaccel cuda -i input.mp4 output.mp4
# Intel QuickSync加速
ffmpeg -hwaccel qsv -i input.mp4 output.mp4
2. 批量处理脚本
bash
#!/bin/bash
# 批量压缩视频
for f in *.mp4; do
ffmpeg -i "$f" -vcodec libx264 -crf 28 "compressed_${f}"
done
3. 视频分析
bash
# 使用ffprobe分析视频信息
ffprobe -v error -show_format -show_streams input.mp4
# 显示关键帧位置
ffprobe -select_streams v -show_frames -show_entries frame=pict_type input.mp4
4. 视频滤镜链
bash
# 多个滤镜组合使用
ffmpeg -i input.mp4 -vf "eq=brightness=0.05:contrast=1.1,unsharp=5:5:1.0:5:5:0.0" output.mp4
最佳实践
- 备份原始文件:FFmpeg操作通常不可逆
- 先测试后批量:在处理大量文件前,先测试单个文件
- 使用合适的编码器:根据需求选择编码器(libx264用于兼容性,libvpx用于WebM)
- 关注质量与大小平衡:CRF值越低质量越好但文件越大(建议18-28)
- 利用硬件加速:大幅提升处理速度
常见问题解决
1. 编码器不支持
bash
# 查看支持的编码器
ffmpeg -codecs
# 安装额外编码器
# H.265/HEVC支持
sudo apt install libx265-dev
2. 内存不足
bash
# 使用流式处理
ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -tune fastdecode output.mp4
3. 时间戳问题
bash
# 修复时间戳
ffmpeg -i input.mp4 -vsync 2 output.mp4
资源推荐
- 官方文档 :https://ffmpeg.org/documentation.html
- FFmpeg维基 :https://trac.ffmpeg.org/wiki
- 常用命令备忘单 :https://gist.github.com/protrolium/...
- 在线测试工具:无需安装即可体验基础功能
结语
FFmpeg的强大之处不仅在于其功能丰富,更在于它的灵活性和可编程性。虽然命令行界面可能让初学者望而生畏,但一旦掌握基础语法,你会发现它是一个效率倍增器。无论是处理个人媒体库,还是构建专业的音视频处理流水线,FFmpeg都能提供稳定可靠的解决方案。
记住,FFmpeg的学习是一个渐进的过程。从简单的格式转换开始,逐步尝试更复杂的功能,很快你就能成为多媒体处理的高手。现在,打开终端,开始你的FFmpeg之旅吧!
提示 :本文只是FFmpeg功能的冰山一角。FFmpeg拥有数百个参数和选项,建议在实践中逐步探索。遇到问题时,使用ffmpeg -h查看帮助,或者查阅官方文档获取最新信息。
如果你有特定的使用场景或遇到技术问题,欢迎在评论区交流讨论!
FFmpeg 功能非常强大,这些只是基础用法。对于更复杂的需求,可以参考官方文档或社区教程。