本文目录

[[toc]]

常见命令

  • 提取 mp3ffmpeg -i 输入视频文件.mp4 -q:a 0 -map a 输出音频文件.mp3

    • -i 输入视频文件.mp4 : 指定输入的视频文件。
    • -q:a 0 : 指定音频质量, 0 表示最高质量。可以根据需要调整这个参数。
    • -map a : 指定提取音频轨道, a 表示音频。
    • 输出音频文件.mp3 : 输出文件保存为 MP3 格式。
  • 提取 accffmpeg -i 输入视频文件.mp4 -vn -acodec copy 输出音频文件.aac

    • -vn :表示不包含视频轨道
    • -acodec copy : 直接复制输入文件的音频流到输出文件,而不进行重新编解码
  • 提取 wavffmpeg -i 输入视频文件.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 输出音频文件.wav

    • -vn :表示不包含视频轨道
    • -acodec pcm_s16le : 指定音频编码为 PCM , WAV 格式常用的编码方式。
    • -ar 44100 : 设置音频采样率为 44100 Hz 。
    • -ac 2 : 设置为双声道音频。
    • 输出音频文件.wav : 输出文件保存为 WAV 格式。
  • B 站移动端缓存视频合并 : ffmpeg -i video.m4s -i audio.m4s -c:v copy -c:a copy output.mp4

FFmpeg 处理流程

  1. 将输入文件按文件格式解析为数据包
  2. 将数据包解码为原始数据
  3. 将原始数据编码
  4. 将编码后的数据包按文件格式输出
graph LR
  input[输入文件]
  output[输出文件]
  encode[编码数据包]
  decode[解码数据包]
  data[解码后的数据帧]

  input -->|demuxer| encode
  encode -->|decoder| data
  data -->|encoder| decode
  decode -->|muxer| output

命令分类

基本信息查询

  • -version: 显示版本

  • -demuxers: 显示所有可用的 demuxer ,也就是支持解析什么格式

  • -muxers: 显示所有可用的 muxer ,也就是支持转换成什么格式

  • -devices: 显示可用的设备,用于数据采集、数据输入等

  • -codecs: 显示所有可用的编码器、解码器

  • -decoders: 显示所有可用的解码器

  • -encoders: 显示所有可用的编码器

  • -bsfs: 显示比特流 filter

  • -formats: 显示可用的格式

  • -protocols: 显示可用的协议

  • -filters: 显示可用的过滤器

  • -pix_fmts: 显示可用的像素格式

  • -sample_fmts: 显示可用的采样格式

  • -layouts: 显示 channel 名称

  • -colors: 显示识别的颜色名称

录制

Windows: ffmpeg -f gdigrab -i desktop -f mp4 d:/out.mp4

  • -f: 采集什么格式的数据
  • -i: 指定从哪里采集数据
  • -s: 指定视频分辨率
  • -r: 指定帧率
  • -ac: 指定音频声道数
    • 1: 单声道
    • 2: 立体声
    • 6: 5.1 环绕声
    • 8: 7.1 环绕声

Window

常见输入格式:

  • dshow: DirectShow 格式,用于录制 Windows 上的摄像头、麦克风、屏幕、窗口等
    • 使用 ffmpeg -list_devices true -f dshow -i dummy 命令列出可用的视频设备及其对应的名称和索引号,然后根据需要选择对应的索引号或设备名称
  • gdigrab: GDI 抓取输入格式,用于录制 Windows 上的屏幕或串口,可以选择特定窗口录制
    • 不需要设备索引,直接使用 -offset_x-offset_y-video_size 等参数指定需要录制的屏幕区域或窗口标题即可
  • vfwcap: 录制视频设备(如摄像头)的输入源
    • 使用 ffmpeg -list_devices true -f vfwcap -i dummy 命令列出可用的视频设备及其对应的名称和索引号,然后根据需要选择对应的设备名称或索引号

Linux

  • v412: Video for linux 2 输入格式,用于录制视频设备,如 USB 摄像头
    • 使用 v4l2-ctl --list-devices 命令列出可用的视频设备及其对应的名称和索引号,然后根据需要选择对应的设备名称或索引号
  • alsa: Advanced Linux Sound Architecture输入格式,用于录制 Linux 上的音频设备,如麦克风、扬声器
    • 不需要设备索引,直接使用 ffmpeg -f alsa -i default 参数录制默认音频设备
  • x11grab: X11 抓取输入格式,用于录制 X Window 系统上的屏幕或窗口
    • 不需要设备索引,直接使用 -offset_x-offset_y-video_size 等参数指定需要录制的屏幕区域或窗口标题即可

Mac

  • avfoundation: AVFoundation输入格式,用于录制Mac上的摄像头、麦克风、屏幕
    • 使用 ffmpeg -f avfoundation -list_devices true -i "" 命令列出可用的视频设备及其对应的名称和索引号,然后根据需要选择对应的设备名称或索引号
  • qtkit: QuickTime Kit 输入格式,用于录制 Mac 上的摄像头、麦克风
    • 使用 ffmpeg -f qtkit -list_devices true -i "" 命令列出可用的视频设备及其对应的名称和索引号,然后根据需要选择对应的设备名称或索引号

分解、复用

例如: ffmpeg -i xxx.mov -vcodec copy -acodec copy xxx.mp4

  • -vn: 丢弃视频

  • -vcodec: 针对视频进行什么操作

    • copy: 复制视频数据
  • -an: 丢弃音频

  • -acodec: 针对音频进行什么操作

    • copy: 复制视频数据

处理原始数据

原始数据分为 音频数据( PCM )视频数据( YUV )

提取 PCM 数据

ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm

提取音频的时候需要指定音频采样率,也就是 -ar 44100 ,其中 a 代表 audior 代表 rate

-ac2 是指使用双声道, a 代表 audioc 代表 channel

-f s16le 指提取出来的音频数据存储格式, s16le 指 signed 16 bits little endian ,即:有符号 16 位小端

提取出来的音频也是原始数据,播放的时候需要补充采样率、声道数等数据,例如: ffplay -ar 44100 -ac 2 -f s16le out.pcm

提取 YUV 数据

ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv

提取原始数据一定要指定像素格式,也就是 -pix_fmt yuv420p

抽取出来的视频是原始数据,播放时需要手动指定分辨率,比如: ffplay -s 1024 * 600 out.yuv

长度裁剪、合并

长度裁剪

示例: ffmpeg -i input.mp4 -ss 00:00:00 -t 10 out.ts

  • -ss: 开始时间,格式为 小时:分钟:秒
  • -t: 视频长度,单位为 秒

合并

示例: ffmpeg -f concat -i inputs.txt out.flv

inputs.txt 格式为:

file '1.ts'
file '2.ts'

图片、视频互转

视频转图片

示例: ffmpeg -i input.flv -r 1 -f image2 image-%3d.jpeg

  • -r 1: 帧率为 1 ,每一秒取一张图
  • -f image2: 指定转为图片
  • image-%3d.jpeg: 输出文件格式命名, %3d 表示 3 位整数

图片转视频

示例: ffmpeg -i image-%3d.jpeg out.mp4

直播

推流

示例: ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName

  • -re: 减慢帧率与速度,将帧率与速度与流同步

拉流

示例: ffmpeg -i rtmp://server/live/streamName -c copy dump.flv

转流

示例: ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream

实时推流桌面

示例: ffmpeg -framerate 15 -f gdigrab -i desktop -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room

滤镜

将视频原有尺寸宽高裁剪 200pxffmpeg -i input.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c"a copy out.mp4

-vf: 针对视频应用滤镜 crop: 滤镜名,用于裁剪 in_w: 视频宽度 in_h: 视频高度

裁剪滤镜格式为: crop=out_w:out_h:x:y

  • out_w: 最终视频宽度
  • out_h: 最终视频高度
  • x: 裁剪保留的中心点 x 坐标
  • y: 裁剪保留的中心点 y 坐标