Table of Contents

FFmpeg


安装

  1. MacOS:https://ffmpeg.org/,直接下载编译好的版本,是一个单独的可执行文件(Unix Executable File)
    1. 好像可以使用 Homebrew 安装?
  2. Windows:下载编译好的文件,配置PATH即可

使用例

合并视频轨道和音轨

# 合并一个mp4和一个mp3
# -c copy:视频和音频都不重新编码,直接拷贝
ffmpeg -i input.mp4 -i input.mp3 -c copy -map 0:v:0 -map 1:a:0 output.mp4

重新编码

# 更省空间/更稳质(CPU 软件编码:libx265 + CRF)
ffmpeg -i input.mov \
  -c:v libx265 -preset medium -crf 28 -pix_fmt yuv420p \
  -c:a aac -b:a 128k \
  -movflags +faststart -tag:v hvc1 \
  output.mp4
 
# 更快(Mac 硬件编码:hevc_videotoolbox,恒定质量)
ffmpeg -i input.mov \
  -c:v hevc_videotoolbox -q:v 65 -pix_fmt yuv420p \
  -c:a aac -b:a 128k \
  -movflags +faststart -tag:v hvc1 \
  output.mp4
 
# 适合用于重新编码 OpenCV 的输出
# -an:确保无音轨
# -crf:越大越小(常用 18~28;23 是很常用的平衡点)
# -preset:越慢越小(medium/slow 都行)
ffmpeg -y -i output_tmp.mp4 -an -c:v libx264 -crf 23 -preset medium output.mp4

提取字幕

# 提取第一条字幕(编号为0)
ffmpeg -i video.mkv -map 0:s:0 subtitle.srt

提取音轨

# 直接流拷贝(Stream Copy)
# 它不经过重新编码,速度极快且质量无损
# -vn: 禁用视频录制(Video None)
# -c:a copy: 直接复制音频流,不重新编码
ffmpeg -i input.mp4 -vn -c:a copy output.m4a
 
# -q:a 2: 设置质量级别(VBR)。范围 0-9,2 是高质量(约 190kbps),0 是最高质量
# 如果你想要固定比特率(如 320kbps),可以使用 -b:a 320k
ffmpeg -i input.mp4 -vn -q:a 2 output.mp3
 
# 如果视频里有多个音轨(比如中文、英文、解说),你可以指定提取哪一个
# -map 0:a:1: 提取第二个音轨(索引从 0 开始)
ffmpeg -i input.mp4 -map 0:a:1 -vn output.mp3

在视频中贴图

# 最简单:左上角整段贴图
ffmpeg -i input.mp4 -loop 1 -i image.png \
-filter_complex "overlay=10:10" \
-c:v libx264 -crf 20 -preset faster -c:a copy -shortest output.mp4
 
# -loop 1:把单张图片当作无限帧源。
# overlay=10:10:图片距左上角各 10 像素。
# -shortest:按最短输入结束(这里会跟随视频长度结束)。
# -c:a copy:音频直拷不重编码。

裁剪视频(画面)

ffmpeg -i input.mp4 -vf "crop=1720:980:100:100" -c:a copy output.mp4

缩放视频(画面)

# 先缩放到覆盖 1920x1080,再居中裁剪(最常用,确保不留黑边)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080" -c:a copy output.mp4
 
# 等价写法(用 crop 的 x/y 显式居中)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080:(in_w-1920)/2:(in_h-1080)/2" -c:a copy output.mp4

裁剪视频(长度)

前移元数据(Metadata)

视频串流的文件格式问题

  1. 放在文件服务器(比如WebDAV)上的媒体文件,通过网络进行串流的时候,有时候要等很久才能开始播放,这完全不符合流媒体文件格式设计的初衷
  2. 这通常不是因为 WebDAV 服务器的问题,而是该视频文件内部的数据排列顺序导致的
  3. 核心原因:MP4 的 moov 原子位置
  4. 绝大多数网络视频是 MP4 格式。MP4 文件就像一个容器,里面主要包含两部分数据
    1. mdat (Media Data): 这里面装着实际的视频流和音频流数据,体积最大
    2. moov (Movie Atom): 这里面是“索引”或“目录”。它告诉播放器视频有多长、分辨率是多少、每一秒的画面在 mdat 的哪个位置
  5. 当视频制作规范时,moov(目录)被放在了文件的最开头
  6. 很多非专业转码或直接下载的视频,默认会将 moov(目录)放在文件的最末尾
    1. 这是因为转码软件在生成视频时,必须先把所有画面生成完(写完 mdat),才知道最终的文件大小和索引信息,所以顺手就把目录写在了最后

将位于文件末尾的 moov 原子移动到文件开头。这个操作叫 “Qt-faststart”

# -c copy: 直接复制视频流和音频流,不进行重新编码(画质不变,速度极快)
ffmpeg -i input_video.mp4 -c copy -movflags +faststart output_video.mp4