操作音视频必备工具-FFMPEG

89 ·
0 ·
20天前
最新一次编辑的原因:

操作音视频必备工具-FFMPEG

A complete, cross-platform solution to record, convert and stream audio and video.

FFMPE是音视频处理最常用的开源软件,本文主要介绍它的命令行工具。

首先,安装FFMPEG,

装不上请自行百度。

一些概念

支持的封装格式

复习一下,我们常见的视频文件,其实是一个容器,里面包含的视频数据、音频数据、字幕(非必须)及一些元数据(视频标题,时长,分辨率信息)等。常见的封装格式有(通过后缀名反映封装格式)

MP4
MKV
WebM
AVI

查看ffmpeg支持的封装格式(container)

ffmpeg -formats

以上输入会很多,可以使用grep过滤,例如我们想查看是否支持FLV格式,可以使用以下命令:

ffmpeg -codecs | grep FLV

支持的编码格式

上面说过,音视频文件需要经过编码压缩,才能保存为文件。不同的编码格式有不同的压缩率,导致不同的清晰度和文件大小。

常见的视频编码格式如下:

H.262
H.264
H.265
MPEG-4

常见的音频编码格式如下:

MP3
AAC

查看ffmpeg支持的编码格式,视频编码和音频编码都在内

ffmpeg -codecs

编码器

编码器(encoders)是实现某种编码格式的库文件,只有安装了某种格式的编码器,才能实现对应格式视频/音频的编解码。

FFMPEG内置的视频编码器

libx264:最流行的开源 H.264 编码器
NVENC:基于 NVIDIA GPU 的 H.264 编码器
libx265:开源的 HEVC 编码器
libvpx:谷歌的 VP8 和 VP9 编码器
libaom:AV1 编码器

音频编码器

libfdk-aac
aac

以下命令查看已安装的编码器

ffmpeg -encoders

ffprobe查看视频信息

ffprobe是ffmpeg提供的一个命令行工具,用来查看视频元数据以及音视频码流的编码信息等,使用很简单

ffprobe 1.mp4

输出如下:

image-20210829113745898

ffmpeg命令行使用格式

ffmpeg {1} {2} -i {3} {4} {5}

五个部分的参数依次如下:

  •  
    1. 全局参数
  •  
    1. 输入文件参数
  •  
    1. 输入文件,必需
  •  
    1. 输出文件参数
  •  
    1. 输出文件,必需

举个简单的栗子:

ffmpeg -i 1.mp4 output.webm

上面的代码是把封装格式为mp4的文件转成封装格式为webm格式的文件,只输入了输入文件和输出文件。

以上代码没有指定视频码流的编码格式的音频码流的编码格式,ffmpeg会自动选择编码格式具体选择的是什么编码格式,可以等转换完成之后自己使用ffprobe查看一下。ffprobe output.webm

如果只想转换封装格式,编码格式不变,可以在输出文件参数那里添加-c copy

ffmpeg -i 1.mp4 -c copy output.avi

常见参数

  • -c:指定编码器
  • -c copy:直接复制,不经过重新编码(这样比较快)
  • -c:v:指定视频编码器
  • -c:a:指定音频编码器
  • -i:指定输入文件
  • -an:去除音频流
  • -vn: 去除视频流
  • -preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
  • -y:不经过确认,输出时直接覆盖同名文件。

常见用法

建议新建个文件夹,把所有的命令都试验一遍吧

查看视频信息

使用ffprobe查看视频信息

参数格式:ffprobe [options] [input_file]

# 最简单用法
ffprobe 1.mp4
# 不显示欢迎信息,只显示流相关信息
ffprobe -hide_banner 1.mp4
# 以json形式显示每个流信息
ffprobe -print_format json -show_streams 1.mp4
# 显示容器格式相关信息
ffprobe -show_format 1.mp4

参数说明:

  • hide_banner 不显示欢迎信息和配置信息,只显示视频元数据
  • show_format 显示容器格式相关信息

转换编码格式

转换容器格式和编码格式。

如果没有手动指定封装格式中视频流和音频流的编码格式,ffmpeg会根据输出的封装格式自行决定使用什么编码。

ffmpeg -i input.mp4 output.mpeg

指定视频码流编码格式。

转化为H.264编码,一般使用编码器libx264

# 转化为 H.264格式
ffmpeg -i 1.mp4 -c:v libx264 output.mp4
# 转化为 H.265格式
ffmpeg -i 1.mp4 -c:v libx265 output-265.mp4

参数说明:

  • -c:v 指定视频编码器
  • -c:a 指定音频编码器

转换容器格式

mp4转为avi

ffmpeg -i input.mp4 -c copy output.avi

上面例子中,只是转一下容器,内部的编码格式不变,所以使用-c copy指定直接拷贝,不经过转码,这样比较快

# 不使用 -c copy参数,ffmpeg会自己判断输入文件的编码
ffmpeg -i input.mp4 output.webm

转换时可以手动指定编码格式

# 转换时可以手动指定编码格式
ffmpeg \\
-y \\ # 全局参数
-c:a libfdk_aac -c:v libx264 \\ # 输入文件参数
-i input.mp4 \\ # 输入文件
-c:v libvpx-vp9 -c:a libvorbis \\ # 输出文件参数
output.webm # 输出文件

调整码率(比特率)

调整码率指的是,改变编码的比特率,一般用来将视频文件的体积变小。

比特率计算:视频多少比特(bit)/视频时长(s)

例如一个视频是2.6M 换算成比特 2.6x1024x1024x8=21810380.8 bit

视频是22s

比特率:21810380.8/22=991 Kb/s

设置码率:

# 设置输出的码率为1.5M,ps:最后的输出视频码率会有一些小的偏差
ffmpeg -i input.mp4 -b 1.5M output.mp4
# 默认情况下,ffmpeg使用可变比特率(VBR)进行设置,静态的画面使用较少的码率,动态的画面使用较多的码率

参数说明

  • -b 指定视频流和音频流总体的比特率
  • 可以使用-b:v -b:a 分别指定视频流和音频流的比特率

也可以手动指定 最小比特率,最大比特率,以及缓冲区的大小:

ffmpeg -i input.mp4 -minrate 964k -maxrate 3856k -bufsize 2000k output.mp4

如果是视频会议之类的实时视频流,可以使用固定码率(CBR):

固定码率是指所有的画面使用相同的码率

# -b -minrate -maxrate 需要指定固定的值,maxrate需要指令一个bufsize(缓冲区大小)
ffmpeg -i input.mp4 -b 0.5M -minrate 0.5M -maxrate 0.5M -bufsize 1M output.mp4

改变分辨率

# 将分辨率调整为640*480 
ffmpeg -i input.mp4  -vf scale=640:480 output.mp4

# 按照原比率进行调整
ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4

参数说明

  • vf 滤镜
  • vf scale 调整分辨率

分离视频(去除视频中的音频)

# 
ffmpeg -i input.mp4 -c:v copy -an output.mp4

参数说明

  • an 去除音频流

分离音频

ffmpeg -i input.mp4 -vn -c:a copy output.aac

参数说明

  • vn 表示去掉视频
  • c:a copy表示不改变音频编码

添加音轨

将外部音频加入视频,比如添加背景音乐或者旁白

# 如果视频原来有声音,不会添加成功,所以需要先去除视频中原来的音频
# 输入有两个文件,ffmpeg会将它们合成为一个文件
ffmpeg -i input.aac -i input.mp4 output.mp4

截图

从指定时间开始,连续对1秒钟的视频进行截图

# 从00:00:05s开始,连续对1秒钟的视频进行截图
ffmpeg -y -i input.mp4 -ss 00:00:05 -t 00:00:01 output_%3d.jpg

如果只需要截取一帧

# 从00:00:10s开始截取一帧
ffmpeg -ss 00:00:10 -i input -vframes 1 -q:v 2 output.jpg

参数说明

  • vframes 1 指定只截取一帧
  • q:v 2表示输出图片的质量 一般是1至5之间

分割一个mp4文件到多个小的mp4文件

可以指定开始时间和持续时间,也可以指定结束时间

ffmpeg -ss <start> -i <input> -t <duration> -c copy <output>
ffmpeg -ss <start> -i <input> -to <end> -c copy <output>

示例:

# 将视频从0s分割到5s的位置 
ffmpeg -ss 00:00:00 -i 1.mp4 -c copy -t 5 aqgy-1.mp4
# 示例:将一个1分30s的视频分成4段
ffmpeg -ss 00:00:00 -i 1.mp4 -c copy -t 00:00:22 aqgy-1.mp4
ffmpeg -ss 00:00:22 -i 1.mp4 -c copy -t 00:00:22 aqgy-2.mp4
ffmpeg -ss 00:00:44 -i 1.mp4 -c copy -t 00:00:22 aqgy-3.mp4
ffmpeg -ss 00:01:06 -i 1.mp4 -c copy -t 00:00:22 aqgy-4.mp4

 


本文为转载内容 原文链接:https://juejin.cn/post/7002288264413446157
本文链接:https://www.upupor.com/u/21083117201067127808 复制

无评论内容,快来评论吧

推荐阅读