深度录屏几乎快完美了
Tofloor
poster avatar
wangyong
deepin
2018-01-25 10:08
Author
今天晚上参加了WHLUG, 和肥猫大神(玩Arch的都认识)现场交流,一口气修复了三个重要的Bug。

1、GIF录制的时候,录制的时间稍微长一点,最后录制的GIF总是不全(今天彻底修复了,补丁: https://github.com/manateelazyca ... a8da37053f471541d83)
2、GIF录制太快(比如就录制1秒钟,深度内部的变态测试大神的快手)时会导致GIF文件损坏,无法播放
3、MP4文件录制因为 ffmpeg "width/height not divisible by 2" 的错误,总是生成0字节的mp4文件,无法播放 (补丁: https://github.com/manateelazycat/deepin-screen-recorder/commit/a49612faed28fc70a98aa117839cc67d96b99761)

技术细节分享:
1、GIF丢东西和文件损坏都是因为原来深度录屏结束的时候,直接kill调GIF后台进程byzanz-record导致的, byzanz-record隔几秒机会把当前录制的GIF片段写到临时文件中,然后定期合并这些磁盘的临时文件追加到最后的GIF文件中,因为录屏原来是直接kill byzanz-record 进程,导致 byzanz-record 还没有合并完所有的临时文件就被杀掉了,因故用户最后看到的GIF文件内容就不完全。

解决方案:给 byzanz-record 命令添加 --exec 'sleep 365d' 的参数,sleep 365d 命令的意思是休息 365 天的意思(哈哈哈),只要 sleep 进程不退出,byzanz-record 进程就永远的录制GIF, 当用户结束录屏的时候,就顺藤摸瓜从 byzanz-record 找到 sleep 进程的pid, 杀死 sleep 进程后 byzanz-record 就知道自己该退出了,最后深度录屏进程再等着 byzanz-record 进程正常退出后,录制的GIF内容就完整了,也不会有损坏的问题。

简单来说解决方案,就是 “深度录屏这个老子,通过杀死自己孙子(sleep命令)的方式让自己的儿子(byzanz-record)心甘情愿的自杀”

2、MP4的问题是原来有很多用户抱怨深度录屏录制的mp4文件,不能在手机微信上播放,因为微信的视频播放器解码不了 ffmpeg 默认的yuv444p图形格式,所以我把ffmpeg mp4的图形格式改成yuv420p,yuv420p的mp4文件虽然可以在手机上播放,但是会导致如果用户截取的屏幕区域不是偶数的时候,ffmpeg 会直接崩溃,导致最后录制的mp4文件都是0字节。

解决方案:通过-vf scale=trunc(iw/2)*2:trunc(ih/2)*2 的方式结局了奇数大小报错的问题。

最后,为什么标题是“几乎完美”?因为我知道你们都在等我的录屏可以支持双屏自由录制的功能,我都在我的todolist上记录着的呢,一定会把深度录屏做完美的,让你们无可挑剔,哈哈哈哈。


最最最后,附件中有深度录屏的最新开发版,下载点击即可安装更新(FlatPak版的录屏需要先卸载了),等内部质量测试通过后,会通过更新进行推送的。

Reply Favorite View the author
All Replies
2 / 3
To page
avatar
wangyong
deepin
2018-01-25 19:00
#21
https://bbs.deepin.org/post/152349
Windows 自带的 h264 解码器也是不能处理 yuv444p 的,虽然不用WMP的用户可能注意不到。为什么我知道?因为 ...

我早上写了个补丁,回滚到 yuv420p 了,然后用 -vf scale 来解决奇数大小的问题

https://github.com/manateelazyca ... 117839cc67d96b99761
Reply View the author
avatar
duanyao
deepin
2018-01-25 19:34
#22
https://bbs.deepin.org/post/152349
用户会觉得设置的越高越好,单其实高到一定程度以后, ffmpeg 就不会工作了。 ;) ...

超范围的数值给个警告就行了。
Reply View the author
avatar
wangyong
deepin
2018-01-25 20:31
#23
https://bbs.deepin.org/post/152349
超范围的数值给个警告就行了。

可以通过配置文件提供选项,但是不会提供图形界面改这些东西。

深度的所有项目都必须达到产品的要求,不会像KDE那样提供各种各样的天书般的东西干扰用户思考。
Reply View the author
avatar
duanyao
deepin
2018-01-25 20:35
#24
https://bbs.deepin.org/post/152349
可以通过配置文件提供选项,但是不会提供图形界面改这些东西。

深度的所有项目都必须达到产品的要求,不 ...

我的意思就是配置文件,你前面提到的无损模式也是配置文件选项嘛,设定crf值更通用一些。
Reply View the author
avatar
sudo_free
deepin
2018-01-25 20:37
#25
https://bbs.deepin.org/post/152349
可以通过配置文件提供选项,但是不会提供图形界面改这些东西。

深度的所有项目都必须达到产品的要求,不 ...

让我想到了unity-tweak-tool,把这些零碎的不重要的配置整合起来(也就是说接口还是有的)
Reply View the author
avatar
wangyong
deepin
2018-01-25 20:50
#26
https://bbs.deepin.org/post/152349
我的意思就是配置文件,你前面提到的无损模式也是配置文件选项嘛,设定crf值更通用一些。 ...

可以的,写个配置还是比较简单的,谢谢建议。
Reply View the author
avatar
wangyong
deepin
2018-01-25 21:17
#27
https://bbs.deepin.org/post/152349
我的意思就是配置文件,你前面提到的无损模式也是配置文件选项嘛,设定crf值更通用一些。 ...

帧率定制选项已经添加: https://github.com/linuxdeepin/d ... bc0ad856e1de140a440
Reply View the author
avatar
moriwuhen
deepin
2018-01-25 21:38
#28
可否实现关闭特效的情况下录屏?
Reply View the author
avatar
wangyong
deepin
2018-01-25 22:08
#29
https://bbs.deepin.org/post/152349
可否实现关闭特效的情况下录屏?

录屏依赖窗口透明特效,没法做
Reply View the author
avatar
海天鹰
deepin
2018-01-26 00:06
#30
本帖最后由 sonichy 于 2018-1-25 16:08 编辑

总以为是自己操作问题,原来是BUG。
依赖不满足:libdtkcore2>=2.0.6
Reply View the author
avatar
yech
deepin
2018-01-26 00:17
#31
我觉得老王应该多点精力在自己最拿手的terminal上。录屏,取色这类的本身不是系统不可或缺的,就是是有bug也比其他 发行版的要好很多。

但是像terminal,desktop这一类的本身就是要和其他发行版同类型的应用对着杠的,如果这都一直有修不玩的bug,真心影响用户体验。
Reply View the author
avatar
wangyong
deepin
2018-01-26 01:18
#32
https://bbs.deepin.org/post/152349
我觉得老王应该多点精力在自己最拿手的terminal上。录屏,取色这类的本身不是系统不可或缺的,就是是有bug ...

桌面要团队才能管,一直在修复bug
终端有问题,你就说呗

我的其他项目就是我一个人,有空就补一个软件,怎么不好呢?
就算我做了那么多项目,终端我觉得功能还是维护都是问心无愧的吧。
你们真是的,我这么拼命的造轮子还被说。 
Reply View the author
avatar
RucLinux
deepin
2018-01-26 07:06
#33
https://bbs.deepin.org/post/152349
经过公司大神的指点,用  -vf=scale=trunc(iw/2)*2:trunc(ih/2)*2  就可以修复奇数大小导致ffmpeg崩溃的 ...

-vf scale= 这个是设置录制像素的吧,这算法是时间参数?
Reply View the author
avatar
wangyong
deepin
2018-01-26 17:28
#34
https://bbs.deepin.org/post/152349
-vf scale= 这个是设置录制像素的吧,这算法是时间参数?

这句话的意思是把视频的宽度或高度弄成偶数的,避免 yuv420p 图像格式的时候,ffmpeg爆出因为大小是奇数的错误
Reply View the author
avatar
ih******op@vip.qq.com
deepin
2018-01-26 22:24
#35
第一个问题的最佳解决方案难道不是给byzanz-record弄个有控制管道的socket或者干脆定义一个进程信号让他自己主动退出吗,直接杀不管是儿子还是老子太暴力了?
Reply View the author
avatar
wangyong
deepin
2018-01-27 00:41
#36
ihipop 发表于 2018-1-26 14:24
第一个问题的最佳解决方案难道不是给byzanz-record弄个有控制管道的socket或者干脆定义一个进程信号让他自 ...

你会发现 sleep 365d 是所有方案最简单的,不用通讯和维护代码,直接杀孙子进程既可以了
Reply View the author
avatar
ih******op@vip.qq.com
deepin
2018-01-27 01:15
#37
https://bbs.deepin.org/post/152349
你会发现 sleep 365d 是所有方案最简单的,不用通讯和维护代码,直接杀孙子进程既可以了 ...

是最简单的,但是如果我正好也运行了一个sleep 365d呢,,,,,,

当然,这种可能性,很小很小很小。。。。
Reply View the author
avatar
wangyong
deepin
2018-01-27 01:19
#38
ihipop 发表于 2018-1-26 17:15
是最简单的,但是如果我正好也运行了一个sleep 365d呢,,,,,,

当然,这种可能性,很小很小很小。。 ...

我是通过pid来精准杀进程的,我怎么可能按名字来杀进程啊?笑死我啦,哈哈哈啊
Reply View the author
avatar
moriwuhen
deepin
2018-01-28 17:55
#39
https://bbs.deepin.org/post/152349
2d模式我都用深度商店的peek

……@&#¥%……
Reply View the author
avatar
rekols
deepin
2018-01-28 18:16
#40
https://bbs.deepin.org/post/152349
可否实现关闭特效的情况下录屏?

deepin-metacity --composite --replace
Reply View the author
2 / 3
To page