wangyong
deepin
2018-01-25 19:00 https://bbs.deepin.org/post/152349
Windows 自带的 h264 解码器也是不能处理 yuv444p 的,虽然不用WMP的用户可能注意不到。为什么我知道?因为 ...
我早上写了个补丁,回滚到 yuv420p 了,然后用 -vf scale 来解决奇数大小的问题
https://github.com/manateelazyca ... 117839cc67d96b99761
Reply Like 0 View the author


中文 
……@&#¥%……


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版的录屏需要先卸载了),等内部质量测试通过后,会通过更新进行推送的。