ffmpeg安装及使用

发布时间 2023-05-29 21:16:56作者: jack_Meng

下载

下载地址:https://ffmpeg.org/download.html

然后按照下图点击,找到Release部分下载一个即可。
在这里插入图片描述
在这里插入图片描述

安装

所谓安装就是解压并配置“path”环境变量
将安装包解压至任意目录,比如我这里是D:\Program\ffmpeg-5.0.1-full_build
按照以下顺序点击:“此电脑(右键)——属性——高级系统设置——环境变量”
然后把ffmpeg.exe所在路径,即D:\Program\ffmpeg-5.0.1-full_build\bin添加到Path中,之后一路确定即可。
在这里插入图片描述
在这里插入图片描述

验证安装

打开cmd,输入ffmpeg,出现正常的程序说明,就表明安装成功了
在这里插入图片描述

官方使用说明

官方使用说明在线文档:https://ffmpeg.org/ffmpeg.html

日常使用命令

查看视频信息

ffmpeg -i input.mp4

显示如下:
在这里插入图片描述
从上面可以得到如下信息:

视频编码:h264
色彩格式:yuvj420p
色域范围:bt709
分辨率:1080x1920(width x height)
视频码率:14309 kbps
帧率:30 fps
音频编码:aac
音频码率:115 kbps
音频采样率:44100 Hz

最简单用法

ffmpeg -i input.mp4 -y output.avi

-i:指定输入
-y:输出如果重名直接覆盖

以拷贝的形式转格式,不重新编码,所以速度很快

ffmpeg -i input.mp4 -vcodec copy -acodec copy output.avi

-vcodec copy:拷贝视频
-acodec copy:拷贝音频

改变帧率

ffmpeg -i input.mp4 -r 10 -y output.mp4

-r 10:将输出帧率改为10 fps

改变编码

比如使用h265编码

ffmpeg -i input.mp4 -vcodec libx265 -y output.mp4

之后再查看视频信息可以看到(hevc = h265):

Stream #0:00x1: Video: hevc (Main) (hev1 / 0x31766568)

控制转码质量

ffmpeg -i input.mp4 -crf 35 -y output.mp4

ffmpeg -i input.mp4 -qp 30 -y output.mp4

QP(Quantization Parameters)和CRF(Constant Rate Factor)都是数值越小画质越好,数值越大画质越差。

QP在整个编码中使用相同的量化参数。

而CRF则具备自适应调节QP的能力,在画面运动比较强的时候使用高QP,在画面运动比较小的时候使用低QP。因为当画面运动比较强的时候,人的注意力常常不会被画质所吸引,所以QP大一些,也就是说画质差一些,不会造成太大的主观体验上的影响;反之当画面运动很小时,人的注意力有充分的空闲去注意画质问题,此时需要QP小一些,画质好一些,以避免带来糟糕的主观体验。另外与CRF名字呼应的一点,画面运动强时,视频片段倾向于有比较高的码率,使用大的QP有助于降低码率;画面运动小时,视频片段倾向于有比较低的码率,使用小QP可以提升一些码率,所以整体而言CRF会起到稳定码率的作用。

一般来说,使用CRF的情况多于QP,如果不是对QP有特定需求,那么首选CRF模式。在几乎相同的视觉效果的情况下,CRF一般比QP能节省一些码率。

关于CRF的取值范围和默认值可参考如下:
在这里插入图片描述

QP在libx264情况下取值范围也是0-51。

控制输出码率

ffmpeg -i input.mp4 -b:v 5M -y c.mp4

其中关键性的参数是-b:v 5M,指输出码率限制在5M bps。

但请注意,这个模式只是控制视频最终的码率,并不意味着视频中码率一直保持固定值,事实上在这个模式下,视频码率变化反而会有一些不受控,有时(特别是每个转场后clip的初始一些帧)会特别低。

时序裁剪

ffmpeg -i input.mp4 -ss 0:0:5 -t 0:0:4 -y output.mp4

-ss:指定截取的起始时间点,格式是hh:mm:ss
-t:截取的持续时间(duration),格式也是hh:mm:ss;或者简单写一个数字,单位是秒。

空间裁剪

ffmpeg -i input.mp4 -vf crop=500:1000:0:0 -y output.mp4

-vf 表示设置video相关的filters
crop后面的参数格式是width:height: x:y。width和height是输出视频的宽高;x,y是输出视频的左上顶点的坐标。

旋转视频

ffmpeg -i input.mp4 -vf rotate=PI/4 -y output.mp4

rotate:以视频中心为旋转点,顺时针旋转视频,视频原本的宽高保持不变,所以旋转后视频会有内容缺失以及黑边。

缩放视频

ffmpeg -i input.mp4 -vf scale=360:540 -y output.mp4
ffmpeg -i input.mp4 -vf scale=360:-1-y output.mp4

scale:格式是 width:height,其中一项可以设置成-1,此时会根据另一条边的比例自动计算。

抽帧

ffmpeg -i input.mp4 .\temp\frame_%3d.png

帧号从1开始计数,路径必须已经存在。

ffmpeg -i input.mp4 -r 1 .\temp\frame_%3d.png

-r 1:每秒抽取1帧,帧号仍然从1开始连续计数。(第一帧看起来似乎有点重复)

ffmpeg -i input.mp4 -vframes 10 .\temp\frame_%3d.png

-vframes 10:指定抽帧数量,总共抽10帧。

ffmpeg -i input.mp4 -vf select=eq(pict_type\,I) -vsync vfr .\temp2\frame_%3d.png
ffmpeg -i input.mp4 -vf select=eq(pict_type\,P) -vsync vfr .\temp2\frame_%3d.png
ffmpeg -i input.mp4 -vf select=eq(pict_type\,B) -vsync vfr .\temp2\frame_%3d.png

提取IPB帧,其中-vsync vfr选项可以删除掉重复帧,不然提取出来的结果有大量重复图片。
但还是注意,这种情况下ffmpeg抽取的帧仍然是从1开始连续计数,所以就无法知道单独抽取出来的IPB帧真实的帧号序列。可以使用下面命令打印帧类型,然后手动重命名。

ffprobe -i input.mp4 -select_streams v -show_entries frame=pict_type

上述命令打印结果如下,想要把帧号对应起来,需要比较多的手动操作:

[FRAME]
pict_type=I
[SIDE_DATA]
[/SIDE_DATA]
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]
[FRAME]
pict_type=P
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]

IPB帧含义简介:

  • I帧:表示关键帧,是最完整的帧画面,一般视频封面都选择I帧。
  • P帧:单预测帧,利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码。
  • B帧:双向预测帧,利用双向帧进行预测编码。

单独提取视频

ffmpeg -i input.mp4 -an -y video.mp4
ffmpeg -i input.mp4 -an -vcodec copy -y video.mp4

-an:这个选项用于去掉音频(disable audio),剩下的就是单独视频了。
为了使提取的视频与源视频一样,可加上-vcodec copy选项

单独提取音频

ffmpeg -i input.mp4 -vn -y audio.mp3
ffmpeg -i input.mp4 -vn -acodec copy -y audio.aac

-vn:这个选项用于去掉视频(disable video),剩下的就是单独音频。
另注意-acodec copy选项只能用于.aac格式,不能用于mp3格式。

合并音视频

ffmpeg -i video.mp4 -i audio.mp3 -y output.mp4
ffmpeg -i video.mp4 -i audio.mp3 -vcodec copy -acodec copy -y output.mp4

设置两个输入一个输出即可,两个输入分别是视频和音频。如果不想重新对输入做编码,那么使用-vcodec copy -acodec copy选项。
最终输出视频的长度是两个文件较长者,比如mp3长于mp4,那么mp4播放结束后固定在最后一帧,继续播mp3

ffmpeg -i video.mp4 -i audio.mp3 -shortest -y output.mp4

-shortest:以音频和视频文件中较短的作为输出长度。

替换源视频中的音频

ffmpeg -i input.mp4 -i audio.mp3 -map 0:v:0 -map 1:a:0 -y output.mp4

-map 0:v:0将第一个(索引0)视频流从输入映射到输出中的第一个(索引0)视频流。
-map 1:a:0将第二个(索引1)音频流从输入映射到输出中的第一个(索引0)音频流。

合并多段视频

mpeg格式文件可以直接合并,但是不通用。
一般可以选择将视频转化为 ts 流,然后再合并。

ffmpeg -i input.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i input2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy -absf aac_adtstoasc -y output.mp4

图片合成视频

ffmpeg -i .\temp\frame_%3d.png -y output.mp4

上面是最简单的命令,默认帧率是25,一般需要设置个帧率。

ffmpeg -r 30 -i .\temp\frame_%3d.png -y output.mp4

设置帧率的话,把-r 30放在-i xxx前面或者后面代表的含义不一样:

  • -r放在前面的话既指定图片输入的帧率,也指定视频输出的帧率。
  • -r放在后面的话仅指定视频输出的帧率。
ffmpeg -r 30 -i .\temp\frame_%3d.png -r 60 -y output.mp4

比如,如果使用300张图片,使用上述命令合成视频,那么图片以30fps送入,视频以60fps输出,所以最后结果是60fps * 10s的视频,视频包含600帧。至于多出来的帧是重复帧还是插帧得来的,不是太清楚。

ffmpeg -r 30 -i .\temp\frame_%3d.png -i audio.aac -y output.mp4

可以进一步使用上面命令把音频也加上。

视频更换预览封面

ffmpeg -i input.mp4 -i cover.png -map 0 -map 1 -c copy -disposition:v:1 attached_pic -y output.mp4

用上面命令可以把视频的预览封面改成cover.png

图片+声音,生成视频

ffmpeg -loop 1 -i image.png -i audio.aac -shortest -y output.mp4

-loop 1表示图片无限循环,-shortest表示视频持续到音频结束。

转gif

ffmpeg -i input.mp4 -y output.gif
ffmpeg -i input.mp4 -s 540:960 -y output.gif

直接改变后缀就可以实现输出gif的目的,-s 540:960可以改输出分辨率,格式是W:H或者WxH

改变色彩格式(pix_fmt)

ffmpeg -i input.mp4 -pix_fmt yuv422p -y output.mp4

有时候Windows下合成的视频放到Mac上不能播放,可能就是受色彩格式影响,改变一下色彩格式就能解决。

查看每种编码器支持的色彩格式,可以使用如下命令:

ffmpeg -h encoder=libx264

打印的信息有点长,从信息中可以扒拉出libx264支持的色彩格式:

Supported pixel formats: yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p nv12 nv16 nv21 yuv420p10le yuv422p10le yuv444p10le nv20le gray gray10le

libx265:

Supported pixel formats: yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p gbrp yuv420p10le yuv422p10le yuv444p10le gbrp10le yuv420p12le yuv422p12le yuv444p12le gbrp12le gray gray10le gray12le

参考资料:

FFmpeg 视频处理入门教程
FFmpeg的安装与基础使用教程
CRF Guide (Constant Rate Factor in x264, x265 and libvpx)
Understanding Rate Control Modes (x264, x265, vpx)
FFmpeg VBR Settings
H.264 Video Encoding Guide
you shouldn’t use ABR ever.

 

 

出处:https://blog.csdn.net/bby1987/article/details/125562773

=======================================================================================

ffmpeg 的安装 | 使用

1. ffmpeg 安装 

访问ffmpeg官方网站进行下载解压:https://ffmpeg.org/download.html

1.1 下载命令

ffmpeg -i “http://......m3u8” -c copy media.mp4

1.2 格式转化  avi、mkv、mp4等格式转为mp4

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

1.3,wmv、asf等格式转为mp4

ffmpeg -i 1.asf 1.mp4

 

 

2. 使用 

  使用 ffmpeg 合并一些 ts 文件非常简单,你只需要在终端输入一行命令即可:

ffmpeg -f concat -i file_list.txt -c copy output.mp4

  其中 file_list.txt 为如下格式文本文件:

file 'input1.ts'
file 'input2.ts'
file 'input3.ts'

我们可以用 Python 脚本生成这个 file_list.txt:

复制代码
import os
filePath = "你的ts视频存放路径"
file_list = sorted(os.listdir(filePath))
with open("你的ts视频存放路径/file_list.txt","w+") as f:
    for file in file_list:
        f.write("file '{}'\n".format(file))
复制代码

 

注意,这个 file_list.txt 需要和你的 ts 视频存放在同一个目录下,然后 cd 进入此目录,并执行上面提到过的 ffmpeg 合并转换命令:

ffmpeg -f concat -i file_list.txt -c copy output.mp4

 

3.解密处理

上面我们讲的是没有经过加密的 ts 文件,这些文件下载后直接可以播放,但经过AES-128加密后的文件下载后会无法播放,所以还需要进行解密。

如何判断是否需要加密?观察视频网站是否有m3u8的文件传输,下载下来并打开:

 

复制代码
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:13
#EXT-X-MEDIA-SEQUENCE:0
 
//这里是注释,真实文件里不会有的,
//看看你的m3u8文件里有没有这一行,如果有的话,这个m3u8文件是加密的,请继续往下看
//如果没有这行的话,特别是没有这个#EXT-X-KEY,那么恭喜你,这个m3u8没有加密,你直接按本文教程第二点合并即可
#EXT-X-KEY:METHOD=AES-128,URI="http://www.example.com/20180125/key.key"
 
 
#EXTINF:12.5,
//下面的这个其实才是视频真正的地址,你放在浏览器地址栏上直接回车是可以直接下载的
//不过这样的链接在m3u8文件里会有很多,建议使用工具下载(迅雷)、ffmpeg、vlc等
//这里还可能出现GBDYO3576000.ts这种情况,其实是把前面的路径省略了,可根据m3u8文件的路径自行加上
http://www.example.com/20180125/GBDYO3576000.ts
#EXTINF:12.5,
http://www.example.com/20180125/GBDYO3576001.ts
#EXTINF:12.5,
http://www.example.com/20180125/GBDYO3576002.ts
复制代码

如果你的文件是加密的,那么你还需要一个key文件,Key文件下载的方法和m3u8文件类似,如下所示 key.key 就是我们需要下载的 key 文件,并注意这里 m3u8 有2个,需要使用的是像上面一样存在 ts 文件超链接的 m3u8 文件:

下载所有 ts 文件,将下载好的所有的 ts 文件、m3u8、key.key 放到一个文件夹中,将 m3u8 文件改名为 index.m3u8,将 key.key 改名为 key.m3u8 。更改 index.m3u8 里的 URL,变为你本地路径的 key 文件,将所有 ts 也改为你本地的路径,如下所示:

复制代码
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:13
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="e:/20180125/key.m3u8"
#EXTINF:12.5,
e:/20180125/GBDYO3576000.ts
#EXTINF:12.5,
e:/20180125/GBDYO3576001.ts
#EXTINF:12.5,
e:/20180125/GBDYO3576002.ts
复制代码

然后用ffmpeg进行合并:

ffmpeg -allowed_extensions ALL -i index.m3u8 -c copy new.mp4

 

 

出处:https://www.cnblogs.com/longly1111/p/16579110.html