FFmpeg获取DirectShow设备数据(摄像头,录屏)

这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘。本文所述的方法主要是对应Windows平台的。

1.       列设备

  1. ffmpeg -list_devices true -f dshow -i dummy

命令执行后输出的结果如下(注:中文的设备会出现乱码的情况)。列表显示设备的名称很重要,输入的时候都是使用“-f dshow -i video="{设备名}"”的方式。

FFmpeg获取DirectShow设备数据(摄像头,录屏)

FFmpeg获取DirectShow设备数据(摄像头,录屏)

我自己的机器上列出了以下设备:

  1. [dshow @0388f5e0] DirectShow video devices
  2. [dshow @0388f5e0]  "Integrated Camera"
  3. [dshow @0388f5e0] "screen-capture-recorder"
  4. [dshow @0388f5e0] DirectShow audio devices
  5. [dshow @0388f5e0]  "鍐呰楹﹀厠椋?(Conexant20672 SmartAudi"
  6. [dshow @0388f5e0]  "virtual-audio-capturer"

下文的测试中,使用其中的两个视频输入:"Integrated Camera"和"screen-capture-recorder"。

注:音频设备出现乱码,这个问题的解决方法会随后提到。

2.       获取摄像头数据(保存为本地文件或者发送实时流)

2.1. 编码为H.264,保存为本地文件

下面这条命令,实现了从摄像头读取数据并编码为H.264,最后保存成mycamera.mkv。

  1. ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 mycamera.mkv

2.2. 直接播放摄像头的数据

使用ffplay可以直接播放摄像头的数据,命令如下:

  1. ffplay -f dshow -i video="Integrated Camera"

如果设备名称正确的话,会直接打开本机的摄像头,如图所示。

FFmpeg获取DirectShow设备数据(摄像头,录屏)

FFmpeg获取DirectShow设备数据(摄像头,录屏)

注:除了使用DirectShow作为输入外,使用VFW也可以读取到摄像头的数据,例如下述命令可以播放摄像头数据:

  1. ffplay -f vfwcap -i 0

此外,可以使用FFmpeg的list_options查看设备的选项:

  1. ffmpeg -list_options true -f dshow -i video="Integrated Camera"

输出如下:

  1. [dshow @ 03845420] DirectShow video device options
  2. [dshow @ 03845420]  Pin "鎹曡幏"
  3. [dshow @ 03845420]   pixel_format=bgr24  min s=640x480 fps=15 max s=640x480 fps=30
  4. [dshow @ 03845420]   pixel_format=bgr24  min s=640x360 fps=15 max s=640x360 fps=30
  5. [dshow @ 03845420]   pixel_format=bgr24  min s=352x288 fps=15 max s=352x288 fps=30
  6. [dshow @ 03845420]   pixel_format=bgr24  min s=320x240 fps=15 max s=320x240 fps=30
  7. [dshow @ 03845420]   pixel_format=bgr24  min s=800x448 fps=1 max s=800x448 fps=15
  8. [dshow @ 03845420]   pixel_format=bgr24  min s=960x544 fps=1 max s=960x544 fps=10
  9. [dshow @ 03845420]   pixel_format=bgr24  min s=1280x720 fps=1 max s=1280x720 fps=10
  10. [dshow @ 03845420]   pixel_format=bgr24  min s=424x240 fps=15 max s=424x240 fps=30
  11. [dshow @ 03845420]   pixel_format=yuyv422  min s=640x480 fps=15 max s=640x480 fps=30
  12. [dshow @ 03845420]   pixel_format=yuyv422  min s=640x360 fps=15 max s=640x360 fps=30
  13. [dshow @ 03845420]   pixel_format=yuyv422  min s=352x288 fps=15 max s=352x288 fps=30
  14. [dshow @ 03845420]   pixel_format=yuyv422  min s=320x240 fps=15 max s=320x240 fps=30
  15. [dshow @ 03845420]   pixel_format=yuyv422  min s=800x448 fps=1 max s=800x448 fps=15
  16. [dshow @ 03845420]   pixel_format=yuyv422  min s=960x544 fps=1 max s=960x544 fps=10
  17. [dshow @ 03845420]   pixel_format=yuyv422  min s=1280x720 fps=1 max s=1280x720 fps=10
  18. [dshow @ 03845420]   pixel_format=yuyv422  min s=424x240 fps=15 max s=424x240 fps=30
  19. [dshow @ 03845420]   vcodec=mjpeg  min s=640x480 fps=15 max s=640x480 fps=30
  20. [dshow @ 03845420]   vcodec=mjpeg  min s=640x360 fps=15 max s=640x360 fps=30
  21. [dshow @ 03845420]   vcodec=mjpeg  min s=352x288 fps=15 max s=352x288 fps=30
  22. [dshow @ 03845420]   vcodec=mjpeg  min s=320x240 fps=15 max s=320x240 fps=30
  23. [dshow @ 03845420]   vcodec=mjpeg  min s=800x448 fps=15 max s=800x448 fps=30
  24. [dshow @ 03845420]   vcodec=mjpeg  min s=960x544 fps=15 max s=960x544 fps=30
  25. [dshow @ 03845420]   vcodec=mjpeg  min s=1280x720 fps=15 max s=1280x720 fps=30

可以通过输出信息设置摄像头的参数。

例如,设置摄像头分辨率为1280x720

  1. ffplay -s 1280x720 -f dshow -i video="Integrated Camera"

设置分辨率为424x240

  1. ffplay -s 424x240 -f dshow -i video="Integrated Camera"

 

2.3. 编码为H.264,发布UDP

下面这条命令,实现了:获取摄像头数据->编码为H.264->封装为UDP并发送至组播地址。

  1. ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f h264 udp://233.233.233.223:6666

注1:考虑到提高libx264的编码速度,添加了-preset:v ultrafast和-tune:v zerolatency两个选项。

注2:高分辨率的情况下,使用UDP可能出现丢包的情况。为了避免这种情况,可以添加–s 参数(例如-s 320x240)调小分辨率。

2.4. 编码为H.264,发布RTP

下面这条命令,实现了:获取摄像头数据->编码为H.264->封装为RTP并发送至组播地址。

  1. ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://233.233.233.223:6666>test.sdp

注1:考虑到提高libx264的编码速度,添加了-preset:v ultrafast和-tune:v zerolatency两个选项。

注2:结尾添加“>test.sdp”可以在发布的同时生成sdp文件。该文件可以用于该视频流的播放。

2.5. 编码为H.264,发布RTMP

下面这条命令,实现了:获取摄像头数据->编码为H.264->并发送至RTMP服务器。

  1. ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://localhost/oflaDemo/livestream

2.6. 编码为MPEG2,发布UDP

与编码为H.264类似,指明-vcodec即可。

  1. ffmpeg -f dshow -i video="Integrated Camera" -vcodec mpeg2video -f mpeg2video udp://233.233.233.223:6666

播放MPEG2的UDP流如下。指明-vcodec为mpeg2video即可

  1. ffplay -vcodec mpeg2video udp://233.233.233.223:6666

 

3.       屏幕录制(Windows平台下保存为本地文件或者发送实时流)

Linux下使用FFmpeg进行屏幕录制相对比较方便,可以使用x11grab,使用如下的命令:

  1. ffmpeg -f x11grab -s 1600x900 -r 50 -vcodec libx264 –preset:v ultrafast –tune:v zerolatency -crf 18 -f mpegts udp://localhost:1234

详细时使用方式可以参考这篇文章:DesktopStreaming With FFmpeg for Lower Latency

Linux录屏在这里不再赘述。在Windows平台下屏幕录像则要稍微复杂一些。在Windows平台下,使用-dshow取代x11grab。一句话介绍:注册录屏dshow滤镜(例如screen-capture-recorder),然后通过dshow获取录屏图像然后编码处理。

因此,在使用FFmpeg屏幕录像之前,需要先安装dshow滤镜。在这里推荐一个软件:screen capture recorder。安装这个软件之后,就可以通过FFmpeg屏幕录像了。

 

screen capture recorder项目主页:

http://sourceforge.net/projects/screencapturer/

下载地址:

http://sourceforge.net/projects/screencapturer/files

下载完后,一路“Next”即可安装完毕。注意,需要Java运行环境(Java Runtime Environment),如果没有的话下载一个就行。

screen capture recorder本身就可以录屏,不过这里我们使用FFmpeg进行录屏。

FFmpeg获取DirectShow设备数据(摄像头,录屏)

FFmpeg获取DirectShow设备数据(摄像头,录屏)

3.1. 编码为H.264,保存为本地文件

下面的命令可以将屏幕录制后编码为H.264并保存为本地文件。

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency MyDesktop.mkv

注:“-r 5”的意思是把帧率设置成5。

最后得到的效果如下图。

FFmpeg获取DirectShow设备数据(摄像头,录屏)

FFmpeg获取DirectShow设备数据(摄像头,录屏)

此外,也可以录声音,声音输入可以分成两种:一种是真人说话的声音,通过话筒输入;一种是虚拟的声音,即录屏的时候电脑耳机里的声音。下面两条命令可以分别录制话筒的声音和电脑耳机里的声音。

录屏,伴随话筒输入的声音

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="鍐呰楹﹀厠椋?(Conexant 20672 SmartAudi" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv

上述命令有问题:audio那里有乱码,把乱码ANSI转UTF-8之后,开始测试不行,后来发现是自己疏忽大意,乱码部分转码后为“内装麦克风 ”,然后接可以正常使用了。因此,命令应该如下图所示:

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="内装麦克风 (Conexant 20672 SmartAudi" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv

注:

如果不熟悉ANSI转码UTF-8的话,还有一种更简单的方式查看设备的名称。即不使用FFmpeg查看系统DirectShow输入设备的名称,而使用DirectShow SDK自带的工具GraphEdit(或者网上下一个GraphStudioNext)查看输入名称。

打开GraphEdit选择“图像->插入滤镜”

FFmpeg获取DirectShow设备数据(摄像头,录屏)

FFmpeg获取DirectShow设备数据(摄像头,录屏)

然后就可以通过查看Audio Capture Sources来查看音频输入设备的简体中文名称了。从图中可以看出是“内装麦克风 (Conexant 20672 SmartAudi”。

FFmpeg获取DirectShow设备数据(摄像头,录屏)

FFmpeg获取DirectShow设备数据(摄像头,录屏)

PS:感觉这条命令适合做讲座之类的时候使用

 

录屏,伴随耳机输入的声音

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv

PS:测这条命令的时候,这在听歌,因此录制的视频中的音频就是那首歌曲。

 

3.2. 编码为H.264,发布UDP

下面的命令可以将屏幕录制后编码为H.264并封装成UDP发送到组播地址

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f h264 udp://233.233.233.223:6666

注1:考虑到提高libx264的编码速度,添加了-preset:v ultrafast和-tune:v zerolatency两个选项。

注2:高分辨率的情况下,使用UDP可能出现丢包的情况。为了避免这种情况,可以添加–s 参数(例如-s 320x240)调小分辨率。

3.3. 编码为H.264,发布RTP

下面的命令可以将屏幕录制后编码为H.264并封装成RTP并发送到组播地址

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://233.233.233.223:6666>test.sdp

注1:考虑到提高libx264的编码速度,添加了-preset:v ultrafast和-tune:v zerolatency两个选项。

注2:结尾添加“>test.sdp”可以在发布的同时生成sdp文件。该文件可以用于该视频流的播放。如下命令即可播放:

  1. ffplay test.sdp

3.4. 编码为H.264,发布RTMP

原理同上,不再赘述。

  1. ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://localhost/oflaDemo/livestream

注意:播放RTMP的时候,-max_delay参数会比较明显的影响延迟,将此参数值设定小一些,有利于降低延时。

  1. ffplay -max_delay 100000 "rtmp://localhost/oflaDemo/livestream live=1"

4.另一种屏幕录制的方式(2014.10.1更新)

最近发现FFmpeg还有一个专门用于Windows下屏幕录制的设备:gdigrab。
gdigrab是基于GDI的抓屏设备,可以用于抓取屏幕的特定区域。在这里记录一下gdigrab的用法。
gdigrab通过设定不同的输入URL,支持两种方式的屏幕抓取:
(1)“desktop”:抓取整张桌面。或者抓取桌面中的一个特定的区域。
(2)“title={窗口名称}”:抓取屏幕中特定的一个窗口。
下面举几个例子。
最简单的抓屏:
  1. ffmpeg -f gdigrab -i desktop out.mpg

从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5

  1. ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg

转载于:https://www.cnblogs.com/liushunli/p/5296248.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矩阵的对数运算公式_必修一——对数与对数运算

一、前言(废话)高中数学我们已经学习了二次函数,指数函数(如果不记得的读者可以往前面翻看一下),这次作者为读者们讲解的是对数与对数运算,对数是什么呢?读者们心里有自己的认知吗?二、对数对数函数是高中阶段学习的一…

分拣外观残缺的机器人_复合机器人AGV+协作机器人的应用领域

什么是复合机器人?复合型机器人是一种集成AGV移动机器人和通用工业机器人两项功能为一身的机器人。在工业领域,通用工业机器人被称为机械臂或者机械手,主要是替代人胳膊的抓取功能;而AGV移动机器人是替代人腿脚的行走功能。复合型机器人则是手脚并用&am…

前端之旅,做一点有回报的事情

本文是参加前端早读课【同说】做的分享 首先感谢情封对前端圈的辛苦付出,能坚持做好一件事真的很不容易,敬佩这份精神。2天前看到早读课的【同说】活动计划,我觉得想法真的很好,忽然情封微信邀请我参与,听到后我是心虚…

差异表达基因变化倍数_10.limma教程|差异表达统计相关理论

点击上方“蓝字”关注我们10.1 Top-Tables 简介limma包提供topTable和decideTests函数概括线性模型结果,进行假设检验,调整p值进行多重检验。结果包括(log2)倍数变化,标准误差,t统计和p值。用于显著性分析的基本统计量是修正t统计…

activemq中怎么知道推送消息是否成功_如何优雅的使用activeMQ 安装、应用、安全认证、持久化...

ActiveMQ安装1. 下载资源ActiveMQ官网:版本说明ActiveMQ5.10.x以上版本必须使用JDK1.8才能正常使用。ActiveMQ5.9.x及以下版本使用JDK1.7即可正常使用。上传至Linux服务器解压安装文件tar -zxf apache-activemq-5.9.0-bin.tar.gz检查权限ls -al apache-activemq-5.9…

DB2表结构DDL脚本导出

db2look是导出DDL语句脚本的命令&#xff0c;以下是对db2look的一个简单介绍。 语法&#xff1a;db2look -d <数据库名> -e -t <表名> -o <文件名>.dml -d&#xff1a;数据库名&#xff0c;这必须指定。 -e:抽取复制数据所需要的DDL文件&#xff0c;此项将生…

套装门安装_室内套装门-油漆工艺

上一期我们分享了套装门的分类和区别&#xff0c;主要从门芯和门皮的结构&#xff0c;主要分为纯实木门、实木复合门、模压门三种。也分享了三种类型的门的区别和基本定义&#xff0c;其中最为关键的是实木复合门&#xff0c;四层结构&#xff0c;其中门芯的填充料可操作空间很…

activiti 工作流_分享:springboot中关于工作流activiti的搭建

概念工作流产品使用activiti的算是比较多了&#xff0c;自带了一套UI界面&#xff0c;可以直接使用&#xff0c;用来设计流程&#xff0c;下面简单总结一下它的步骤&#xff1a;1 设计模型2 发布为流程&#xff0c;一个模型可以发布多个版本的流程3 建立一个流程的实例和实例任…

ae saber插件_AE激光插件Video Copilot Saber安装方法

AE激光Video Copilot Saber插件可以制作出能量光束&#xff0c;激光&#xff0c;传送门&#xff0c;闪电&#xff0c;电流&#xff0c;朦胧等特效&#xff0c;内含有40多种不同类型的特效预设&#xff0c; 下面说下AE激光插件saber安装方法。插件特色&#xff1a; 1.可以创建高…

继电器rc吸收电路取值_继电器的工作原理以及驱动电路解析

继电器是具有隔离功能的自动开关元件&#xff0c;广泛应用于遥控、遥测、通讯、自动控制、机电一体化及电力电了设备中&#xff0c;是最重要的控制元件之一。继电器实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。…

口腔取模过程及注意事项_康贝齿科首家引进LAUNCA数字化口腔扫描,走进口腔数字化诊疗时代!...

口腔领域中的数字化技术包括数字化印模、数字化诊断与治疗、数字化生产、数字化手术导航、影像学以及相关材料的应用等。20世纪70年代Duret医生将工业数字化生产技术应用于口腔临床工作的大胆设想&#xff0c;使口腔数字化印模技术应运而生&#xff0c;走进现代医学的前沿。该设…

dataframe修改列名_python dataframe操作大全数据预处理过程(dataframe、md5)

hive表的特征选择&#xff0c;不同表之间的join训练数据、测试数据的分开保存使用pandas进行数据处理显示所有列&#xff1a;pd.set_option(display.max_columns, None)显示所有行&#xff1a;pd.set_option(display.max_rows, None)单列运算&#xff1a;df[col2] df[col1].ma…

android 获取控件高度_安卓开发入门教程UI控件_ProgressBar

什么是ProgressBarProgressBar是用于提示用户进行等待的UI控件,.基础样例1.loading图效果图代码布局文件代码<ProgressBarandroid:id"id/progressBar"style"?android:attr/progressBarStyle"android:layout_width"wrap_content"android:layo…

什么叫大地高_什么才叫睡得好?睡觉能满足这5个标准,说明睡眠质量高

每个人的睡觉习惯以及睡眠质量都是不一样的&#xff0c;有的人一晚甜睡到天亮&#xff0c;有的人则整晚辗转反侧难以入眠&#xff0c;有的人甚至会整晚都睡不着。睡眠质量的高低会影响一个人的精神状态以及工作的状态&#xff0c;而想要知道你的睡眠质量高不高&#xff0c;其实…

mysql function_Koa2 amp; mySQL amp; PM2 搭建后端服务

嘘&#xff01;啰嗦一句话。作为一名前端开发工程师&#xff0c;我们平常和后端接触最多的就是接口的对接。那么后端同事是怎么写一个接口来给到我们前端的同学去获取数据库数据并做一些花里胡哨的功能呢&#xff1f;今天我们就用Koa2 & mySql来搭建一个后端服务器&#xf…

datetime报错 sql脚本_《SQL必知必会》附录A样例表的获取和导入

拿到书的第二天就坐上了疫情期间的第一次飞机。。。飞机还延误了2个小时&#xff0c;有国外入境转机旅客搭乘了该趟航班&#xff0c;第一次觉得疫情离我这么近&#xff0c;不过还是坚持着到达了目的地&#xff0c;能做的只有带好口罩和手套。3个小时的飞行时间被拖到了5个小时&…

python不同版本共存_多个python版本共存时的pip配置

两种方法来配置pip Func1: 1.1 找到python环境的安装包&#xff0c;将python.exe文件重命名&#xff0c;如&#xff1a;将python2.7版本的python.exe重命名为Python2.exe,将python3.x版本的python.exe重命名为python3.x.exe。1.2 下面找到python安装包下的 Scripts文件夹下 pip…

dubbo的端口地址和ip写在那_开源一款超实用的 Dubbo 测试工具,已用半年,感觉很有feel~...

不知道你是否在工作中有遇到过类似情况&#xff1a;dubbo接口调试复杂&#xff0c;需要通过telnet命令或者通过consumer调用来触发。telnet语句参数格式复杂&#xff0c;每次编写都要小心谨慎&#xff0c;一旦出错又需重来。复杂对象参数传参调用接口复杂&#xff0c;编写java …

[修复] Firemonkey 使用 DrawPath 断线问题(Android iOS 平台)

问题&#xff1a;使用 Canvas.DrawPath 绘制时&#xff0c;最后一点无法画到终点位置。&#xff08;这个问题要在粗线才能察觉&#xff09; 适用&#xff1a;Delphi 10 Seattle &#xff08;或更早的版本&#xff09; for Android & iOS 修复方法&#xff1a; 请将源码 FMX…

叠加卡片列表_使用PowerBI制作卡片图

如果要汇报重要的指标&#xff0c;比如超额完成的销售额、同比增长率等&#xff0c;不要把它埋没在图表里&#xff0c;用一个大大的数字自豪的展示它吧。卡片图&#xff0c;也被称为大数字磁贴&#xff0c;严格来说不能算是一种图表&#xff0c;只是仪表板的一个组件而已。在仪…