FFmpeg获取DirectShow设备数据(摄像头,录屏)
这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘。本文所述的方法主要是对应Windows平台的。
1. 列设备
ffmpeg -list_devices true -f dshow -i dummy
命令执行后输出的结果如下(注:中文的设备会出现乱码的情况)。列表显示设备的名称很重要,输入的时候都是使用“-f dshow -i video="{设备名}"”的方式。
我自己的机器上列出了以下设备:
[dshow @0388f5e0] DirectShow video devices [dshow @0388f5e0] "Integrated Camera" [dshow @0388f5e0] "screen-capture-recorder" [dshow @0388f5e0] DirectShow audio devices [dshow @0388f5e0] "鍐呰楹﹀厠椋?(Conexant20672 SmartAudi" [dshow @0388f5e0] "virtual-audio-capturer"
下文的测试中,使用其中的两个视频输入:"Integrated Camera"和"screen-capture-recorder"。
注:音频设备出现乱码,这个问题的解决方法会随后提到。
2. 获取摄像头数据(保存为本地文件或者发送实时流)
2.1. 编码为H.264,保存为本地文件
下面这条命令,实现了从摄像头读取数据并编码为H.264,最后保存成mycamera.mkv。
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 mycamera.mkv
2.2. 直接播放摄像头的数据
使用ffplay可以直接播放摄像头的数据,命令如下:
ffplay -f dshow -i video="Integrated Camera"
如果设备名称正确的话,会直接打开本机的摄像头,如图所示。
注:除了使用DirectShow作为输入外,使用VFW也可以读取到摄像头的数据,例如下述命令可以播放摄像头数据:
ffplay -f vfwcap -i 0
此外,可以使用FFmpeg的list_options查看设备的选项:
ffmpeg -list_options true -f dshow -i video="Integrated Camera"
输出如下:
[dshow @ 03845420] DirectShow video device options [dshow @ 03845420] Pin "鎹曡幏" [dshow @ 03845420] pixel_format=bgr24 min s=640x480 fps=15 max s=640x480 fps=30 [dshow @ 03845420] pixel_format=bgr24 min s=640x360 fps=15 max s=640x360 fps=30 [dshow @ 03845420] pixel_format=bgr24 min s=352x288 fps=15 max s=352x288 fps=30 [dshow @ 03845420] pixel_format=bgr24 min s=320x240 fps=15 max s=320x240 fps=30 [dshow @ 03845420] pixel_format=bgr24 min s=800x448 fps=1 max s=800x448 fps=15 [dshow @ 03845420] pixel_format=bgr24 min s=960x544 fps=1 max s=960x544 fps=10 [dshow @ 03845420] pixel_format=bgr24 min s=1280x720 fps=1 max s=1280x720 fps=10 [dshow @ 03845420] pixel_format=bgr24 min s=424x240 fps=15 max s=424x240 fps=30 [dshow @ 03845420] pixel_format=yuyv422 min s=640x480 fps=15 max s=640x480 fps=30 [dshow @ 03845420] pixel_format=yuyv422 min s=640x360 fps=15 max s=640x360 fps=30 [dshow @ 03845420] pixel_format=yuyv422 min s=352x288 fps=15 max s=352x288 fps=30 [dshow @ 03845420] pixel_format=yuyv422 min s=320x240 fps=15 max s=320x240 fps=30 [dshow @ 03845420] pixel_format=yuyv422 min s=800x448 fps=1 max s=800x448 fps=15 [dshow @ 03845420] pixel_format=yuyv422 min s=960x544 fps=1 max s=960x544 fps=10 [dshow @ 03845420] pixel_format=yuyv422 min s=1280x720 fps=1 max s=1280x720 fps=10 [dshow @ 03845420] pixel_format=yuyv422 min s=424x240 fps=15 max s=424x240 fps=30 [dshow @ 03845420] vcodec=mjpeg min s=640x480 fps=15 max s=640x480 fps=30 [dshow @ 03845420] vcodec=mjpeg min s=640x360 fps=15 max s=640x360 fps=30 [dshow @ 03845420] vcodec=mjpeg min s=352x288 fps=15 max s=352x288 fps=30 [dshow @ 03845420] vcodec=mjpeg min s=320x240 fps=15 max s=320x240 fps=30 [dshow @ 03845420] vcodec=mjpeg min s=800x448 fps=15 max s=800x448 fps=30 [dshow @ 03845420] vcodec=mjpeg min s=960x544 fps=15 max s=960x544 fps=30 [dshow @ 03845420] vcodec=mjpeg min s=1280x720 fps=15 max s=1280x720 fps=30
可以通过输出信息设置摄像头的参数。
例如,设置摄像头分辨率为1280x720
ffplay -s 1280x720 -f dshow -i video="Integrated Camera"
设置分辨率为424x240
ffplay -s 424x240 -f dshow -i video="Integrated Camera"
2.3. 编码为H.264,发布UDP
下面这条命令,实现了:获取摄像头数据->编码为H.264->封装为UDP并发送至组播地址。
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并发送至组播地址。
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服务器。
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即可。
ffmpeg -f dshow -i video="Integrated Camera" -vcodec mpeg2video -f mpeg2video udp://233.233.233.223:6666
播放MPEG2的UDP流如下。指明-vcodec为mpeg2video即可
ffplay -vcodec mpeg2video udp://233.233.233.223:6666
3. 屏幕录制(Windows平台下保存为本地文件或者发送实时流)
Linux下使用FFmpeg进行屏幕录制相对比较方便,可以使用x11grab,使用如下的命令:
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进行录屏。
3.1. 编码为H.264,保存为本地文件
下面的命令可以将屏幕录制后编码为H.264并保存为本地文件。
ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency MyDesktop.mkv
注:“-r 5”的意思是把帧率设置成5。
最后得到的效果如下图。
此外,也可以录声音,声音输入可以分成两种:一种是真人说话的声音,通过话筒输入;一种是虚拟的声音,即录屏的时候电脑耳机里的声音。下面两条命令可以分别录制话筒的声音和电脑耳机里的声音。
录屏,伴随话筒输入的声音
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之后,开始测试不行,后来发现是自己疏忽大意,乱码部分转码后为“内装麦克风 ”,然后接可以正常使用了。因此,命令应该如下图所示:
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选择“图像->插入滤镜”
然后就可以通过查看Audio Capture Sources来查看音频输入设备的简体中文名称了。从图中可以看出是“内装麦克风 (Conexant 20672 SmartAudi”。
PS:感觉这条命令适合做讲座之类的时候使用
录屏,伴随耳机输入的声音
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发送到组播地址
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并发送到组播地址
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文件。该文件可以用于该视频流的播放。如下命令即可播放:
ffplay test.sdp
3.4. 编码为H.264,发布RTMP
原理同上,不再赘述。
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://localhost/oflaDemo/livestream
注意:播放RTMP的时候,-max_delay参数会比较明显的影响延迟,将此参数值设定小一些,有利于降低延时。
ffplay -max_delay 100000 "rtmp://localhost/oflaDemo/livestream live=1"
4.另一种屏幕录制的方式(2014.10.1更新)
(2)“title={窗口名称}”:抓取屏幕中特定的一个窗口。
ffmpeg -f gdigrab -i desktop out.mpg
从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5
ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg
FFmpeg获取DirectShow设备数据(摄像头,录屏)的更多相关文章
- 【转】FFmpeg获取DirectShow设备数据(摄像头,录屏)
这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1. 列设备 ffmpeg -list_devic ...
- Android设备一对多录屏直播--(UDP组播连接,Tcp传输)
原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...
- ffmpeg,rtmpdump和nginx rtmp实现录屏,直播和录制
公司最近在做视频直播的项目,我这里分配到对直播的视频进行录制,录制的方式是通过rtmpdump对rtmp的视频流进行录制 前置的知识 ffmpeg: 用于实现把录屏工具发出的视频和音频流,转换成我们需 ...
- 新手学习FFmpeg - 调用API完成录屏
调用FFMPEG Device API完成Mac录屏功能. 调用FFMPEG提供的API来完成录屏功能,大致的思路是: 打开输入设备. 打开输出设备. 从输入设备读取视频流,然后经过解码->编码 ...
- iOS ReplayKit 录屏 框架的使用
在需要使用录屏的 地方 引入 头文件 #import <ReplayKit/ReplayKit.h> 添加代理 RPPreviewViewControllerDelegate 因为 iOS ...
- Mac录屏同时录制系统声音和画外音(Soundflower无法安装解决方案)
个人博客地址:xzajyjs.cn 前言 以前一直有录屏的需求,但苦于自带的QuickTime 无法录制内屏声音,一直使用的是第三方的app.近期开腾讯会议需要录屏,但主持人本身没有开启录屏权限,只好 ...
- Unity 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能
目录 一.FFmpeg简介. 二.FFmpeg常用参数及命令. 三.FFmpeg在Unity 3D中的使用. 1.FFmpeg 录屏. 2.FFmpeg 推流. 3.FFmpeg 其他功能简述. 一. ...
- 新手学习FFmpeg - 调用API完成录屏并进行H.264编码
Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调 ...
- 基于FFMpeg的C#录屏全攻略
最近负责一个录屏的小项目,需要录制Windows窗口内容并压缩保存到指定文件夹,本想使用已有的录屏软件,但是本着学习的态度去探索了FFMpeg,本文主要介绍基于FFMpeg开源项目的C#录屏软件开发. ...
随机推荐
- Spring MVC运行流程
一.配置阶段 ①web.xml ②DispatcherServlet //Spring MVC总入口 ③配置初始化参数 //classpath:application.xml,用于配置无数个 ...
- selenium登录163邮箱
环境:windows8 python2.7+selenium+chrome 直接上脚本: # coding=utf-8from selenium import webdriverimport tim ...
- 关于一些基础的Java问题的解答(七)
31. 反射的作用与原理 简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息.如果知道一个类的名称或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符 ...
- js强大的日期格式化函数,不仅可以格式化日期,还可以查询星期,一年中第几天等
js强大的日期格式化,timestamp支持10位或13位的时间戳,或是时间字符串,同时支持android ios的处理,不只是日期的格式化还有其它方法,比如获 获取某月有多少天 .获取某个日期在这一 ...
- FJUT寒假第一周作业浮点数查寻题解
二分强化——浮点数序列查询 TimeLimit:4000MS MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description ...
- PHP If...Else 语句
PHP If...Else 语句 条件语句用于根据不同条件执行不同动作. PHP 条件语句 当您编写代码时,您常常需要为不同的判断执行不同的动作.您可以在代码中使用条件语句来完成此任务. 在 PHP ...
- 终止Docker容器
可以使用 docker stop 来终止一个运行中的容器. 此外,当Docker容器中指定的应用终结时,容器也自动终止. 例如对于上一章节中只启动了一个终端的容器,用户通过 exit 命令或 Ctrl ...
- Ubuntu批量修改文件名后缀
比如把当前文件夹下所有scss文件后缀改为less rename 's/\.scss/\.less/' ./*
- 大规模WebGL应用引发浏览器崩溃的几种情况及解决办法
一般的Web应用基本上不会导致浏览器崩溃,写Javascript代码也不需要管理内存资源,基本也不需要考虑内存"泄露"的问题.随着H5的崛起,越来越多的原本在桌面端的软件也改头换面 ...
- ICL Auto Vectorization
简介 此文简单介绍如何使用intel c++编译器实现向量化加速. 全文如下安排: base : 待优化的源代码. vectorization : 第一个向量化版本. aligned : 内存对其对向 ...