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。

相关推荐
小何开发1 天前
ffmpeg 安装与使用: 将视频分片与组装
ffmpeg·音视频
道剑剑非道2 天前
FFmpeg + Qt 实现摄像头采集与 MP3 背景音乐 RTSP 推流
开发语言·qt·ffmpeg
道剑剑非道3 天前
FFmpeg 6.0 实战:用 C++ 封装摄像头采集与 RTSP 推流
开发语言·c++·ffmpeg
Gc9umsbL13 天前
从FLAC到WAV:whisper.cpp中的FFmpeg音频预处理全解析
ffmpeg·whisper·音视频
angushine3 天前
ffmpeg+nginx搭建HLS 推流
运维·nginx·ffmpeg
EasyGBS4 天前
国标GB28181视频平台EasyGBS解决多格式视频流无缝转换难题
ffmpeg·音视频
树下水月5 天前
关于使用ffmpeg的一些使用方法
ffmpeg
憧憬成为原神糕手5 天前
FFmpeg 音视频开发笔记(一):H.264 解码为 YUV
笔记·ffmpeg·音视频
阳光开朗男孩5 天前
FFmpeg从入门到精通-1.ffmpeg简介
ffmpeg
luoqice9 天前
RTMP视频流的帧格式分析
网络·ffmpeg