`

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

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 20672SmartAudi" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv

 

上述命令有问题:audio那里有乱码,把乱码ANSI转UTF-8之后(乱码变成“内装麦克”)依然不行,这个问题先留着,以后有时间再解决。

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"


 

分享到:
评论

相关推荐

    FFmpeg获取网络摄像头数据解码

    在网络摄像头数据获取过程中,FFmpeg通过libavformat的`av_open_input()`函数打开网络摄像头源,然后使用`av_find_stream_info()`来解析流信息。这个过程包括识别网络摄像头输出的视频流类型、编码格式等。接着,...

    QT多线程调用摄像头录屏

    在本项目中,我们主要会使用OpenCV库来获取摄像头的视频流,Qt5框架来构建用户界面并处理多线程,以及FFmpeg工具来进行视频压缩。下面将详细介绍这三个关键知识点。 1. **OpenCV**: OpenCV(开源计算机视觉库)是...

    基于Qt+ffmpeg设计的推流与录屏软件(高级版)

    功能:支持选择码率、推流摄像头或者桌面画面到流媒体服务器、或者是将摄像头、桌面画面录制保存到本地。 Qt版本: 5.12.6 FFMPEG版本: 4.2.2 特点:采用Qt、ffmpeg 开发,功能完善,可以很方便的移植到其他系统。

    C++ 视频录制播放 FFMPEG_Player

    FFMPEG_Player是一款基于C++实现的视频录制与播放软件,它利用了FFmpeg库的强大功能。FFmpeg是一个开源项目,提供了丰富的音频和视频处理工具,包括编解码器、格式转换、流处理等。在FFMPEG_Player中,我们可以看到...

    windows下ffmpeg推流桌面与摄像头数据到流媒体服务器源码.7z

    这是windows下ffmpeg推流桌面与摄像头数据到流媒体服务器源码,该软件里推流和视频保存使用FFMPEG库完成,视频和音频可以同步推流和录制,FFMPEG本身支持跨平台编译开发,QT也支持跨平台,在Android、Linux、windows...

    ffmpeg录音+录屏

    在本场景中,我们关注的是"ffmpeg录音+录屏"的应用,这涉及到使用FFmpeg进行屏幕捕获和音频录制的技术。 首先,录屏功能在FFmpeg中是通过`ffmpeg`命令行工具的`-f x11grab`选项来实现的。`x11grab`是一个源设备,它...

    用FFmpeg API采集摄像头视频和麦克风音频

    之前一直用Directshow技术采集摄像头数据,但是觉得涉及的细节比较多,要开发者比较了解Directshow的框架知识,学习起来有一点点难度。最近发现很多人问怎么用FFmpeg采集摄像头图像,事实上FFmpeg很早就支持通过...

    Linux下使用ffmpeg录屏代码

    在Linux操作系统中,录制屏幕是一项常见的任务,而`ffmpeg`是一个强大的开源工具,可以用于音频、视频处理,包括录屏功能。本项目是用C++编写的,利用`ffmpeg`库来实现这一目的。让我们深入了解一下如何在Linux环境...

    FFMPEG+OPENCV获取摄像头视频流并显示

    1.开发环境:vs2015; 2.FFMPEG获取本地摄像头视频流,OPENCV嵌入MFC对话框中显示; 3.程序包中包括FFMPEG和OPENCV资源包; 4.环境已配置好,拿到代码修改查找摄像头名称即可编译运行;

    qt获取设备名称并利用ffmpeg执行外部命令行实现录屏和录制摄像头

    本文将深入探讨如何使用Qt获取设备名称,并通过调用FFmpeg的命令行工具实现屏幕录制和摄像头视频的捕捉。 Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的API和工具,使得开发者可以方便地创建...

    ffmpeg录屏

    在FFmpeg中,录屏主要是通过获取屏幕的内存设备上下文(DC,Device Context)来捕获屏幕图像。内存DC是一种用于在内存中存储图形信息的方法,它可以高效地抓取屏幕内容,然后将这些内容传递给FFmpeg进行编码。 要...

    C#调用ffmpeg录屏并通过网络发送出去

    ffmpeg录屏并通过UDP发送出去,接收端的可以直接播放或者保存: 1)播放:ffplay -f h264 udp://本机IP:6666 2)保存:ffmpeg -i udp://本机IP:6666 -c copy dump.flv 由于是采用UDP方式发送出去的,接收端是否在线...

    基于Qt和FFmpeg开发的一款简易录屏软件源码+项目说明.zip

    基于Qt和FFmpeg开发的一款简易录屏软件源码+项目说明.zip 基于Qt、FFmpeg开发的一款简易录屏软件 1、支持屏幕录制和音频录制 2、支持本地录制和网络推流 3、推流服务器使用Nginx-RTMP推流模块 【备注】 1、该...

    electron+ffmpeg+vue3 录屏推流 源代码 真实有效

    标题中的“electron+ffmpeg+vue3 录屏推流 源代码 真实有效”揭示了这个项目的核心技术栈,它是一个基于Electron、FFmpeg和Vue3的桌面应用,用于屏幕录制并实时推流。让我们逐一深入探讨这些技术及其在该项目中的...

    android ffmpeg mpeg编码-调用摄像头

    6. 开始录制,读取摄像头数据,使用`avcodec_encode_video2`进行编码,生成MPEG编码的输出数据。 7. 将编码后的数据写入输出文件,这可能涉及到`av_interleaved_write_frame`或`av_write_trailer`等函数。 8. 最后,...

    QT+vs+directshow获取摄像头名称及其支持的分辨率

    它基于COM(Component Object Model)接口,为开发者提供了底层硬件访问的能力,能够获取摄像头、DV设备等的视频数据,并进行实时处理和播放。 在实现“QT+VS+DirectShow获取摄像头名称及其支持的分辨率”时,你...

    使用 ffmpeg dshow 实现系统录屏 .Net(C#)

    使用 ffmpeg dshow 实现系统录屏 .Net(C#) 帮助类。 需要安装 Setup Screen Capturer Recorder

    利用ffmpeg从USB摄像头获取视频并保存为H264的TS流的C语言源代码

    要从USB摄像头获取视频流,我们需要找到设备并打开它。在FFmpeg中,我们可以使用`avformat_open_input()`函数来实现。摄像头通常是V4L2(Video for Linux Two)设备,设备名通常为"/dev/video0"。需要检查系统上的...

    Qt调用FFmpeg命令录屏

    在本文中,我们将深入探讨如何在Windows平台上使用Qt框架调用FFmpeg命令行工具来实现录屏功能。FFmpeg是一个强大的开源多媒体处理工具,而Qt则是一个跨平台的应用程序开发框架,两者结合可以轻松实现复杂的视频录制...

    Qt 采集摄像头 录屏

    通过FFmpeg,你可以获取屏幕的RGB数据流,然后将其编码成视频流。FFmpeg库提供了一套C/C++ API,可以方便地集成到Qt应用中。 在实际开发中,还需要处理各种异常情况,如摄像头未连接、权限问题、编码错误等。同时,...

Global site tag (gtag.js) - Google Analytics