2014年12月14日星期日

GCC LTO 连接时优化的几点注意

GCC 4.7 开始支持 Link Time Optimization (LTO),即连接时优化,可以使跨不同源文件的函数之间的关系得到进一步的优化。
它的做法是先把源代码编译成 GIMPLE 中间码,再在连接的时候生成真正的机器码。
在 Linux 上编译本机程序时一直正常工作,但是在使用 MingW-w64 工具链的时候,发现有时连接静态库会报错提示找不到符号。
在 Google 和 StackOverflow 一段时间之后,发现需要注意以下几点:
  1. arnmranlib 换成 gcc-argcc-nmgcc-ranlib
    因为原生的 arnmranlib 无法处理含有 GIMPLE 中间码的目标文件。
  2. 使用 gcc -fuse-linker-plugin 参数。
    它开启连接器插件功能,GCC 可以在连接时做更多的优化。
  3. 如果各种方法都不行,使用 gcc -ffat-lto-objects
    这会让 GCC 生成一个“胖的(fat)”目标文件,它同时含有非 LTO 的机器码和 GIMPLE 中间码。工具链中如果有不支持 LTO 的程序如(ar),会使用非 LTO 的机器码副本。
总结一下,编译的时候加上以下的 CFLAGS
gcc -flto -fuse-linker-plugin
如果 Makefile 是别人写好的,可以使用我的 LTOWrapper 来注入 -flto 参数。

注:在 Linux 下使用 LLVM/Clang 的全程序优化遇到困难的时候可以试试 http://nochair.net/posts/2011/07-01-whole-program-llvm-bitcode.html
Linux 下,Clang 需要使用 Gold 连接器。配置好之后 -flto 就可以使用。

2014年10月24日星期五

用命令关闭 Gnome Shell 的 Looking Glass

Gnome 3 的 Gnome Shell 有一个很方便的调试器,叫 Looking Glass。
启动方式是 Alt-F2 输入 lg 回车,退出方式是按 Esc 键。
但是我笔记本电脑的 Esc 键坏了,所以找到了一个用命令关闭 Looking Glass 的方法。
输入 Main.createLookingGlass().toggle() 即可。

P.S. 用 global.get_window_actors().forEach(function (w) { w.set_scale(0.8, 0.8) }) 可以把所有窗口缩放到 80% 大小。

2014年8月22日星期五

宣布 JKSN,又一个 JSON 兼容二进制压缩格式

本来只是想可不可以用二进制来储存 JSON 并且做一些优化之类的,结果造出来 JKSN 这货。
比较了一下文件大小,发现没有经过压缩的 JKSN 数据比 gzip -9 JSON 还要小。于是把 JKSN 的目标定为让 JSON 序列更小。

JKSN 适用于任何网络带宽比处理时间更重要的场合,如移动即时通讯。

项目地址:https://github.com/m13253/JKSN。Specification 和参考实现均以 BSD 协议发布。

为什么不用 GZIP 呢?
JKSN 和 GZIP 不冲突。JKSN 编码后的数据可以被 GZIP 压缩得更小。
由于 GZIP 的 32 KiB 滑动窗口的设计,相似的数据只有互相间隔不超过 32 KiB 才能得到有效压缩。JKSN 会将数据重新组织,使相似的数据尽可能靠近排列,更有利于 GZIP 的压缩。

下面,用项目主页上举的例子,做个比较,:
格式文件大小
JSON150 字节
JSON gzip -9112 字节
JKSN109 字节
JKSN gzip -9107 字节
再来比较同类二进制 JSON 实现:
格式文件大小
BSON172 字节
Universal Binary Json150 字节
MessagePack120 字节
JSONH116 字节
BJSON(内置自适应哈夫曼压缩)115 字节
JKSN109 字节

如果各位读者对此项目感兴趣,且有空余时间,不妨让 JKSN 变得更好:
目前 JKSN 已经有 Python 3、Python 2、浏览器 JavaScript、Node.JS、C 五种环境的实现了。如果你愿意,请帮助我为 JKSN 补上 PHP 5、Java 的实现。
追求模范性和稳定性的实现可以直接 fork JKSN repository 并发给我 Pull Request;追求速度的实现可以另开新 repository 并通知我。
如果你知道怎么重新组织 JSON 结构让其更易于压缩,请联系我。我希望和你探讨问题。

2014年8月16日星期六

中文普通话参考音素表

Rocaloid 语音合成引擎正在 Sleepwalking 的领导下紧张地开发中,制作中文音源需要哪些音素呢?
Rocaloid 现在版本是以单音节(monophone)为合成单位,所以录音数量大大降低了,有条件录制某些特殊情况下的发音变形。
以此我整理了一份参考音素表,以我个人的普通话口音为基准,只做参考,如有遗漏或错误请留言通知我。
标有 (p) 的是弱读和快读时的发音变化,相对的是 (f) 标记。

辅音 Consonants


汉语拼音参考IPA 音标参考X-SAMPA 音标参考备注
bpp
pp_h
mmm
fff
dtt
tt_h
nnn
lll
gkk
kk_h
hxx
jts\
qtɕʰts\_h
xɕs\
zhʈʂts`
chʈʂʰts`_h
shʂs`
rʐz`
ztsts
ctsʰts_h
sss
szzz用来拼写外来语、少数民族语言和方言
vvv
y (p)jj快读时 i u 变为 j w
w (p)ww
0ʔ?声门塞音

单元音 Mono-vowels

汉语拼音参考IPA 音标参考X-SAMPA 音标参考备注
aaa
o (p)oo如“咯”
e (p)ɤ7如“了”
ehɛE汉语拼音方案记作“ê”,注音符号记作“ㄝ”,如“诶”
iii
ihɯ / ɨM / 1注音符号记作“ㄭ”,如“私”
uuu
üyy有时使用字母“v”代替
nnn这里把鼻音视作元音处理
ngŋN
mmm

双元音 Di-vowels

汉语拼音参考IPA 音标参考X-SAMPA 音标参考备注
aiaI
aoaU
ananan
angɑŋAN
erɑɹAr\如“二”
ouɤʊ7U有些人偏好读作 oʊ
enən@n
engɤŋ7N
eieI
iaiaia
ioioio如“哟”
ieiE
ininin
uauaua
o (f)uouo与 p pʰ m f 拼读,如“播”
uouO如“我”
ongʊŋUN
üeyE如“月”
e (f)ɯʌMV如“饿”

三元音 Tri-vowels

汉语拼音参考IPA 音标参考X-SAMPA 音标参考备注
iaoiaʊiaU
iangiɑŋiAN
iuiɤʊi7U有些人偏好读作 ioʊ
iong (f)iʊŋiUN如“穷”慢读
ianiɛniEn
ingiɯŋiMN南方口音更偏好读作 iŋ
uaiuaɪuaI
uanuanuan
uanguɑŋuAN
uiueɪueI
unuənu@n
uenguɤŋu7N
iong (p)yʊŋyUN如“永”快读
üanyɛnyEn如“远”,北方口音更偏好读作 yan
ünyinyin如“云”

儿化音 R-endings

汉语拼音参考IPA 音标参考X-SAMPA 音标参考备注
oror\
e-erɤɹ7r\不是 ɑɹ,ɑɹ 已在前面列出
ehrer\
ihrɯɹMr\
urur\
üryr\

唇化鼻音 M-endings (语速快的场合)

汉语拼音参考IPA 音标参考X-SAMPA 音标参考备注
amamam
amgɑmAm
omgomom
eməm@m
emgɤm7m
imimim
üm (p)ymym
iomgiʊmiUm
iamgiɑmiAm
iamiɛmiEm
uamuamuam
uamguɑmuAm
umuəmu@m
uemguɤmu7m
üm (f)yimyim
当快读时,i u 变为 j w,儿化音与前面一个元音连读,p pʰ m 之前的鼻音变为唇化鼻音,鼻音前的元音变为鼻音化元音。

可以使用我的 Pinyin2XSampa 程序将拼音转换成 X-SAMPA。

论交互设计师的英文素养

很多 Web App 都会提供第三方调用的 API,在 API 的提示信息中如果有语法错误就贻笑大方了。
你不信?我来举几个例子:
{"error": "Hit sexy spam"} ——来自百度
{"error": "Wrong verify code"} ——来自腾讯
{"error": "Apps is not exists"} ——来自哔哩哔哩
交互设计师的英文素养很重要啊。
下面给出我的参考翻译
百度那例:Hit porn filter
腾讯那例:Wrong Captcha
哔哩哔哩那例:App does not exist

2014年6月15日星期日

用 Biligrab-Danmaku2ASS 看B站

上回说到Linux 下 Chrome Pepper Flash 上B站卡的问题,这次就与 cnBeining 合作带来了桌面观看哔哩哔哩视频的解决方案了。
使用了 cnBeining 的 Biligrab 抓取脚本和我的 Danmaku2ASS 弹幕渲染。Perfect。
用法是一句话 ./biligrab.py http://www.bilibili.com/video/av314/
海外党再加 --overseas
这个项目以 MIT 协议发布。

2014年6月1日星期日

Linux 下 Chrome Pepper Flash 上B站卡的问题

用 Linux 下 Chrome Pepper Flash 播放器访问 bilibili 会有各种问题。
第一个是字体乱码,在 bilibili 播放器的配置面板中取消勾选“应用到界面字体”“粗体”并选择一个合适的字体。默认字体很可能会导致崩溃。
第二个是弹幕播放卡顿,可以使用“宽屏模式”或“全屏模式”解决问题。

bilibili 怎么还不用 HTML5 播放器啊!ABPlayerHTML5 项目已经用 HTML5 还原高级弹幕了。
总之谁有精力开发一个第三方播放器,“逼死官方”吧。

2014年5月2日星期五

用 Ubuntu LiveCD 做系统急救盘

硬盘里有 Ubuntu LiveCD 的镜像,可否让 GRUB 2 从镜像启动,以备不时之需呢?
和 GRUB Legacy 以及 GRUB4DOS 不同,GRUB 2 不需要镜像文件在硬盘上连续存放。(难免有磁盘碎片的对吧)
但是 GRUB 2 不可以从镜像文件 chainloader。
选了很多发行版,Ubunbu 的 LiveCD 是最合适的。
下面在 /etc/grub.d/40_custom 末尾加上以下内容。(40_custom 自带两行文字,开头两行不要改)
menuentry 'Ubuntu 14.04 LiveCD' {
  insmod part_gpt
  insmod ext2
  insmod iso9660
  set iso_path=/boot/ubuntu-14.04-desktop-amd64.iso
  echo 'Finding LiveCD...'
  search --set=root --file ${iso_path}
  echo 'Mounting LiveCD...'
  loopback loop ${iso_path}
  set root=loop
  set iso_path="${iso_path} locale=zh_CN"
  export iso_path
  configfile /boot/grub/loopback.cfg
}
再随便找一个磁盘卷宗,把 ubuntu-14.04-desktop-amd64.iso 扔到 /boot 里。
如果不是 ext2 ext3 ext4 的卷,把 insmod ext2 换成对应的模块名。
set iso_path="${iso_path} locale=zh_CN" 这里是一个小 hack,借着 (loop)/boot/grub/loopback.cfg 没有做好转义,把语言参数注入进去了。
完成之后,Debian 等执行 sudo update-grub,ArchLinux 等执行 sudo grub-mkconfig -o /boot/grub/grub.cfg

2014年4月26日星期六

VirtualBox 安装 OS X Mavericks 的注意事项

  1. 引导和开机
    OS X Mavericks 需要 Chameleon 2.2 版本,目前 2.2 版本仍未正式发布,可下载 svn 版。
    安装流程推荐使用 UniBeast、Hackboot_Mav.iso、MyHack 的其中一种。
    如果用懒人包,请用 Hackboot_Mav.iso。
  2. 开机卡住的问题
    -v 参数启动以便查看调试信息,如果看到 Missing bluetooth controller transport,尝试用 -f 参数启动。此方法对于 Hackboot 有效。
    彻底解决的方法是删除蓝牙驱动的 kext。
  3. 不识别声卡的问题
    先确认 VirtualBox 设置里,虚拟机声卡型号是“Intel HD 音频”。
    用 MultiBeast Mavericks 版安装 VoodooHDA 声卡驱动,重启。
    进入系统偏好设置,把声音输出设备设置为扬声器或耳机。(扬声器和耳机分别试一下。)
    如果声音卡顿,不要惊慌,很多人都遇到这个问题了。据说虚拟机开启单核心CPU,在屏幕上播放动画或不停地移动鼠标能缓解问题。
    或许你还可以试试用网络把音频传输到宿主机
  4. 简单配置分辨率
    宿主机上执行命令: vboxmanage setextradata 虚拟机名字 CustomVideoMode1 1440x900x32
    OS X 开机时指定参数 "Graphics Mode"="1440x900x32"
    如果想永久生效,修改 org.chameleon.Boot.plist,自行 Google。
  5. 打开“关于本机 (About this Mac)”时崩溃的问题
    宿主机上执行命令: vboxmanage setextradata 虚拟机名字 "VBoxInternal/Devices/pcbios/0/Config/DmiExposeMemoryTable" 1
    顺便推荐用 MultiBeast 的 Customize 菜单装一个 System Definition。
  6. 设置 App Store 仅下载更新,不要自动安装。
    有的更新会导致 Hackintosh 系统崩溃。更新前请善用 Google。确定安全再更新。
  7. 推荐教程
    mac os10.9Vmware虚拟机镜像 (我说楼主你能在意一下大小写吗?)
OS X Mavericks in VirtualBox

2014年4月14日星期一

我常用的Kdenlive编码方案

第一个是最常用的 H.264 VBR。
f=matroska hq=1 acodec=flac ar=44100 pix_fmt=yuv420p vcodec=libx264 vprofile=high 8x8dct=1 level=5.1 preset=veryslow flags=+loop vb=%bitrate+'k' aspect=%dar pass=%passes
由于Kdenlive 0.9.6没办法调用libfdk_aac编码器,音频我用了flac。之后再用FFmpeg转一下libfdk_aac
ffmpeg -i INPUT.mkv -c:v copy -c:a libfdk_aac -profile:a aac_he -b:a 128k OUTPUT.mkv

第二个是 H.264 CRF。
f=matroska hq=1 acodec=flac ar=44100 pix_fmt=yuv420p vcodec=libx264 vprofile=high 8x8dct=1 level=5.1 preset=veryslow flags=+loop vcrf=22 aspect=%dar
音频部分处理同上。

第三个是 ProRes。
f=matroska acodec=flac ar=44100 ac=2 vcodec=prores vprofile=3 pix_fmt=yuv422p10le qscale=11 vendor=ap10 aspect=%dar
Kdenlive 0.9.6不仅不能调用libfdk_aac,还不能调用prores_ks。(好像所有带下划线的编码器都不能调用?)所以只好用原版prores了,也就不能用yuv444p10le了。

2014年4月5日星期六

在Nginx为WordPress配置Rewrite

比较暴力。为防遗忘,作文以记之:
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /var/www/wordpress;
    index index.php;
    client_max_body_size 16m;
    error_page 400 /index.php?error=400;
    error_page 403 /index.php?error=403;
    error_page 404 /index.php?error=404;
    try_files $uri $uri/ =404;
    rewrite ^/index.php$ /index.php break;
    rewrite ^/index.php\?(.*)$ /index.php?$1 break;
    rewrite ^/wp-(.*)$ /wp-$1 break;
    rewrite ^/(.*)$ /index.php?q=/$1;
    location ~ \.php(/.*)?$ {
        fastcgi_split_path_info ^(.+?\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  # 听说有的版本的nginx不加这行会出现空白页面
        include fastcgi_params;
    }
}

这个配置在 Debian 6、7、8 上试验通过。Fedora 的 php-fpm 默认配置有些不同,把 fastcgi_split_path_info 稍微换一下就好了。
至于 CentOS 嘛,看看和我一样恨 CentOS 的有多少人:
这人和我一样是CentOS黑没错。

2014年2月26日星期三

Windows XP 已死,桌面用户的出路?

再过约两个月,2014年4月8日,Windows XP 就要寿终正寝了。这是大快人心的事。

为什么要赶紧升级?

一旦 Windows XP 停止安全支持,发现了漏洞就没有补丁来修复。仍然安装 Windows XP 的电脑届时可能容易中毒或容易被攻击。更严重的是,有的黑客团队已经发现了 Windows XP 中的一些漏洞,但是没有公布。一旦 Windows XP 停止支持,他们就会公布这些漏洞并利用这些漏洞来攻击还没有来得及升级的用户。

升级到什么?

三个选择,第一个是升级到更熟悉的 Windows 7,喜欢尝新的用户可能想直接升级到 Windows 8 或者 Windows 8.1,喜欢另一种清新空气的可以去尝试 OS X 和 Linux。
我 StarBrilliant 作为重度 Linux 用户,当然要宣传一下【连续开机一年不崩溃也不算奇迹、通过软件中心一键安装更新卸载几乎所有软件、关键操作需要授权、几乎不会中病毒、除了N卡驱动开箱即用的】Linux 操作系统咯。愿意入坑的推荐第一年尝试 Ubuntu(莫装中国特别定制版 Kylin)和国产 LinuxDeepin(开发者都很用心,虽然这货不是“完全自主产权”哦)。

XP 之死,对办公人员有什么好处?

随着 Windows XP 一起停止支持的还有 Microsoft Office 2003。所以各位办公人员再也不用担心自己的 docx 文件无法被接收方打开了。
而且,Windows XP 中的长城楷体_GB2312 和长城仿宋_GB2312 和新版 Windows 的中易楷体、中易仿宋不兼容。新版 Windows 制作的文档,即使格式没有问题,在 Windows XP 上也有可能出现字体错乱的现象。如果 Windows XP 死了,这个问题就会缓解了。(不得不吐嘈无论是长城还是中易,两家公司的字库质量真的难以让人满意)

XP 之死,对网上冲浪有什么好处?

随着 Windows XP 一起停止支持的还有 Microsoft Internet Explorer 6.0。对,就是桌面上那个深蓝色的e图标。IE 6.0 是 13 年前发布的浏览器,现在已经过时了,不支持各种最新的技术。但是 Windows XP 的高普及度,现在的网站不敢使用更新的技术,害怕不能用 IE 6.0 打开。如今 Windows XP 停止了支持,我预测在将来的很短时间内,很多网站要改头换面,采用最先进的技术和最前卫的设计呢。

XP 之死,对计算机安全有什么好处?

Windows XP 没有 UAC 权限管理,如果执行了恶意程序,很容易造成很大的破坏。Windows Vista 之后带来的 UAC,虽然不能完全防止中毒,但是也是有一定积极作用的。

可是 Windows XP 我已经用习惯了,能不能不更新到 Windows 7 / 8 呢?

当年 Windows 98 停止服务支持的时候大家也是这么说的。

还有呢……

这次 Windows XP 的停止更新对各位男孩子们是最好的机会啊。
还在读大学的、会装系统的,还不快帮妹子装系统!

这文章,如果大家喜欢,就转了吧,别忘了标识原作者是 StarBrilliant;如果不喜欢,请在下方留言告诉我改进的建议。

版权信息:本文以 Creative Commons 3.0 BY 发布。

2014年1月27日星期一

在 Minecraft 中输入中文的辅助工具

众所周知,Minecraft 中聊天时无法输入中文,于是我写了这个工具,下载地址:

使用方法:

Linux:

依赖项:zenity, xclip, xdotool
在您的桌面环境提供的控制面板中,添加一组快捷键,比如 Super+T,来启动 minecraft-chat-helper.sh 脚本。
当进行 Minecraft 游戏的时候,按 Super+T,输入聊天内容并点击确定。

Windows:

依赖项:Windows Internet Explorer
在任意文件夹创建一个指向 minecraft-chat-helper.vbs 的快捷方式。右击,打开属性对话框,添加一组快捷键,比如 Ctrl+Shift+Alt+T。
当进行 Minecraft 游戏的时候,按 Ctrl+Shift+Alt+T,输入聊天内容并点击确定。

局限性:

在 Windows 上,您不能打开两个标题都含有“Minecraft”字样的窗口。

版权:

程序源代码以 MIT 许可协议发布。原作者是 StarBrilliant。转载请署名。

2014年1月26日星期日

su/sudo 后启动 screen/tmux

在 Linux 系统中,如果用 su 或者 sudo 命令切换到另外一个用户,再试图启动 screen 或 tmux 会出现错误:
Cannot open your terminal '/dev/pts/1' - please check.
解决方法是,在 su 或者 sudo 之后执行以下命令再启动 screen 或 tmux:
script /dev/null

用中州韵输入法引擎的仓颉五代方案输入简体字词语

中州韵输入法引擎(中州韻輸入法引擎)是开源、高效、订制性强的中文输入法,支持 Linux、OS X、Windows 桌面操作系统,其 OS X 版本称为鼠须管,Windows 版本称为小狼毫。
自带仓颉五代(倉頡五代)、明月拼音(朙月拼音)等输入方案。其中,明月拼音有简体字模式,可以很方便地输入中国大陆通行的简体字。
而仓颉输入法,作为形码输入法,可以用同一种输入法来同时输入大陆简体汉字、香港繁体汉字、台湾正体汉字、日本汉字等多种不同地区通行的汉字。但是中州韵自带的仓颉五代只包含香港繁体的词语库,也就是说即使可以输入简体字,也无法输入简体词语。
于是我在 lyc20041 的帮助下订制了仓颉五代简体字词库,利用现有的繁体词库转换出简体词库。
请各位到我的 GitHub 的 rime-cangjie-zh_hans 仓库中找配置文件,释放到中州韵的配置文件夹下(Linux 是 ~/.config/ibus/rime 或者 ~/.config/fcitx/rime,取决于你使用的输入法框架)。
然后需要创建词库文件,准备好 OpenCC 和 essay.txt(运行时会提示你下载的)
在生效之前,还需要创建一个配置文件 default.patch.yaml,如下:
patch:
  schema_list:
    - schema: luna_pinyin_simp
    - schema: cangjie5_simp
这样就启用了“明月拼音·简化字”和“仓颉五代·简化字”两款输入法方案。点击“重新部署”按钮即可生效,Ctrl-` 或 F4 快捷键切换之。

顺便介绍一下仓颉输入法,这是朱邦复先生发明的自由版权的中文输入法。仓颉输入法发布的第二年 GNU 项目才成立。朱邦复先生的类似“自由软件”的思想可谓是超越时代潮流。博主学习仓颉输入法,一是为了方便输入生僻字(任何汉字都可以用最多五个仓颉字母打出),二是为了瞻仰朱邦复先生的发明。如果你也有兴趣学习它,可以尝试熟记巧背仓颉输入法易颉官方网站的仓颉三代教学

2014年1月4日星期六

Linux下流畅地录屏

用过很多Linux下的录屏工具,基本分成三类,FFmpeg 后端、GStreamer 后端、自己实现后端。有很多录屏软件让我不满意。有的在高分辨率下有很严重的跳帧问题,最终导致音画不同步。有的不支持录制系统的声音。还有的没有精细的配置功能。而且,我希望能够输出无损压缩的媒体格式,便于后期处理。
分享我的屏幕录制命令如下:
sleep 5; ffmpeg -y -f x11grab -s 1920x1080 -framerate 30 -i :0 -vf 'setpts=(RTCTIME-RTCSTART)/(TB*1000000)' -c:v libx264 -profile:v high444 -preset:v veryfast -qp:v 0 -pix_fmt yuv444p screencast.mkv
要注意以下几点:
-s 1920x1080 换成自己的屏幕分辨率,
-framerate 30 换成录屏的帧率,
-i :0 换成当前的 $DISPLAY 环境变量值,
-i alsa_output.xxxxxxxxxxxxx.0.analog-stereo.monitor 的参数,请看下面。
这样录制下来的视频文件是 H.264 YUV444P 无损的,便于后期剪辑。如果要分享到互联网,请在二次压制的时候加上 -pix_fmt 420p,因为很多网络媒体播放器不支持 YUV444P。sleep 5 是给自己准备最小化终端窗口的时间。

录制系统声音

再加一个 PulseAudio 的输入:
sleep 5; ffmpeg -y -f x11grab -s 1920x1080 -framerate 30 -i :0 -f pulse -i alsa_output.xxxxxxxxxxxxx.0.analog-stereo.monitor -vf 'setpts=(RTCTIME-RTCSTART)/(TB*1000000)' -af asetpts=N/SR/TB,apad -shortest -c:v libx264 -profile:v high444 -preset:v veryfast -qp:v 0 -pix_fmt yuv444p -c:a flac screencast.mkv
-i alsa_output.xxxxxxxxxxxxx.0.analog-stereo.monitor 的获取方法如下:
执行 pactl list | grep -A2 'Source #',会看到如下两行(如果你只有一块声卡的话):
Source #0
        State: IDLE
        Name: alsa_output.xxxxxxxxxxxxx.0.analog-stereo.monitor
--
Source #1
        State: SUSPENDED
        Name: alsa_output.xxxxxxxxxxxxx.0.analog-stereo
Name 后面有 .monitor 的表示系统声音,另一个表示麦克风。

音画同步问题

如果出现音画不同步,请尝试 -af 指定以下几种参数的组合:
-af aresample=async=1
-af asetpts=N/SR/TB,apad -shortest
-af 'asetpts=(RTCTIME-RTCSTART)/(TB*1000000)'

跳帧问题

如果遇到跳帧,可以适当降低帧率,设置 -threads auto;或者将 -preset:v veryfast 换成 -preset:v ultrafast;或者试试看 FFv1、FFvHuff、HuffYUV 等无损编码器和 MPEG1Video、MPEG2Video、MJPEG 等复杂度低的编码器,或者把音频编码器换成 pcm_s16le;或者换用 MPEG-TS、FLV 等容器格式。
还可以试试看 Apple ProRes 编码器。它有着很快的速度和接近无损的效果。FFmpeg 自带三个 ProRes 编码器(proresprores_awprores_ks)和两个解码器(proresprores_lgpl)。这些编解码器性能不同,功能各异,请自己尝试参数配置。
如果录屏让你的 SCSI 硬盘不堪重负,请检查 SCSI 控制器是否在 AHCI 模式而不是 IDE 模式。(如果你已经安装了 Linux 或 *BSD 以外的系统,请不要修改 SCSI 模式;我的 7200rpm 笔记本电脑硬盘在 IDE 模式下只有 25MiB/s 的写入速度,而切换到 AHCI 模式下有 90MiB/s 写入速度。)
如果有以上方法都不能解决的音画同步问题,建议使用两个独立的 FFmpeg 进程来分别录制图像和声音。但是会带来后期处理的麻烦。

后期压制

将输出的 screencast.mkv 压制成 MP4 输出并分享到网络,可以用类似这样的命令:
ffmpeg -i screencast.mkv -movflags +faststart -c:v libx264 -profile:v high -level:v 4.1 -preset:v veryslow -b:v 4096k -pix_fmt yuv420p -c:a libfdk_aac -profile:a aac_he -b:a 256k my_screencast.mp4
其中 -c:a libfdk_aac 根据自己的 AAC 编码器来修改(但是只有 libfdk_aac 支持 -profile:a aac_he,而且质量最好),如果不知道自己装了哪些编码器,就依次尝试:
-c:a libfdk_aac
-c:a libfaac
-c:a aac -strict -2
如果 QuickTime/MP4 文件要通过网络分享,建议使用 -movflags +faststart 参数。它把关键数据移动到文件开头,有利于缓冲。