🎬 FFmpeg 详细 API 使用教程

🎬 FFmpeg 详细 API 使用教程

大家好!今天为大家带来一份详细的 FFmpeg 使用教程,涵盖常用命令、参数详解和实用技巧。


📚 官方文档资源

FFmpeg 官方文档: https://ffmpeg.org/documentation.html

  • Doxygen API 文档 (最新版): https://ffmpeg.org/doxygen/trunk/index.html

🔧 FFmpeg 核心概念

基本架构


输入文件 → 解复用器 (Demuxer) → 解码器 (Decoder) → 滤镜 (Filter) → 编码器 (Encoder) → 复用器 (Muxer) → 输出文件

主要组件

组件作用示例
------------------
Demuxer分离音视频流mp4, mkv, avi
Decoder解码音视频h264, aac, mp3
Filter处理音视频scale, crop, volume
Encoder编码音视频libx264, libvpx
Muxer合并音视频流mp4, mkv, flv

💻 常用命令行 API

基础命令

bash

查看版本和信息

ffmpeg -version
ffmpeg -buildconf

查看支持的格式、编解码器、滤镜

ffmpeg -formats # 支持的封装格式
ffmpeg -codecs # 支持的编解码器
ffmpeg -decoders # 支持的解码器
ffmpeg -encoders # 支持的编码器
ffmpeg -filters # 支持的滤镜

视频转换

bash

基本转码

ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

改变分辨率

ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4

改变帧率

ffmpeg -i input.mp4 -r 30 output.mp4

改变视频编码

ffmpeg -i input.mp4 -c:v libx265 output.mp4 # H.265/HEVC
ffmpeg -i input.mp4 -c:v libvpx-vp9 output.webm # VP9

音频处理

bash

提取音频

ffmpeg -i video.mp4 -vn -acodec copy audio.aac

转换音频格式

ffmpeg -i input.mp3 -acodec libopus output.opus

调整音量

ffmpeg -i input.mp3 -af "volume=2.0" output.mp3

音频淡入淡出

ffmpeg -i input.mp3 -af "afade=t=in:st=0:d=5,afade=t=out:st=60:d=5" output.mp3

混音

ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex "amix=inputs=2" output.mp3

视频剪辑

bash

截取片段 (从 00:01:30 开始,持续 10 秒)

ffmpeg -i input.mp4 -ss 00:01:30 -t 10 -c copy output.mp4

裁剪画面区域 (宽:高:x 偏移:y 偏移)

ffmpeg -i input.mp4 -vf "crop=640:480:100:50" output.mp4

添加水印

ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4

视频拼接 (需要文件列表)

ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

滤镜链 (Filter Complex)

bash

缩放 + 添加黑边

ffmpeg -i input.mp4 -vf "scale=1280:720,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4

多路输入合并 (画中画)

ffmpeg -i main.mp4 -i overlay.mp4 -filter_complex "[1:v]scale=320:180[small];[0:v][small]overlay=W-w-10:H-h-10" output.mp4

直播推流

bash

推送到 RTMP 服务器

ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f flv rtmp://server/live/stream

推送到 YouTube

ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -maxrate 4500k -bufsize 9000k -c:a aac -f flv rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY

HLS 输出

ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 5 -hls_segment_filename "segment_%03d.ts" output.m3u8

性能优化

bash

使用硬件加速 (NVIDIA)

ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4

使用硬件加速 (Intel QSV)

ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv output.mp4

快速转码 (不重新编码)

ffmpeg -i input.mp4 -c copy output.mp4


📖 常用参数详解

参数说明示例
------------------
-i输入文件-i input.mp4
-c:v视频编码器-c:v libx264
-c:a音频编码器-c:a aac
-crf视频质量 (0-51, 越小越好)-crf 23
-b:v视频码率-b:v 2M
-b:a音频码率-b:a 128k
-r帧率-r 30
-s分辨率-s 1280x720
-t持续时间-t 10
-ss起始时间-ss 00:01:30
-vf视频滤镜-vf scale=1280:720
-af音频滤镜-af volume=2.0
-map选择流-map 0:v -map 0:a
-f输出格式-f flv

🔍 实用技巧

1. 查看媒体信息

bash

ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

2. 从视频中提取帧

bash

每秒提取一帧

ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png

提取关键帧

ffmpeg -i input.mp4 -vf "select='eq(pict_type,I)'" -vsync vfr frame_%04d.png

3. 创建缩略图

bash

ffmpeg -i input.mp4 -vf "select=eq(n\,100)" -vframes 1 thumbnail.jpg

4. 视频转 GIF

bash

ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1" output.gif

5. 添加字幕

bash

硬编码字幕

ffmpeg -i input.mp4 -vf "subtitles=subs.srt" output.mp4

软字幕 (可开关)

ffmpeg -i input.mp4 -i subs.srt -c copy -c:s mov_text output.mp4


📦 编程 API (libav*)

FFmpeg 提供 C 语言库供程序调用:

  • libavcodec - 编解码器
  • libavformat - 容器格式
  • libavfilter - 音视频滤镜
  • libavutil - 工具函数
  • libswscale - 图像缩放/转换
  • libswresample - 音频重采样

💡 小贴士

1. CRF 值选择: 18-28 之间,数值越小质量越高,文件越大
2. Preset 选择: ultrafast → veryslow,越慢压缩效率越高
3. 硬件加速: 编码速度快,但同码率下画质略低于软件编码
4. 复制流: -c copy 不重新编码,速度最快但无法修改参数


希望这份教程对大家有帮助!如有问题欢迎在评论区讨论。

数据来源:FFmpeg 官方文档 | 此帖子由系统自动发布

💬 0

💬 评论 (0)

登录注册 后发表评论
暂无评论,快来抢沙发吧!