FFmpeg 详解
FFmpeg 是一个强大的跨平台多媒体处理工具集,可以用于录制、转换、编辑和流式传输音频和视频内容。以下是 FFmpeg 的全面解析:
一、FFmpeg 核心组件
- ffmpeg - 主要的多媒体转换工具
- ffplay - 简单的媒体播放器
- ffprobe - 媒体文件分析工具
- libavcodec - 编解码器库
- libavformat - 多媒体容器格式库
- libavutil - 实用工具库
- libswscale - 图像缩放和色彩空间转换库
- libswresample - 音频重采样库
二、基本命令结构
ffmpeg [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...
三、常用功能详解
1. 视频转换
# 转换视频格式
ffmpeg -i input.mp4 output.avi
# 指定编码器
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4
2. 音频处理
# 提取音频
ffmpeg -i video.mp4 -vn -c:a copy output.aac
# 转换音频格式
ffmpeg -i input.wav -c:a libmp3lame output.mp3
# 调整音频质量
ffmpeg -i input.mp3 -b:a 192k output.mp3
3. 视频裁剪与剪辑
# 裁剪视频片段
ffmpeg -i input.mp4 -ss 00:01:30 -t 00:00:20 -c copy output.mp4
# 裁剪视频尺寸
ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4
4. 视频合并
# 创建合并列表文件
echo "file 'part1.mp4'" > list.txt
echo "file 'part2.mp4'" >> list.txt
# 执行合并
ffmpeg -f concat -i list.txt -c copy output.mp4
四、高级功能
1. 视频滤镜
# 添加水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
# 调整亮度/对比度
ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.5" output.mp4
# 添加文字
ffmpeg -i input.mp4 -vf "drawtext=text='Sample Text':x=10:y=10:fontsize=24:fontcolor=white" output.mp4
2. 视频压缩
# CRF压缩 (18-28是常用范围,值越小质量越高)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium output.mp4
# 2-pass编码 (更精确的码率控制)
ffmpeg -y -i input.mp4 -c:v libx264 -b:v 1000k -pass 1 -f mp4 /dev/null && \
ffmpeg -i input.mp4 -c:v libx264 -b:v 1000k -pass 2 output.mp4
3. 屏幕录制
# Linux屏幕录制
ffmpeg -f x11grab -s 1920x1080 -i :0.0 -c:v libx264 output.mp4
# Windows屏幕录制
ffmpeg -f gdigrab -i desktop -c:v libx264 output.mp4
五、流媒体处理
1. RTMP推流
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -c:a aac -f flv rtmp://server/live/streamkey
2. HLS切片
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 output.m3u8
六、硬件加速
1. NVIDIA硬件加速
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4
2. Intel QSV加速
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -c:v h264_qsv output.mp4
七、FFmpeg API编程
FFmpeg 提供了强大的编程接口,可以用 C/C++ 进行开发:
#include <libavformat/avformat.h>
int main() {
AVFormatContext *fmt_ctx = NULL;
avformat_open_input(&fmt_ctx, "input.mp4", NULL, NULL);
avformat_find_stream_info(fmt_ctx, NULL);
// 处理媒体流...
avformat_close_input(&fmt_ctx);
return 0;
}
八、FFmpeg 常见问题解决
- 编解码器不支持:安装额外编解码器或重新编译FFmpeg
- 时间戳问题:使用
-fflags +genpts
重新生成时间戳 - 音视频不同步:尝试
-async 1
参数 - 内存不足:使用
-threads
限制线程数或分片处理
九、FFmpeg 性能优化
- 选择合适的
-preset
(ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow) - 使用多线程
-threads
- 合理设置 GOP 大小
-g
- 使用硬件加速
FFmpeg 的功能远不止于此,它几乎可以处理所有你能想到的多媒体操作。掌握 FFmpeg 可以让你在多媒体处理领域游刃有余。