我的论坛
登录

ffmpeg 基础教程

101
  • uvim
    管理员

    FFmpeg 被称为“多媒体界的瑞士军刀”,它功能极其强大,但学习曲线确实较陡峭。

    要学好 FFmpeg,不能只背命令,而要理解它的核心架构。下面我将为你梳理出一份从入门到进阶的全景式教程路线图。


    一、 核心概念:FFmpeg 如何处理视频?

    在操作之前,你需要理解数据流向的四个步骤:
    1. 解封装 (Demuxing):把封装好的容器(如 MP4, MKV)拆解,提取出原始的视频流、音频流和字幕流。
    2. 解码 (Decoding):把压缩的编码数据(如 H.264, AAC)还原成原始的图像帧(YUV/RGB)和采样数据(PCM)。
    3. 滤镜/编码 (Filtering/Encoding):对视频进行缩放、水印等处理,或者使用新的编码器进行压缩。
    4. 封装 (Muxing):把处理好的音视频重新塞进特定的容器里。


    二、 最核心的命令结构

    无论多复杂的命令,都离不开这个语法格式:
    ffmpeg -i [输入路径] [参数选项] [输出路径]

    • -i:输入文件。
    • -c:v (或 -vcodec):设置视频编码器(如 libx264, copy 表示直接拷贝不重新编码)。
    • -c:a (或 -acodec):设置音频编码器(如 aac)。
    • -b:v:设置视频码率。
    • -vf:视频滤镜(Video Filter)。

    三、 常见的高频操作(实战篇)

    1. 无损剪切与合并(极速)

    如果不重新编码,使用 -c copy,速度极快且无画质损失。
    * 截取视频片段:从第 10 秒开始,截取 5 秒长。
    ffmpeg -i input.mp4 -ss 00:00:10 -t 5 -c copy output.mp4
    * 合并视频:先创建一个 list.txt,内容为 file '1.mp4',然后执行:
    ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

    2. 格式转换与压缩

    • 转码:MP4 转 MKV

    ffmpeg -i input.mp4 output.mkv
    * 压缩视频:使用 H.264 编码,控制视频质量(CRF 值范围 0-51,18-28 是黄金区间,越小质量越好)。
    ffmpeg -i input.mp4 -vcodec libx264 -crf 23 output.mp4

    3. 画面处理(滤镜魔法)

    • 缩放视频:强制缩放到 1280x720。

    ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
    * 添加水印:将图片放在视频的坐标 (10, 10)。
    ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4

    4. 音频操作

    • 提取音频:

    ffmpeg -i input.mp4 -vn -acodec copy output.aac
    * 视频静音:
    ffmpeg -i input.mp4 -an output.mp4


    四、 资深工程师的建议:进阶学习路径

    1. 学会使用 ffprobe:
    这是 FFmpeg 套件中的工具,专门用来分析文件元数据。在写脚本前,先用 ffprobe -show_streams input.mp4 查看视频编码格式、码率、帧率等信息。

    2. 理解硬件加速:
    在生产环境中,CPU 编码效率低下。学习使用 NVIDIA 的 NVENC (通过 -c:v h264_nvenc) 或 Intel 的 QSV 编码,可以将速度提升 5-10 倍。

    3. 管道操作 (Piping):
    熟练在 Linux 环境下使用 | 管道,将 FFmpeg 的输出传递给其他处理逻辑,这是自动化流媒体服务器的技术基础。

    4. 关注性能瓶颈:
    调试时使用 -v error 查看错误报告,使用 -benchmark 测量处理耗时。


    五、 给新手的学习资源推荐

    • 官方文档:ffmpeg.org 是最权威的字典,遇到参数直接查。
    • Awesome FFmpeg:在 GitHub 上搜索这个仓库,里面有各种垂直领域的最佳实践案例。
    • 练习建议:别只看文档,尝试写一个 Shell 脚本,批量转换一个文件夹里的所有视频并打上日期水印。完成这个任务,你就入门了。
  • uvim
    管理员
    #1

    我将 FFmpeg 的常见用法按照业务场景进行了分类总结。你可以把这份清单当作你的“操作手册”,在遇到实际开发需求时直接查阅。


    一、 媒体文件处理类(转码/封装)

    1. 通用格式转换

       ffmpeg -i input.avi output.mp4

    2. 提取音频流(去视频化)

       ffmpeg -i input.mp4 -vn -acodec copy output.aac

    3. 提取视频流(去音频化)

       ffmpeg -i input.mp4 -an -vcodec copy output.mp4

    4. 改变视频分辨率(缩放)
    注意:若要保持长宽比,可使用 scale=1280:-1

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

    二、 内容截取与切割

    1. 精确剪切片段
    -ss 是开始时间,-t 是时长,-to 是结束时间点。

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

    2. 视频截图(提取第一帧/特定帧)

       ffmpeg -i input.mp4 -ss 00:00:05 -frames:v 1 output.jpg

    3. 视频转为 GIF 动图

       ffmpeg -i input.mp4 -ss 00:00:02 -t 3 -vf "fps=15,scale=320:-1:flags=lanczos" output.gif

    三、 合并与拼接

    1. 多视频合并(相同编码)
    创建一个 inputs.txt:

       file 'part1.mp4'
       file 'part2.mp4'

    执行命令:

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

    2. 音视频合并
    将音频文件 audio.mp3 合并到视频 video.mp4 中:

       ffmpeg -i video.mp4 -i audio.mp3 -c copy -map 0:v:0 -map 1:a:0 output.mp4

    四、 滤镜与复杂特效(Filter)

    1. 画中画(叠加)
    将 small.mp4 叠加在 big.mp4 的右下角:

       ffmpeg -i big.mp4 -i small.mp4 -filter_complex "overlay=main_w-overlay_w-10:main_h-overlay_h-10" output.mp4

    2. 在视频上添加文字(水印)
    需要系统支持 libfreetype。

       ffmpeg -i input.mp4 -vf "drawtext=text='My Logo':x=10:y=10:fontsize=24:fontcolor=white" output.mp4

    3. 视频旋转
    transpose=1 顺时针旋转90度。

       ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

    五、 直播与流媒体(进阶场景)

    1. 推流到 RTMP 服务器
    将本地文件推送到直播服务器:

       ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/stream

    -re 参数表示按原始帧率读取文件,直播推流必选。

    2. 采集桌面屏幕(录屏)
    * Windows (gdigrab): ffmpeg -f gdigrab -i desktop output.mp4
    * macOS (avfoundation): ffmpeg -f avfoundation -i "1:0" output.mp4


    六、 技术小贴士(工程师视角)

    • 关于 -c copy:

    这是最常用的优化技巧。如果只是更换容器格式(如从 .mkv 转 .mp4)或简单的剪切,务必加上此参数。它直接拷贝原始流数据,不进行解码和重编码,处理速度几乎由磁盘 I/O 决定,且画质零损耗。

    • 查看视频编码信息:

    不确定视频用什么编码?用 ffprobe。

        ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,width,height -of default=noprint_wrappers=1 input.mp4
    • 如何优化压缩质量?

    不要盲目调码率。使用 CRF(Constant Rate Factor),它是根据感知质量恒定画质。
    -c:v libx264 -crf 23 (x264 默认值是 23,范围 0-51。建议 18-28 之间,越低画质越好,体积越大)。

    • 硬件加速建议:

    如果是生产环境处理大批量视频,使用硬件解码器可以显著降低 CPU 负载:
    * NVIDIA: -c:v h264_nvenc
    * Intel: -c:v h264_qsv

发表回复

登录后回复