1 FFmpeg从入门到精通-FFmpeg简介
2 FFmpeg从入门到精通-FFmpeg工具使用基础
3 FFmpeg从入门到精通-FFmpeg转封装
4 FFmpeg从入门到精通-FFmpeg转码
5 FFmpeg从入门到精通-FFmpeg流媒体
6 FFmpeg从入门到精通-FFmpeg滤镜使用
7 FFmpeg从入门到精通-FFmpeg中Linux设备操作
8 FFmpeg从入门到精通-FFmpeg接口libavformat的使用
9 FFmpeg从入门到精通-FFmpeg接口libavcodec的使用
10 FFmpeg从入门到精通-FFmpeg接口libavfilter的使用
在使用FFmpeg作为编码器时,可以使用FFmpeg采集本地的音视频采集设备的数据,然后进行编码、封装、传输等操作
。例如我们可以采集摄像头的图像作为视频,采集麦克风的数据作为音频,然后对采集的音视频数据进行编码,最后将编码后的数据封装成多媒体文件或者作为音视频流发送到服务器上(流媒体)。
FFmpeg在Linux下支持的采集设备多种多样,包含FrameBuffer(fbdev)设备操作、v4l2设备操作、DV1394设备操作、OSS设备操作、x11grab设备操作
等。
首先需要查看系统当前支持的设备,将设备列出来,并根据前面章节中介绍的FFmpeg帮助信息查看方式,通过如下命令查看系统当前支持的设备。
ffmpeg -hide_banner -devices
输出如下:
Devices:
D. = Demuxing supported
.E = Muxing supported
--
DE fbdev Linux framebuffer
D lavfi Libavfilter virtual input device
DE oss OSS (Open Sound System) playback
DE video4linux2,v4l2 Video4Linux2 output device
从以上输出的内容中可以看到,系统当前可以支持的设备具体如下。
·输入设备:dv1934、fbdev、lavfi、oss、video4linux2、x11grab
·输出设备:fbdev、sdl、v4l2
设备列表查看完毕之后,可以得到对应的设备名称,接下来重点查看常用的设备操作参数并举例。
使用fbdev设备之前,需要了解清楚fbdev设备操作参数的情况,FFmpeg可通过如下命令来查询fbdev支持的参数:
ffmpeg -h demuxer=fbdev
命令行执行后输出的参数如表所示。
参数 | 类型 | 说明 |
---|---|---|
framerate | 帧率 | 采集时视频图像的刷新帧率 默认值为25 |
在Linux的图形图像设备中,FrameBuffer是一个比较有年份的设备,专门用于图像展示操作,例如早期的图形界面也是基于FrameBuffer进行绘制的,有时在向外界展示Linux的命令行操作又不希望别人看到你的桌面时,可以通过获得FrameBuffer设备图像数据进行编码然后推流或录制:
ffmpeg -framerate 30 -f fbdev -i /dev/fb0 output.mp4
命令行执行之后,Linux系统将会获取终端中的图像,而不是图形界面的图像,可以通过这种方法录制Linux终端中的操作,并以视频的方式展现。
Linux下,常见的视频设备还有video4linux,现在是video4linux2,设备一般缩写为v4l2,尤其是用于摄像头设备,下面查看一下v4l2设备的参数:
ffmpeg -h demuxer=v4l2
命令行执行之后,将会输出v4l2相关的操作参数
。输出参数如表所示。
FFmpeg下的v4l2可以支持设置帧率、时间戳、输入分辨率、视频帧大小
等,下面针对这些参数进行举例说明。
使用FFmpeg采集Linux下的v4l2设备时,主要用来采集摄像头,而摄像头通常支持多种像素格式,有些摄像头还支持直接输出已经编码好的H.264数据:
ffmpeg -hide_banner -f v4l2 -list_formats all -i /dev/video0
命令行执行后输出内容如下:
[video4linux2,v4l2 @ 0x1ff73a0] Raw : yuyv422 : YUYV 4:2:2 : 640x480 320x240 352x288 1280x720 960x540 800x448 640x360 424x240 640x480
[video4linux2,v4l2 @ 0x1ff73a0] Compressed: mjpeg : Motion-JPEG : 640x480 320x240 352x288 1280x720 960x540 800x448 640x360 424x240 640x48
正如输出的信息所展示的,输入设备/dev/video0输出了raw、yuyv422、yuyv4:2:2,同时输出了支持采集的图像分辨率大小,如320×240、1280×720
等;除了这些Raw数据之外,还支持摄像头常见的压缩格式MJPEG
格式,输出的分辨率与Raw基本可以对应上
。
下面我们把这个摄像头采集为视频文件来看一下效果:
ffmpeg -hide_banner -s 1920x1080 -i /dev/video0 output.avi
根据命令行分析,我们获得的是摄像头的1920×1080分辨率的视频图像,下面来看一下终端输出信息:
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 312295.946438, bitrate: 117964 kb/s
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 117964 kb/s, 8 fps, 8 tbr, 1000k tbn, 1000k tbc
Output #0, avi, to 'output.avi':
Metadata:
ISFT : Lavf57.63.100
Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720, q=2-31, 200 kb/s, 8 fps, 8 tbn, 8 tbc
Metadata:
encoder : Lavc57.75.100 mpeg4
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> mpeg4 (native))
Press [q] to stop, [?] for help
frame= 63 fps=7.8 q=31.0 size= 588kB time=00:00:08.50 bitrate= 566.5kbits/s speed=1.05x
如FFmpeg执行时输出的信息所示,采集的图像分辨率为1280×720
,输出视频编码采用AVI默认视频编码和码率等参数
,录制成output.avi文件,播放效果如图所示。
FFmpeg采集了摄像头数据,并将摄像头数据录制成AVI文件,播放的视频图像即为摄像头采集的数据。
使用FFmpeg采集Linux下面的图形部分桌面图像时,通常采用x11grab设备采集图像
,下面就来了解一下x11grab的参数,如表所示。
x11grab可以使用6个参数,支持的功能主要有绘制鼠标光标
,跟踪鼠标轨迹数据
,设置采集视频帧率
,指定采集桌面区域
,设置指定区域的变宽参数
,设置采集视频的分辨率
等。下面就来针对这些参数进行举例说明。
FFmpeg通过x11grab录制屏幕时,输入设备的设备名规则如下:
主机名]: 显示编号id. 屏幕编号id[+ 起始x 轴, 起始y 轴]
其中主机名、起始x轴与起始y轴均为可选参数
,下面看一下默认获取屏幕的例子。
(1)桌面录制
在有些Linux的教学或者演示时,需要用到Linux桌面的图像直播或者录制,参考本节前面介绍的设备名规则,可以使用如下命令对桌面进行录制:
ffmpeg -f x11grab -framerate 25 -video_size 1366x768 -i :0.0 out.mp4
我们设置输入帧率为25,图像分辨率为1366×768,采集的设备为“0.0”,输出文件为out.mp4。
(2)桌面录制指定起始位置
前文我们录制的区域为整个桌面,有时候并不一定符合我们的要求,FFmpeg提供了录制某个区域的方法:
ffmpeg -f x11grab -framerate 25 -video_size 352x288 -i :0.0+300,200 out.mp4
我们通过参数“:0.0+300,200”指定了x坐标为300,y坐标为200。需要注意的是,video_size需要按实际大小指定,最好保证此大小不要超出实际采集区域的大小。
(3)桌面录制带鼠标记录的视频
到此为止,我们已经介绍了录制整个桌面和录制某个区域的方法,有些情况下这仍然不能满足我们的要求,比如演示视频,我们需要用鼠标来辅助,FFmpeg同样也提供了录制鼠标的方法:
ffmpeg -f x11grab -video_size 1366x768 -follow_mouse 1 -i :0.0 out.mp4
我们可以通过参数follow_mouse来指定视频录制中带鼠标
至此,Linux下的桌面图像录制已经全部介绍完毕。
略。
Windows采集设备的主要方式是dshow、vfwcap、gdigrab,其中dshow可以用来抓取摄像头、采集卡、麦克风
等,vfwcap主要用来采集摄像头类设备
,gdigrab则是抓取Windows窗口程序
。
本节重点介绍如下几个方面。
·使用dshow枚举和采集音视频设备
·使用vfwcap枚举和采集视频设备
·使用gdigrab采集桌面或窗口
(1)使用dshow枚举设备
我们可以使用dshow来枚举当前系统上存在的音视频设备,这些设备主要是摄像头、麦克风,命令如下:
ffmpeg.exe -f dshow -list_devices true -i dummy
输出如下:
[dshow @ 000002246092e580] "USB2.0 PC CAMERA" (video)
[dshow @ 000002246092e580] "screen-capture-recorder" (video)
[dshow @ 000002246092e580] "OBS Virtual Camera" (video)
[dshow @ 000002246092e580] "麦克风 (USB2.0 MIC)" (audio)
[dshow @ 000002246092e580] "virtual-audio-capturer" (audio)
注意第一行的提示“some may be both video and audio devices”,这也是在告诉我们,有些视频设备同时也具备音频输出能力。
(2)使用dshow展示摄像头
下面可以尝试打开设备,并使用ffplay来展示摄像头:
ffplay.exe -f dshow -video_size 1280x720 -i video="USB2.0 PC CAMERA"
其中video_size指定了视频的分辨率,是摄像头支持采集的分辨率值,video="USB2.0 PC CAMERA"
指定了需要采集的摄像头名字。摄像头输出如图所示。
(3)将摄像头数据保存为MP4文件
我们可以通过如下命令将摄像头和电脑播放的声音录制为MP4文件,原理就是打开两个设备,一个为摄像头,一个为虚拟声音设备:
ffmpeg.exe -f dshow -i video="USB2.0 PC CAMERA" -f dshow -i audio="virtual-audio-capturer" out.mp4
我们指定了FFmpeg默认的音频和视频编码方式,可以参照前面的章节来指定适合自己的音视频编码方式,如H.264、AAC等。
在Windows平台上,我们可以使用vfwcap去采集摄像头,但是这种方式已经过时了,虽然FFmpeg也提供了支持,但是我们推荐使用dshow去采集摄像头和麦克风。
vfwcap主要支持两个参数video_size、framerate
,分别指示采集图像的大小和帧率。
(1)使用vfwcap枚举支持采集的设备
ffmpeg.exe -f vfwcap -i list
输出如下:
vfwcap @ 004fe280] Driver 0
[vfwcap @ 004fe280] Microsoft WDM Image Capture (Win32)
vfwcap @ 004fe280] Version: 6.1.7601.17514
list: I/O error
从输出的内容可以看出,vfwcap只枚举了一个设备,虚拟摄像头不在其中,这也说明了vfwcap的使用有一定的局限性。
(2)使用vfwcap生成MP4文件
ffmpeg.exe -f vfwcap -i 0 -r 25 -vcodec libx264 out.mp4
我们通过-i指定了待录像的摄像头索引号
,-r则指定了需要录像的帧率
,vcodec指定了录像视频的编码格式
,输出为out.mp4。
在Windows平台,FFmpeg支持采集基于gdi的屏幕采集设备
,这个设备同时支持采集显示器的某一块区域,gdigrab支持的主要参数如表所示。
gdigrab的输入主要有两种方式:desktop和title=window_title,其中desktop代表采集整个桌面
,而title=window_title则是采集标题为window_title的窗口
,下面分别介绍gdigrab如何采集桌面和窗口。
(1)使用gdigrab采集整个桌面
ffmpeg.exe -f gdigrab -framerate 6 -i desktop out.mp4
需要录制整个桌面时,我们只需要简单地指定输入对象为desktop即可。
(2)使用gdigrab采集某个窗口
ffmpeg.exe -f gdigrab -framerate 6 -i title=ffmpeg out.mp4
当需要录制某个窗口时,我们需要根据窗口的标题来进行窗口的查找,即通过-i title来指定。需要注意的是,在录制期间,我们应该尽量避免调整录制窗口的大小,这可能会导致画面异常。
(3)使用gdigrab录制带偏移量的视频
ffmpeg.exe -f gdigrab -framerate 6 -offset_x 50 -offset_y 50 -video_size 400x400 -i title=ffmpeg out.mp4
通过offset_x和offset_y分别指定x和y坐标的偏移
,当指定x或y方向的偏移时,需要指定video_size,否则参数无效,仍然录制整个窗口。
通过本章的学习,我们可以了解到Linux、OS X、Windows上的设备采集方式,内容涉及fbdev、v4l2、x11grab、avfoundation、dshow、vfwcap、gdigrab
等。
至此,FFmpeg设备采集命令行部分已全部介绍完毕。