FFmpeg命令行工具学习(四):FFmpeg 采集设备

在使用 FFmpeg 作为编码器时,可以使用FFmpeg采集本地的音视频采集设备的数据,然后进行编码、封装、传输等操作。

例如,我们可以采集摄像头的图像作为视频,采集麦克风的数据作为音频,然后对采集的音视频数据进行编码,最后将编码后的数据封装成多媒体文件或者作为音视频流发送到服务器上(流媒体)。

出于硬件环境和篇幅的限制,本文主要讲的时Mac平台下通过FFmpeg采集的方法和步骤。通常Mac上采集数据主要使用的是avfoundation进行采集。

一、Mac 下查看设备列表

FFmpeg可以直接从Mac系统的采集设备中采集摄像头、桌面、麦克风等。在采集设备之前,我们需要知道当前系统都支持哪些设备。

在终端上输入以下命令行,即可查看当前系统支持的设备基本信息:

ffmpeg -devices

输出如下:

1Devices: 2 D. = Demuxing supported 3 .E = Muxing supported 4 -- 5 D avfoundation AVFoundation input device 6 D lavfi Libavfilter virtual input device

从输出内容中可以看到,通过ffmpeg -devices查看的信息分为两大部分:

  • 解封装或封装的支持情况
  • 设备列表

系统当前可以支持的设备具体如下:

  • 输出设备:avfoundation、lavfi

本文重点介绍设备avfoundation。下面我们先看一下avfoundation的参数。

在终端上输入命令行,可以查看avfoundation的参数:

ffmpeg -h demuxer=avfoundation

输出如下:

1Demuxer avfoundation [AVFoundation input device]: 2AVFoundation input device AVOptions: 3 -list_devices <int> .D...... list available devices (from 0 to 1) (default false) 4 true .D...... 5 false .D...... 6 -video_device_index <int> .D...... select video device by index for devices with same name (starts at 0) (from -1 to INT_MAX) (default -1) 7 -audio_device_index <int> .D...... select audio device by index for devices with same name (starts at 0) (from -1 to INT_MAX) (default -1) 8 -pixel_format <pix_fmt> .D...... set pixel format (default yuv420p) 9 -framerate <video_rate> .D...... set frame rate (default "ntsc") 10 -video_size <image_size> .D...... set video size 11 -capture_cursor <int> .D...... capture the screen cursor (from 0 to 1) (default 0) 12 -capture_mouse_clicks <int> .D...... capture the screen mouse clicks (from 0 to 1) (default 0)

FFmpeg对avfoundation设备操作可以使用的参数已经列举在上面了,主要涉及枚举设备、音视频设备编号、像素格式、帧率、图像分辨率等,接下来,我们来讲解一下这些参数使用的例子。

二、Mac 下查看采集设备列表

在使用avfoundation操作设备采集之前,需要枚举avfoundation支持的输入设备,可以通过以下命令行来进行查看:

ffmpeg -f avfoundation -list_devices true -i "" 

执行命令后,输入如下:

1[AVFoundation input device @ 0x7feb49c04040] AVFoundation video devices: 2[AVFoundation input device @ 0x7feb49c04040] [0] FaceTime HD Camera 3[AVFoundation input device @ 0x7feb49c04040] [1] Capture screen 0 4[AVFoundation input device @ 0x7feb49c04040] AVFoundation audio devices: 5[AVFoundation input device @ 0x7feb49c04040] [0] Built-in Microphone

从输出的信息可以看到,当前系统包含了三个设备,分别是:

视频输入设备:

  •   [0] FaceTime HD Camera
    
  •   [1] Capture screen 0
    

音频输入设备:

  •   [0] Built-in Microphone
    

三、Mac 下采集设备

1、采集内置摄像头

执行以下命令可以直接获得摄像头并将摄像头内容录制下来或者直播推出去,以下命令就是采集命令行:

ffmpeg -f avfoundation -s 1280x720 -r 30 -i 0 out.mp4

执行命令后,会生成out.mp4视频文件,播放out.mp4就能看到FFmpeg从电脑摄像头采集到的图像:

ffplay out.mp4

2、采集Mac桌面

执行以下命令,就可以采集到桌面图像:

ffmpeg -f avfoundation -i 1 -r 30 out.yuv

命令执行后,就会录制桌面的画面为out.yuv,然后我们播放以下,就可以看到录制的效果了。

如果需要录制下来鼠标,则可以修改命令,增加capture_cursor来指定:

ffmpeg -f avfoundation -capture_cursor 1 -i 1 -r 30 out.yuv

播放的时候可以使用以下类型的命令行,来检测之前的录制是否成功:

ffplay -s 3360x2100 -pix_fmt uyvy422 out.yuv

其中,-s的参数,需要根据自己的电脑的状态来调整。-pix_fmt的参数,根据录制时的格式输出来调整。

3、采集麦克风

我们使用ffmpeg除了可以获得头像之外,还可以获得音频数据,命令如下:

ffmpeg -f avfoundation -i :0 out.wav

如果需要同时录制音视频,那么可以使用如下命令行:

ffmpeg -f avfoundation -video_device_index 0 -r 30 -s 1280x720  -i :0 out.mp4

注意:采集摄像头或者桌面,只需要改一下index的值就可以。

原文出处:https://www.cnblogs.com/renhui/p/10338045.html

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )