FFmpeg开发者快速入门

FFmpeg 开发者快速入门

精简版快速入门,只保留核心概念与上手步骤。构建与安装、基本命令行用法、解复用与解码示例、库结构与数据流管道、编解码器/格式/滤镜 API、硬件加速、libswscale 与 libswresample、libavutil 等完整内容 详见 FFmpeg完整文档.md

目录

  1. [一句话了解 FFmpeg](#一句话了解 FFmpeg)
  2. 工具与库
  3. [5 分钟上手](#5 分钟上手)
  4. [第一个命令行与 API 示例](#第一个命令行与 API 示例)
  5. 常用场景与选项
  6. 下一步
  7. 常见问题

1. 一句话了解 FFmpeg

FFmpeg 是广泛使用的多媒体处理框架 :提供命令行工具与一套 C 库,用于解码、编码、转码、滤镜与流处理。命令行 适合脚本、转码与调试;(libavcodec、libavformat、libavfilter 等)可集成到应用中,实现自定义媒体管道。

为什么用?

  • 编解码器与容器格式覆盖全、跨平台、久经生产验证
  • 命令行即装即用;库 API 稳定、示例丰富(doc/examples/)
  • 支持硬件加速(CUDA、VAAPI、QSV、VideoToolbox、MediaCodec)

2. 工具与库

类型 名称 用途
命令行 ffmpeg 转码、格式转换、流处理、音频提取
命令行 ffplay 简易媒体播放与解码测试
命令行 ffprobe 分析容器、流信息与元数据
libavcodec 音视频字幕编解码
libavformat 容器解复用/复用、协议与 I/O
libavfilter 音视频滤镜图
libavutil 内存、数学、像素/采样格式等工具
libswscale / libswresample 图像缩放与音频重采样

理解 数据包(AVPacket)帧(AVFrame) 的区分:libavformat 处理包级,libavcodec 处理帧级。


3. 5 分钟上手

安装

bash 复制代码
# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt-get install ffmpeg

# 从源码(简要)
./configure && make -j$(nproc) && make install

第一个命令

bash 复制代码
# 格式转换
ffmpeg -i input.avi output.mp4

# 流拷贝(不重新编码)
ffmpeg -i input.mkv -c copy output.mp4

# 提取音频
ffmpeg -i video.mp4 -vn -c:a copy audio.aac

常用:-i 输入、-c:v/-c:a 编解码器、-c copy 流拷贝、-vf 视频滤镜、-map 流选择。


4. 第一个命令行与 API 示例

命令行转码示例

bash 复制代码
# 转成 H.264 + AAC 的 MP4
ffmpeg -i video.avi -c:v libx264 -b:v 2M -c:a aac -b:a 128k video.mp4

# 缩放到 720p 并保持比例
ffmpeg -i input.mp4 -vf "scale=1280:-1" -c:a copy output.mp4

API 解复用与解码(核心模式)

c 复制代码
// 简化流程:打开输入 → 找流 → 打开解码器 → 读包并解码
AVFormatContext *fmt_ctx = NULL;
avformat_open_input(&fmt_ctx, filename, NULL, NULL);
avformat_find_stream_info(fmt_ctx, NULL);

// 为某流打开解码器(示例略去查找逻辑)
AVCodecContext *dec_ctx = avcodec_alloc_context3(dec);
avcodec_parameters_to_context(dec_ctx, stream->codecpar);
avcodec_open2(dec_ctx, dec, NULL);

// 解码循环
AVPacket *pkt = av_packet_alloc();
AVFrame *frame = av_frame_alloc();
while (av_read_frame(fmt_ctx, pkt) >= 0) {
    avcodec_send_packet(dec_ctx, pkt);
    while (avcodec_receive_frame(dec_ctx, frame) >= 0) {
        // 使用 frame
    }
    av_packet_unref(pkt);
}
// 刷新:avcodec_send_packet(dec_ctx, NULL),再 receive_frame 至 EOF

要点:发送/接收 API(send_packet → receive_frame);用完后 av_packet_unref/av_frame_unref;完整示例见 doc/examples/demux_decode.c。


5. 常用场景与选项

需求 做法
只换容器、不重编 -c copy
指定视频/音频编码器 -c:v libx264-c:a aac
码率与质量 -b:v 1M-crf 23(x264)
选流 -map 0:v:0-map 0:a:0
视频缩放 -vf scale=1280:720scale=1280:-1
查看能力 ffmpeg -decoders-encoders-filters-formats

API 侧:错误检查(返回值、av_err2str);引用计数(av_*_unref);硬件解码见 doc/examples/hw_decode.c。


6. 下一步

  • 完整文档FFmpeg完整文档.md(从概述、快速开始到构建安装、命令行用法、解复用与解码、库结构、数据流管道、编解码器/格式/滤镜 API、硬件加速、swscale/swresample/avutil 等全章节)
  • 官方ffmpeg.org文档
  • 示例:仓库 doc/examples/(demux_decode.c、decode_video.c、transcode.c、mux.c、hw_decode.c 等)

7. 常见问题

现象 可能原因 处理
找不到编解码器 默认构建未启用外部库 使用 --enable-libx264 等重新 configure
编译/链接失败 缺少头文件或库路径 检查 pkg-config、-I/-L;树内可 make examples
解码/编码卡住 未处理 EAGAIN 或未刷新 按 send/receive 循环与 NULL 包刷新
内存泄漏 未 unref 包/帧 每次使用后 av_packet_unref/av_frame_unref
硬件加速不可用 驱动或构建未启用 确认 --enable-cuda/vaapi 等与运行时环境

提示:先跑通 doc/examples 中的 demux_decode 与 transcode,再对照完整文档深入各库与 API。

相关推荐
不吃鱼的猫7482 小时前
【从零手写播放器:FFmpeg 音视频开发实战】04-封装格式与多媒体容器
c++·ffmpeg·音视频
REDcker1 天前
FFmpeg完整文档
linux·服务器·c++·ffmpeg·音视频·c·后端开发
硬汉嵌入式1 天前
QEMU & FFmpeg作者Fabrice Bellard推出MicroQuickJS,一款面向嵌入式系统JavaScript引擎,仅需10K RAM
javascript·ffmpeg·microquickjs
Knight_AL2 天前
如何用 FFmpeg 处理 PCM 音频 & 判断 PCM 文件到底是什么格式
ffmpeg·音视频·pcm
binderIPC3 天前
macos环境下FFmpeg打包成.so文件
macos·ffmpeg·音视频
binderIPC3 天前
macos的FFmpeg环境搭建
macos·ffmpeg·音视频
TEC_INO4 天前
Linux_19:RV1126的OSD模块和SDL_TTF结合输出H264文件
linux·运维·ffmpeg
小鹿软件办公4 天前
一行命令搞定!用 FFmpeg 按指定码率压缩视频
ffmpeg·音视频
青芒.5 天前
10个20GB大视频如何高效处理?M3 Mac + FFmpeg 最佳实践全解析
macos·ffmpeg·音视频