ffmpeg的安装和简单使用

看完本篇文章,你可以了解:ffmpeg的安装以及常用的录屏、转码方法
(windows环境下)

ffmpeg的安装

这个网上的文章已经一大堆了,但我还是要粗略说一下。
windows安装文件可以在https://ffmpeg.zeranoe.com/builds/# 下载
在这里插入图片描述
上图中红框内第一个是版本,一般用下面那个短的发行版就行了。第二栏选位数自己电脑是多少位的就选多少位(当然64位可以用32位的,体积小一点点,32位不能用64位的)。

右边对应的是3种分发形式:
Static版本中的把所有dll都打包到exe文件中去了,所以每个exe超大!
Shared版本中exe的体积相对较小,他们运行所需的dll文件是共享的,所以总体积比static的小一点
Dev版本用于开发,里面包含了库文件xxx.lib以及头文件xxx.h

前面两个版本都包含了三个exe文件(ffmpeg.exe,ffplay.exe,ffprobe.exe):
ffmpeg用于录屏推流转码;
ffplay是附带的播放程序;
ffprobe主要用于查看文件格式。
个人觉得第二个Shared版本比较好。

下载好前面两个版本后,随便解压到一个地方(我下载的是第二个,所以有很多dll文件)
在这里插入图片描述
如果不考虑方便性的话现在就可以使用了,像一般的命令行软件一样,可以直接在当前目录下按住Shift键右击空白处,打开powershell窗口使用:
在这里插入图片描述
输入 .\ffmpeg -h 测试一下(.\表示打开当前目录的程序文件)
在这里插入图片描述
这种使用方法比较麻烦,需要在当前文件夹里打开powershell窗口。还有第二种使用方法,就是将ffmpeg路径写入系统变量中,让其他程序或在其他地方打开命令窗口也能用,具体操作如下:
设置环境变量的方法右键此电脑——>属性——>高级系统设置——>环境变量
在这里插入图片描述
然后找到刚才解压出来那三个exe文件的文件夹,复制路径备用
在这里插入图片描述
在环境变量的path目录下新建一行,把刚才复制的路径粘贴进去就可以了
在这里插入图片描述
随便打开一个cmd命令窗口或powershell窗口输入 ffmpeg
在这里插入图片描述
这样就说明环境变量设置成功了,可以愉快的玩耍了

ffmpeg的简单使用

ffmpeg一些常识:

通用输入格式:ffmpeg -i 输入文件 输出文件/设备  输出文件   //-i input
//注意空格,ffmpeg是用空格来划分命令的,
有歧义的应当用单引号或双引号括起来(如文件路径有空格等非法字符时,应用""把路径包起来)

通用带格式输入输出:ffmpeg -f xx格式 -i 输入文件/设备 xx格式(编码器、范围等) 输出文件 
//-f 就是指定其后的文件格式/处理方法,不加-f就会用ffmpeg预设的格式进行编解码
例:ffmpeg -f gdigrab -i desktop -vcodec libx264 output.mp4  //截屏并输出为mp4文件,使用libx264编码器 
//gidgrab是ffmpeg自带的抓屏命令,desktop表示从整个电脑桌面抓取流,输出到mp4文件中
注意ffmpeg的中止命令是'q',就是当ffmpeg在处理/录屏时,可以按一下q键中止操作,这样文件才能安全释放
在ffmpeg命令中加入 -y 表示输出文件将默认替换原有文件

1.ffmpeg录屏

ffmpeg是一个优秀的录屏软件,可以实现区域录屏、自定义录屏帧率、缩放、甚至调用独立显卡进行录屏编码等操作
基本命令:

  1. 最简单的录屏(全屏抓取)
ffmpeg -f gdigrab -i desktop out.mp4 
  1. 以特定的帧率抓屏特定时间
ffmpeg -f gdigrab -t 5 -r 25 -i desktop out.mp4 -y
  1. 设置输出分辨率 -s 宽x高 ,设置输出编码器
ffmpeg -f gdigrab -t 5 -r 25 -i desktop -vcodec libx264  -s 720x240 out.mp4 -y

编码器抓屏的话一般使用H.264编码就可以了,占用低速度快。
上面的命令运行后可以看到输出的视频变形了,这是因为-s 参数会强制缩放视频的宽高,如果想保持宽高比,可以用-vf scale=宽:-2 ,就会根据宽度等比例缩放。

ffmpeg -f gdigrab -t 5 -r 25 -i desktop -vcodec libx264  -vf scale=720:-2 out.mp4 -y

命令中的-2是因为使用H.264编码要使用偶数的视频宽度,-vf scale=宽:-2可以保证视频输出宽度为偶数

  1. 设置抓屏范围 -video_size 宽x高 -offset_x 起点横坐标 -offset_y 起点纵坐标 注意所说的坐标原点是屏幕左上角
ffmpeg -f gdigrab -video_size 600x480 -offset_x 100 -offset_y 60 -t 5 -r 25 -i desktop -vcodec libx264 out.mp4 -y

但是你会发现上面的录屏都没有录到声音,想要在视频中录声音?先查找一下可用设备:

ffmpeg -list_devices true -f dshow -i dummy

该命令将列出所有格式为dshow(DirectShow )的设备。
可以看到打印了一串输出
在这里插入图片描述
图中的 DirectShow video devices目录下有一个摄像头设备;
DirectShow audio devices目录下有一个带乱码但还是可以认得出是麦克风的设备;(命令行中的乱码可以通过chcp 65001命令纠正为utf-8编码)。各个设备的下一行 “Alternative name”是他们的别名,在程序中调用时可以用到。

要在录屏中加入麦克风的声音,可以增加一个输入,用-f dshow -i audio=“麦克风 (2- Realtek High Definition Audio)”:

ffmpeg -f gdigrab -i desktop -f dshow -i audio="麦克风 (2- Realtek High Definition Audio)" out.mp4 -y

如果想要只录电脑声卡的声音(没有麦克风声音),就需要注册一个dshow滤镜"virtual-audio-capturer",可以通过注册audio_sniffer-x64.dll 获得。具体可以看看我之前写的《ffmpeg中使用screen capture recorder录音的问题》,里面有详细注册教程。注册后可以在命令行输入

ffmpeg -list_devices true -f dshow -i dummy 

查看设备,可以看到,已经多了一个叫"virtual-audio-capturer"的dshow设备
在这里插入图片描述
然后我们把dshow滤镜加入录屏流中:同样是-f dshow -i audio="xxx"的格式

ffmpeg -f gdigrab  -i desktop -f dshow -i audio="virtual-audio-capturer" out.mp4 -y

使用gdigrab方法的录屏中我们会发现鼠标在一闪一闪的,这是因为-gdigrab方法是不断截屏然后转化为视频流,为了解决这个问题,可以注册"screen-capture-recorder"滤镜,通过注册screen-capture-recorder.dll获得,具体方法在《ffmpeg中使用screen capture recorder录音的问题》也有提到,一定要注册和ffmpeg是相同位数的dll。注册后,再-list_devices一下,会发现又多了一个叫"screen-capture-recorder"的dshow滤镜,用它替换掉gdigrab:

ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" out.mp4 -y

发现鼠标不闪了,再把音视频同步一下:

ffmpeg -f dshow -i video="screen-capture-recorder":audio="virtual-audio-capturer" out.mp4 -y

这里有一个bug :screen-capture-recorder滤镜当屏幕缩放比例不是100%时就只能捕获一部分屏幕,这可能是screen-capture-recorder还没有适配windows的高dpi模式,重新编译ffmpeg并加入高dpi模式应该可以修复(我还没弄)。有大佬弄好的告诉我一下~

使用H.264高质量编码录屏

录屏文件大多数输出为mp4的容器格式,可以使用H.264编码提高编码速度减小文件大小:

ffmpeg -f gdigrab -video_size 600x480 -offset_x 100 -offset_y 60 -r 25 -draw_mouse 1 -i desktop -f dshow -i audio="virtual-audio-capturer"  -profile:v high444 -level 5.1 -preset ultrafast -vcodec libx264 out.mp4 -y

上面的-draw_mouse 1 表明显示鼠标,-profile:v -level 参数是设置H.264编码的视频配置详情参数可以看这篇文章,-preset 参数是视频输出码率控制,也可以看这篇文章了解,一般录屏中应该用ultrafast的码率以提高速度、减少占用;-vcodec libx264指定了输出的编码器;想要整体质量控制可以用h.264 的 -qp参数:qp值越小,质量越好,文件越大,-qp 0 是无损录屏

ffmpeg -f gdigrab -video_size 600x480 -offset_x 100 -offset_y 60 -r 25 -draw_mouse 1 -i desktop -f dshow -i audio="virtual-audio-capturer"  -qp 5 -vcodec libx264 out.mp4 -y

值得注意的是,一旦用-qp后,其他的-profile:v -level -preset等质量控制参数几乎都不可用了;

使用独立显卡加速编码(硬件编码):

ffmpeg -f gdigrab -video_size 600x480 -offset_x 100 -offset_y 60 -r 25 -draw_mouse 1 -i desktop -f dshow -i audio="virtual-audio-capturer"  -qp 5 -vcodec h264_nvenc out.mp4 -y

主要就是把编码器改成h264_nvenc,对应的是使用NVIDIA显卡加速,其他显卡型号的编码器可以自行搜索。

2.格式转换

ffmpeg音视频裁剪

有两种格式:
-ss 开始时间 -to 结束时间
-ss 开始时间 -t 时间长度
例:

ffmpeg  -ss 2 -to 4 -accurate_seek -i input.mp4 -codec copy -avoid_negative_ts 1 output.mp4 -y

-accurate_seek -avoid_negative_ts 1参数可以准确切割
-codec copy 表示直接复制流,所以输出和输入是相同编码的

ffmpeg音视频拼接

首先创建一个txt文件
文件内容是要拼接的视频/音频文件路径
格式为:
file ‘name1’
file ‘name2’
file ‘name3’

然后用命令:

ffmpeg -f concat -safe 0 -i txt的文件名.txt -c copy outputfilename
ffmpeg压缩转码功能

格式转换通用命令:
ffmpeg -f xxx -i inputfile outputfile
以视频格式转换为例:

ffmpeg -i input.mp4 -ss 0 -to 5 -r 25 -vf scale=1920:-2  -profile:v high -preset:v medium -preset:a medium -vcodec h264_nvenc output.mp4

同样的,-ss -to 为设置时间间隔,-r 为设置输出帧率;-vf scale=1920:-2表示等比例格式化为1980的宽度,-2确保为偶数分辨率;-profile:v 设置视频的模式(和上面录屏的一样),-preset也是设置码率;-vcodec h264_nvenc使用NVIDIA显卡的H.264编码器能大大提高编码速度并减少cpu的占用.
值得注意的是:使用硬件编码时,一些profile、preset设置并不适用,可以使用-h查看具体使用参数:

ffmpeg -h encoder='h264_nvenc'
ffmpeg提取功能

ffmpeg可以从视频中提取音频、去除音频、提取帧等操作
提取音频

ffmpeg -i input.mp4 -vn output.mp3

提取视频(去除音频)

ffmpeg -i input.mp4 -an output.mp4

提取帧

ffmpeg -i input.mp4 -r 5 %04d.png 

表示每秒提取5帧保存为图片,图片名称为0000、0001、0002…

常见问题:

1.Could not find audio only device with name [virtual-audio-capturer] among source devices of type video.或者是Could not find video device with name [screen-capture-recorder] among source devices of type video.找不到dshow设备,
解决:检查是否正确注册了dshow软件,使用 ffmpeg -list_devices true -f dshow -i dummy命令查看;注意安装的dshow软件位数要与使用的ffmpeg位数相同!

2.Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)线程堵塞
解决:在输入中加入-thread_queue_size 16 设置线程队列数如

ffmpeg -f dshow -i video="screen-capture-recorder" -thread_queue_size 16 -f dshow -i audio="virtual-audio-capturer" out.mp4 -y

注意是在-f 参数前

3.xxx too full or near too full (xxx% of size: 3041280 [rtbufsize parameter])! frame dropped!缓冲区不足
解决:使用-rtbufsize 50M参数设置缓冲区大小如

ffmpeg -f dshow -rtbufsize 50M -i video="screen-capture-recorder" -thread_queue_size 16 -f dshow -i audio="virtual-audio-capturer" out.mp4 -y

注意是在-f参数之后

4.ffmpeg处理的视频发到移动设备上不能播放
解决:在输出文件中使用-pix_fmt yuv420p设置储存格式

小白发文,大佬轻喷( ‵▽′)ψ嘤嘤嘤

作者:机械酱&Fandes 转载请标明出处

  • 13
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fandes_F

饿饿~饭饭~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值