banner
Hi my new friend!

山河浪漫,
人间温暖。

Scroll down

引言

FFmpeg是一个强大的开源多媒体处理框架,被广泛应用于视频转码、编辑、压缩、流媒体等领域。本文将全面介绍FFmpeg的安装、基本概念、常用命令、高级特性。

一、FFmpeg简介与背景

1.1 什么是FFmpeg

FFmpeg是一套功能强大的开源跨平台多媒体处理工具集,最初由Fabrice Bellard开发。其名称来源于"Fast Forward MPEG",代表其处理MPEG视频的高效率特性。它能够实现视频转码、剪辑、合并、提取音频、添加滤镜等操作,是目前最受欢迎的多媒体处理框架之一。

1.2 核心组件

FFmpeg由以下几个核心组件组成:

  • ffmpeg:命令行工具,用于视频和音频的转换与处理
  • ffplay:简单的媒体播放器,用于快速预览媒体文件
  • ffprobe:用于分析多媒体流的工具,可提供详细的媒体文件信息
  • libavcodec:编解码库,支持几乎所有音视频编解码格式
  • libavformat:封装格式处理库,支持多种容器格式
  • libavfilter:多媒体滤镜库,提供各种音视频处理效果
  • libswscale:图像缩放和像素格式转换库

1.3 特性与优势

  • 全面格式支持:几乎支持所有音视频编码格式和容器格式
  • 高效处理:优化的算法和多线程支持,提供高效的媒体处理
  • 跨平台:支持Windows、macOS、Linux等主流操作系统
  • 活跃社区:持续更新和维护,定期发布新版本
  • 丰富的API:提供多种编程语言的绑定,方便集成到应用程序中

二、安装FFmpeg

2.1 Windows安装

  1. 访问FFmpeg官网下载Windows版本,选择安装包Windows builds from gyam.dev

选择windows builds from gyan.dev

  1. 下载最新版ffmpeg-release-essentials.zip,下载过程会很缓慢,还请大家耐心等待

下载最新版ffmpeg

  1. 下载完成后解压下载的文件到指定目录,如E:\ffmpeg-7.1.1-essentials_build

解压到指定目录

  1. 添加环境变量

编辑环境变量

设置环境变量

  1. 打开命令提示符,输入ffmpeg -version验证安装

验证安装

2.2 macOS安装

使用Homebrew安装:

brew install ffmpeg

如需安装带有额外功能的版本:

# 安装带有更多编码器支持的版本
brew install ffmpeg --with-fdk-aac --with-sdl2 --with-freetype --with-fontconfig

2.3 Linux安装

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg

CentOS/RHEL:

sudo yum install epel-release
sudo yum install ffmpeg ffmpeg-devel

编译安装最新版本:

# 下载源码
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg

# 配置并编译
./configure --enable-gpl --enable-libx264 --enable-libx265
make -j$(nproc)
sudo make install

三、FFmpeg核心概念

在深入学习FFmpeg命令之前,了解一些核心概念有助于更好地理解FFmpeg的工作原理。

3.1 容器与编码格式

  • 容器格式:如MP4, MKV, AVI, FLV等,是用来包装视频、音频和字幕等内容的封装格式
  • 编码格式:如H.264, H.265, VP9(视频)和AAC, MP3, FLAC(音频),是具体的压缩算法

3.2 流(Stream)

一个媒体文件通常包含多个流,如视频流、音频流和字幕流等。使用ffprobe可以查看媒体文件的流信息:

ffprobe -show_streams input.mp4

3.3 编码器与解码器

  • 编码器(Encoder):将原始音视频数据压缩成特定格式
  • 解码器(Decoder):将压缩的音视频数据解码为原始数据

查看可用编码器:

ffmpeg -encoders

查看可用解码器:

ffmpeg -decoders

3.4 滤镜(Filter)

FFmpeg的滤镜系统允许对音视频进行复杂处理,如裁剪、旋转、添加特效等。滤镜可以形成复杂的滤镜链或滤镜图。

查看可用的滤镜:

ffmpeg -filters

四、FFmpeg基本命令格式与示例

4.1 基本命令格式

ffmpeg [全局选项] [输入文件选项] -i 输入文件 [输出文件选项] 输出文件

以下是一些常见的命令示例:

4.1.1 简单格式转换

ffmpeg -i input.mp4 output.avi
  • -i input.mp4: 指定输入文件
  • output.avi: 指定输出文件,FFmpeg会根据文件扩展名自动选择编码器

4.1.2 指定编解码器

ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4
  • -c:v libx264: 使用H.264编码器处理视频流
  • -c:a aac: 使用AAC编码器处理音频流

4.1.3 控制比特率

ffmpeg -i input.mp4 -b:v 2M -b:a 128k output.mp4
  • -b:v 2M: 设置视频比特率为2Mbps
  • -b:a 128k: 设置音频比特率为128kbps

4.1.4 调整分辨率

ffmpeg -i input.mp4 -s 1280x720 output.mp4
  • -s 1280x720: 设置输出视频分辨率为1280x720

4.1.5 截取视频片段

ffmpeg -i input.mp4 -ss 00:01:30 -to 00:02:30 -c copy output.mp4
  • -ss 00:01:30: 从1分30秒处开始
  • -to 00:02:30: 截取到2分30秒处
  • -c copy: 使用stream copy模式,不重新编码(更快)

4.1.6 复杂滤镜示例

ffmpeg -i input.mp4 -vf "scale=1280:720,transpose=1,boxblur=5:1" -c:a copy output.mp4
  • -vf: 指定视频滤镜
  • scale=1280:720: 调整尺寸为1280x720
  • transpose=1: 旋转视频90度
  • boxblur=5:1: 添加模糊效果
  • -c:a copy: 复制音频流不变

4.1.7 使用全局选项

ffmpeg -y -loglevel warning -i input.mp4 -c:v libx264 -preset fast output.mp4
  • -y: 全局选项,覆盖输出文件而不询问
  • -loglevel warning: 全局选项,只显示警告和更高级别的消息

4.1.8 多输入示例

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -map 0:v:0 -map 1:a:0 output.mp4
  • -i video.mp4 -i audio.mp3: 指定两个输入文件
  • -map 0:v:0: 从第一个输入文件选择视频流
  • -map 1:a:0: 从第二个输入文件选择音频流

4.2 常用视频处理命令

4.2.1 视频格式转换

# MP4转AVI
ffmpeg -i input.mp4 output.avi

# MP4转WebM
ffmpeg -i input.mp4 -c:v libvpx -crf 10 -b:v 1M -c:a libvorbis output.webm

# MP4转GIF
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v gif output.gif

4.2.2 视频剪切

# 剪切视频片段(从30秒开始,持续10秒)
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:10 -c copy output.mp4

# 精确剪切(先定位后解码,更精确但更慢)
ffmpeg -ss 00:00:30 -i input.mp4 -t 00:00:10 -c:v libx264 -c:a aac output.mp4

4.2.3 视频压缩

# 降低视频比特率进行压缩
ffmpeg -i input.mp4 -b:v 1M output.mp4

# 使用CRF方式压缩(保持较好质量,值越小质量越高,一般在18-28之间)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

# 降低分辨率压缩
ffmpeg -i input.mp4 -vf "scale=1280:720" -c:a copy output.mp4

4.2.4 提取音频

# 从视频中提取音频(保持原编码)
ffmpeg -i input.mp4 -vn -acodec copy output.aac

# 提取并转换音频格式
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 192k -f mp3 output.mp3

4.2.5 视频合并

先创建一个文件列表filelist.txt

file 'video1.mp4'
file 'video2.mp4'
file 'video3.mp4'

然后合并:

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

4.2.6 添加水印

# 添加图片水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4

# 添加文字水印
ffmpeg -i input.mp4 -vf "drawtext=text='水印文字':x=10:y=10:fontsize=24:fontcolor=white" output.mp4

# 添加半透明水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=(W-w)/2:(H-h)/2:alpha=0.5" output.mp4

4.2.7 视频截图

# 截取某一时刻的图片
ffmpeg -i input.mp4 -ss 00:00:10 -frames:v 1 screenshot.jpg

# 每隔一秒截一张图
ffmpeg -i input.mp4 -vf fps=1 thumb%04d.jpg

# 创建视频缩略图网格
ffmpeg -i input.mp4 -vf "select=not(mod(n\,300)),scale=320:180,tile=3x4" -frames:v 1 thumbnail.jpg

视频截图:每一秒截一张图片效果
视频截图

4.3 高级命令示例

4.3.1 视频加速/减速

# 视频加速(这里是2倍速)
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -filter:a "atempo=2.0" output.mp4

# 视频减速(这里是0.5倍速)
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" -filter:a "atempo=0.5" output.mp4

4.3.2 视频拼接(画面拼接)

# 水平拼接两个视频
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v]" -map "[v]" -c:v libx264 output.mp4

# 垂直拼接两个视频
ffmpeg -i top.mp4 -i bottom.mp4 -filter_complex "[0:v][1:v]vstack=inputs=2[v]" -map "[v]" -c:v libx264 output.mp4

4.3.3 画中画效果

ffmpeg -i main.mp4 -i overlay.mp4 -filter_complex "[1:v]scale=300:-1[pip];[0:v][pip]overlay=main_w-overlay_w-10:main_h-overlay_h-10[v]" -map "[v]" -map 0:a -c:v libx264 -c:a copy output.mp4

4.3.4 视频淡入淡出效果

# 视频开头5秒淡入
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=5" -c:a copy output.mp4

# 视频结尾5秒淡出
ffmpeg -i input.mp4 -vf "fade=t=out:st=25:d=5" -c:a copy output.mp4

# 同时设置淡入淡出
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=5,fade=t=out:st=25:d=5" -c:a copy output.mp4

4.3.5 色彩调整

# 调整亮度和对比度
ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2" output.mp4

# 黑白滤镜
ffmpeg -i input.mp4 -vf "colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3" output.mp4

4.3.6 音频操作

# 调整音量(这里提高50%)
ffmpeg -i input.mp4 -af "volume=1.5" output.mp4

# 规范化音频(使最高音量达到0dB)
ffmpeg -i input.mp4 -af "loudnorm=I=-16:TP=-1.5:LRA=11" output.mp4

# 添加回声效果
ffmpeg -i input.mp4 -af "aecho=0.8:0.9:1000:0.3" output.mp4

五、FFmpeg滤镜系统详解

滤镜是FFmpeg中最强大的功能之一,它可以实现各种复杂的音视频处理效果。

5.1 基本滤镜语法

ffmpeg -i input.mp4 -vf "滤镜1=参数,滤镜2=参数" output.mp4

5.2 常用视频滤镜

5.2.1 裁剪视频(crop)

# 裁剪中心区域300x200大小的画面
ffmpeg -i input.mp4 -vf "crop=300:200:in_w/2-150:in_h/2-100" output.mp4

# 参数解释: crop=宽:高:x坐标:y坐标

5.2.2 调整大小(scale)

# 调整为720p,保持宽高比
ffmpeg -i input.mp4 -vf "scale=1280:720:force_original_aspect_ratio=decrease" output.mp4

# 仅设置宽度,高度自动计算
ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4

5.2.3 旋转和翻转(rotate, transpose, hflip, vflip)

# 旋转90度
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

# 水平翻转
ffmpeg -i input.mp4 -vf "hflip" output.mp4

# 垂直翻转
ffmpeg -i input.mp4 -vf "vflip" output.mp4

5.2.4 画面稳定(vidstabdetect, vidstabtransform)

# 第一步:分析视频抖动
ffmpeg -i input.mp4 -vf vidstabdetect=stepsize=6:shakiness=8:accuracy=9:result=transform.trf -f null -

# 第二步:应用稳定变换
ffmpeg -i input.mp4 -vf vidstabtransform=input=transform.trf:zoom=1:smoothing=30 output.mp4

5.3 复杂滤镜图

使用滤镜复杂图可以实现更复杂的效果:

# 创建带有文字和图片水印的视频
ffmpeg -i input.mp4 -i logo.png -filter_complex "[0:v]drawtext=text='示例文字':fontcolor=white:fontsize=24:x=10:y=10[text];[text][1:v]overlay=W-w-10:H-h-10" output.mp4

六、批处理与自动化

6.1 Windows批处理脚本

这个脚本是一个Windows批处理文件(.bat),用于自动将当前文件夹中所有MP4视频文件转换为WebM格式。

@echo off
:: 批量转换MP4为WebM
for %%i in (*.mp4) do (
    echo Converting %%i to WebM...
    ffmpeg -i "%%i" -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus "%%~ni.webm"
)
echo Done!

6.2 Linux/macOS Shell脚本

批量压缩当前目录下的所有MP4视频文件

#!/bin/bash
# 批量压缩视频

# 确保输出目录存在
mkdir -p compressed

# 遍历当前目录中所有MP4文件
for file in *.mp4; do
    echo "Compressing $file..."
    ffmpeg -i "$file" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k "compressed/${file%.*}_compressed.mp4"
done

echo "Compression completed!"

6.3 使用FFmpeg与Python结合

用于将视频压缩至精确指定的文件大小(MB)

import os
import subprocess

def convert_video(input_file, output_file, target_size_mb):
    """ 将视频压缩到指定大小(MB) """
    # 获取视频时长(秒)
    duration_cmd = [
        'ffprobe', '-v', 'error', '-show_entries', 'format=duration',
        '-of', 'default=noprint_wrappers=1:nokey=1', input_file
    ]
    duration = float(subprocess.check_output(duration_cmd).decode('utf-8').strip())
    
    # 计算目标比特率(bit/s)
    target_size_bits = target_size_mb * 8 * 1024 * 1024
    bitrate = int(target_size_bits / duration)
    
    # 运行FFmpeg命令
    cmd = [
        'ffmpeg', '-i', input_file, '-c:v', 'libx264', 
        '-b:v', f'{ bitrate}', '-pass', '1', '-f', 'mp4', '/dev/null'
    ]
    subprocess.call(cmd)
    
    cmd = [
        'ffmpeg', '-i', input_file, '-c:v', 'libx264',
        '-b:v', f'{ bitrate}', '-pass', '2', '-c:a', 'aac', '-b:a', '128k',
        output_file
    ]
    subprocess.call(cmd)

# 使用示例
convert_video('input.mp4', 'output.mp4', 50)  # 压缩到50MB

总结

FFmpeg是一个强大的开源多媒体框架,可以执行几乎所有音视频文件的转换、抓取、剪辑和剪裁等处理操作。本文从安装配置到高级应用全面理论体系中,深入细致的介绍了基础命令、使用技巧、滤镜系统以及自动化脚本等各个核心模块,为广大读者打造了一个全面系统的路径,也即从入门到精通的学习体系。这些技术,不论是个人创作还是专业开发,都能极大地提高音视频处理效率,是实际媒体处理的万金油,是多媒体应用开发和内容制作的重要武器。

原文链接:https://blog.csdn.net/weixin_66401877/article/details/146449965

我很可爱,请给我钱

昵称
邮箱
0/200
  • 😂
  • 😀
  • 😅
  • 😊
  • 🙂
  • 🙃
  • 😌
  • 😍
  • 😘
  • 😜
  • 😝
  • 😏
  • 😒
  • 🙄
  • 😳
  • 😡
  • 😔
  • 😫
  • 😱
  • 😭
  • 💩
  • 👻
  • 🙌
  • 🖕
  • 👍
  • 👫
  • 👬
  • 👭
  • 🌚
  • 🌝
  • 🙈
  • 💊
  • 😶
  • 🙏
  • 🍦
  • 🍉
  • 😣
  • OωO
  • |´・ω・)ノ
  • ヾ(≧∇≦*)ゝ
  • (☆ω☆)
  • (╯‵□′)╯︵┴─┴
  •  ̄﹃ ̄
  • (/ω\)
  • ∠( ᐛ 」∠)_
  • (๑•̀ㅁ•́ฅ)
  • →_→
  • ୧(๑•̀⌄•́๑)૭
  • ٩(ˊᗜˋ*)و
  • (ノ°ο°)ノ
  • (´இ皿இ`)
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • (╯°A°)╯︵○○○
  • φ( ̄∇ ̄o)
  • ヾ(´・ ・`。)ノ"
  • ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
  • (ó﹏ò。)
  • Σ(っ °Д °;)っ
  • ( ,,´・ω・)ノ"(´っω・`。)
  • ╮(╯▽╰)╭
  • o(*////▽////*)q
  • >﹏<
  • ( ๑´•ω•) "(ㆆᴗㆆ)
  • Emoji
  • 颜文字
0 条评论