LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 6110|回复: 35

ffcast: 巨小巧的屏幕录制工具

[复制链接]
发表于 2009-11-23 21:43:57 | 显示全部楼层 |阅读模式
论坛帖子 :: AUR页面

功能简介:
*调用ffmpeg录制所选屏幕区域
*支持ffmpeg所支持的所有编码格式
*选择录制区域的方式有多种:
>a) 全屏(-a选项)
>b) 鼠标点选; 支持选择多个窗口(-n选项)
>c) 命令行指定窗口ID; 支持选择多个窗口(-i选项)
>d) 鼠标拖拽选择, 就如同`scrot -s'(-s选项)
>e) 命令行自由指定选区 (-j选项)
*对于选区方式b)和c), 可选择考虑或者忽略窗口边框(-B/-b选项)
*默认采用无损x264编码,输出视频体积相当小巧
*可选所有ffmpeg预置的x264 presets, 使得视频质量控制更简便
*CLI

我在Michal Witkowski原来的小脚本的基础上, 增加/调整了相当数量的代码
另外从scrot的main.c中提取/修改了xrectsel.c, 以实现鼠标拖拽选择矩形区域的功能

安装后在/usr/bin/下会增加两个文件: ffcast 和 xrectsel

欢迎使用, 试验, 报错, 索要新功能
欢迎提供patch以及money ;)

编辑:
____重要更新: xrectsel.c代码重写, 修正了-s选项高CPU使用的现象 (如果你还没发现的话, 不妨htop一下)
编辑:
____更新: xrectsel现在采用十字形鼠标(XC_crosshair), 既有提示作用, 选择也更加准确.

编辑(11.29)
感谢糊涂同学对ffcast几次更新的汇总! 请跳转浏览器至:我在这里简单介绍一下最近的一些更新:
首先, 以下是现在 ffcast 会安装的几个文件
/usr/bin/ffcast
/usr/bin/xrectsel
/usr/share/ffcast/doc/ffcast.conf
/usr/share/man/man1/ffcast.1.gz
其中 ffcast.conf 是一个示例配置文件 -- 也就是说 ffcast 现在支持使用配置文件了,
如何使用和编辑配置文件:
mkdir "${XDG_CONFIG_HOME:-$HOME/.config}/ffcast"
cp /usr/share/ffcast/doc/ffcast.conf "${XDG_CONFIG_HOME:-$HOME/.config}/ffcast/ffcast.conf"
vim "${XDG_CONFIG_HOME:-$HOME/.config}/ffcast/ffcast.conf"
注意读一下文件开头的注释

另外 ffcast 现在有 man page 了, 不过不是非常完整. easycat还说读不懂 555。。

其余更新我懒得写了, 使用 --help 和 man page 应该足够了
如果你想详细了解更新的进度, 可以在 $srcdir/ffcast 使用 git log 查看

还有, 如果你有什么疑问, 请把问题描述出来, 不然我会满脑子都是问号的
发表于 2009-11-23 22:08:25 | 显示全部楼层
厉害....
回复 支持 反对

使用道具 举报

发表于 2009-11-23 22:56:35 | 显示全部楼层
thanks,非常不错,用上了
回复 支持 反对

使用道具 举报

发表于 2009-11-24 00:03:39 | 显示全部楼层
有配置文件就好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-24 00:54:21 | 显示全部楼层
ffcast是一个bash脚本, 需要修改默认行为最简单的就是直接编辑ffcast的{{{defaults}}}区域.
但这样的坏处是升级必然会取代这些设定.
如果要使用配置文件我能想到的最方便的方法就是source ~/$FFCASTCONF, 然而...我认为 source 比较容易带来安全上的问题...

我想听听大家的意见如何

新消息:
刚刚加了新选项, -t,--duration : 用来限制录制的最大时长. 这样就不必每次都按[q]才可以结束了.
回复 支持 反对

使用道具 举报

发表于 2009-11-24 09:11:49 | 显示全部楼层
请问,输出到图片gif为何不行呢?
需要libgif?
回复 支持 反对

使用道具 举报

发表于 2009-11-24 10:54:46 | 显示全部楼层
很好   很强大
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-24 11:55:21 | 显示全部楼层
Post by Havanna;2049367
请问,输出到图片gif为何不行呢?
需要libgif?

我在#ffmpeg问了这个问题:
11:36 <     canti> hi there. why this fails? http://dpaste.com/124352/
11:41 < theholydu> canti, i think it sorta
11:41 < theholyduck> prints out why it fails
11:41 < theholyduck> and what to do about it
11:41 < theholyduck> oh wait, you tried that
11:41 <     canti> yah..
11:42 < theholyduck> gif output sucks though
11:42 <     canti> i also tried putting elsewhere in the commandline -pix_fmt rgb24 ...
11:43 <     canti> i agree gif sucks, but somebody wants it xD
11:43 <@Dark_Shikari> ffmpeg's gif output sucks more
11:43 <@Dark_Shikari> try imagemagick maybe
11:44 <@bcoudurier> what's wrong with it ?
11:44 <@Dark_Shikari> I recall that it isn't very optimized iirc...
11:44 <@Dark_Shikari> I don't think it does global palettes
11:44 <@Dark_Shikari> optimized global palettes that is
11:44 <@Dark_Shikari> wait, it doesn't even do optimized palettes period
11:44 <     canti> Dark_Shikari: possible to fix my command line?
11:44 <@Dark_Shikari> there's even a great comment that says
11:45 <@Dark_Shikari> "better than nothing gif encoder"
11:45 <@bcoudurier> ah
11:46 <     canti> Does it do gif from x11grab? the import command? <-- <@Dark_Shikari> try imagemagick
                   maybe
11:46 <@Dark_Shikari> why not record the video once
11:46 <@Dark_Shikari> and then convert it to gif later?
11:46 <@Dark_Shikari> or use ffmpeg to write a series of, say, pngs
11:47 <@Dark_Shikari> and then convert those to an animated gif with imagemagick later
11:49 <     canti> Dark_Shikari: but that will be huge with pngs, and takes one more extra step with
                   converting later. i'm using this in a  screencast script, gif is just an output
                   option i thought it/ffmpeg should support.
... ...
11:56 <@bcoudurie> canti, -vcodec rawvideo -pix_fmt rgb24
11:56 <     canti> bcoudurier: let me try
11:58 <     canti> bcoudurier: it works. but it's HUGE!!! 26M for 5 sec
11:59 <@bcoudurier> yes, lzw compression is missing
11:59 <@bcoudurier> it's "better than nothing"
11:59 < Haxar> or you could just pipe it :p
11:59 <@bcoudurier> anyway I'm off
12:00 <     canti> Haxar: i was thinking about this, but well...
看来目前找不到比较好的解决办法 ..

下面的命令使用ImageMagick的convert把ffmpeg编码的raw格式转成压缩格式的gif
  1. $ ffmpeg -r 15 -s 640x480 -an -f x11grab -i ${DISPLAY}+0+0 -vcodec rawvideo -pix_fmt rgb24 -f gif -t 5 - | convert gif:- cast.gif
复制代码
不过rbg24格式录制出来的效果颜色失真是很严重的... 即使上面的办法可行, 我个人也不会采用gif输出...

编辑:
最新的脚本支持使用-c gif或-f gif输出gif文件, 但由于ffmpeg貌似只支持未压缩的gif输出, 文件会很大. 参看git log:
    fixed :: gif output now is supported, but is uncompressed, which \
    means it will be HUGE, possible solutions:
      * pipe it to convert gif:- output.gif; this requires ImageMagick;
      * find a way to tell ffmpeg how to do compressed gif;
      * do not use gif format;
    formatting :: rearranged, overall formatting looks clearer.
:: 如果必须用gif输出, 目前比较令人满意的解决方法是使用 -o - 管道传送给convert进行gif压缩
ffcast -s -t 5 -c gif -f gif -o - --debug | convert gif:- cast.gif
回复 支持 反对

使用道具 举报

发表于 2009-11-24 16:27:56 | 显示全部楼层
强大…………………………
回复 支持 反对

使用道具 举报

发表于 2009-11-24 18:43:40 | 显示全部楼层
  1. ffcast -s -r 3 -f gif -o - --debug | convert gif:- 1.gif
复制代码

用了下,感觉非常完美
就是颜色失真还是真厉害。。。
thanks
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表