当前位置:   article > 正文

最简单的基于FFmpeg的AVDevice例子(屏幕录制)_雷霄骅ffmpeg录屏实现

雷霄骅ffmpeg录屏实现

=====================================================
最简单的基于FFmpeg的AVDevice例子文章列表:

最简单的基于FFmpeg的AVDevice例子(读取摄像头)

最简单的基于FFmpeg的AVDevice例子(屏幕录制)
=====================================================


FFmpeg中有一个和多媒体设备交互的类库:Libavdevice。使用这个库可以读取电脑的多媒体设备的数据,或者输出数据到指定的多媒体设备上。

计划写2个有关FFmpeg的libavdevice类库的例子。上篇文章记录了一个基于FFmpeg的Libavdevice类库读取摄像头数据的例子。本篇文章记录一个基于FFmpeg的Libavdevice类库录制屏幕的例子。本文程序录制当前桌面内容并且解码显示出来。有关解码显示方面的代码本文不再详述,可以参考文章:
100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)

抓屏方法

上篇文章记录了libavdevice的使用方法,本文不再重复。在Windows系统使用libavdevice抓取屏幕数据有两种方法:gdigrab和dshow。下文分别介绍。
1. gdigrab
gdigrab是FFmpeg专门用于抓取Windows桌面的设备。非常适合用于屏幕录制。它通过不同的输入URL支持两种方式的抓取:
(1)“desktop”:抓取整张桌面。或者抓取桌面中的一个特定的区域。
(2)“title={窗口名称}”:抓取屏幕中特定的一个窗口(目前中文窗口还有乱码问题)。
gdigrab另外还支持一些参数,用于设定抓屏的位置:
offset_x:抓屏起始点横坐标。
offset_y:抓屏起始点纵坐标。
video_size:抓屏的大小。
framerate:抓屏的帧率。
参考的代码如下:

  1. //Use gdigrab
  2. AVDictionary* options = NULL;
  3. //Set some options
  4. //grabbing frame rate
  5. //av_dict_set(&options,"framerate","5",0);
  6. //The distance from the left edge of the screen or desktop
  7. //av_dict_set(&options,"offset_x","20",0);
  8. //The distance from the top edge of the screen or desktop
  9. //av_dict_set(&options,"offset_y","40",0);
  10. //Video frame size. The default is to capture the full screen
  11. //av_dict_set(&options,"video_size","640x480",0);
  12. AVInputFormat *ifmt=av_find_input_format("gdigrab");
  13. if(avformat_open_input(&pFormatCtx,"desktop",ifmt,&options)!=0){
  14. printf("Couldn't open input stream.(无法打开输入流)\n");
  15. return -1;
  16. }

2. dshow
使用dshow抓屏需要安装抓屏软件:screen-capture-recorder
软件地址: http://sourceforge.net/projects/screencapturer/
下载软件安装完成后,可以指定dshow的输入设备为“screen-capture-recorder”即可。有关dshow设备的使用方法在上一篇文章中已经有详细叙述,这里不再重复。参考的代码如下:
  1. AVInputFormat *ifmt=av_find_input_format("dshow");
  2. if(avformat_open_input(&pFormatCtx,"video=screen-capture-recorder",ifmt,NULL)!=0){
  3. printf("Couldn't open input stream.(无法打开输入流)\n");
  4. return -1;
  5. }

注:上述两种抓屏方法也可以直接使用ffmpeg.exe的命令行完成,可以参考文章:

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

在Linux下可以使用x11grab抓屏,在MacOS下可以使用avfoundation抓屏,在这里不再详细叙述。

代码

下面直接贴上程序代码:


                
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/308898
推荐阅读
相关标签
  

闽ICP备14008679号