HTML5支持更多音视频格式

HTML5引进了新的的<audio>和<video>标签,可以直接播放音频和视频。但是不同浏览器对音频视频的支持格式有所不同。比如Chromium浏览器不支持MP3、MP4格式,而Chrome却支持。根本原因是浏览器内核所依赖的FFmpeg编译开关不一样导致的的。 在Chromium代码工程的生成gn工程的时候加上以上两个值: 就可以让Chromium编译出来的浏览器像Chrome一样支持MP3、MP4格式格式了。 proprietary_codecs的作用是开启代码中的USE_PROPRIETARY_CODECS宏,使Chromium的代码支持更多的音视频解码格式。ffmpeg_branding则是作用于Chromium所依赖的第三方ffmpeg工程的代码,使之编译相关的支持代码。 Chromium的音视频解码是调用的第三方库ffmpeg。ffmpeg几乎支持所有的音视频格式,那么Chromium理论上也是可以支持所有的音视频格式的能力。实际上由于ffmpeg这个库很大,为了优化浏览器的体积,Chromium只编译链接了它所需要支持格式的相关代码,只占整个ffmpeg很小的一部分。 我以3GP格式为例,介绍如何让Chromium内核的video标签支持更多视频格式。 我们先编写一个测试3gp格式视频的html文件: 然后在MimeUtil::AddSupportedMediaFormats里面添加如下2行: 这是让浏览器能够识别Video标签中的video/3gpp。 3gp只是视频的容器格式,实际上的音频和视频的编解码器是有多种可能的。通过工具查看这个test.3gp的音频格式,如下: 这个的视频格式是mpeg4,是Chromium内核默认所不支持的。而音频格式是aac,Chromium内核默认支持。所以为了支持这个浏览器播放这个3gp文件,只需要添加mepg4的解码器相关的代码即可。所以我们修改一下Chromium代码编译ffmpeg的开关。 因为之前我们已经把ffmpeg_branding设置成”Chrome”,因此我们的的配置文件是third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h。 在这个config.h里面搜索关键词MPEG4,找到了#define... Read More | Share it now!

精简Chromium代码仓库进行维护与升级

Chromium的代码仓库很大,我最近更新了一下,现在git仓库里面pack文件已经有8.8GB了。然而网络又不稳定,要完整获取如此大的代码还是比较困难。 我最推荐的方式是用阿里云香港或者新加坡的服务器搭建VPN,连接VPN来获取代码。阿里云香港或者新加坡的的VPN速度很快很稳定,我自己这边下载代码的速度有2MB/s,非常快。 其次是搭建Chromium代码仓库的mirror。这种方法对服务器的配置要求很高,4GB的内存只能支持不超过2个人同时获取代码。维护也比较麻烦,要成功编译Chromium,除了Chromium仓库,还有各种第三方仓库还有其他文件都需要做mirror。 如果不是很需要Chromium代码的历史提交记录,我们可以从Chromium代码的一个tag里面拉出代码,再提交到我们的自己的git仓库里面。这样的git仓库有700MB左右大小,只有Chromium的十分之一。 比如我们从Chromium的60.0.3112.113... Read More | Share it now!

Chromium代码注释中的ascii图

我们在Chromium的代码注释里经常能够看到使用纯ascii字符做的示意图,如下所示: chrome\browser\ui\views\frame\browser_view.h components\update_client\background_downloader_win.cc components\update_client\crx_update_item.h media\cast\sender\performance_metrics_overlay.h v8\src\compiler\osr.h 这些图都是用ascii字符组成的,因此很容易结合在源代码里面,形象的描述了代码的逻辑。 如果自己手动敲出这些ascii图,当然很麻烦了,幸好有这方面的工具帮助我们画出ascii图来。 最方便的是这个http://asciiflow.com/... Read More | Share it now!

Chromium中的utility进程

有时候Chromium浏览器主进程需要做一些“危险”的事情,比如图片解码、文件解压缩。如果这些“危险”的操作发生了失败,会导致整个主进程发生异常崩溃,这是我们不愿意看到的。因此Chromium设计出了一个utility进程的机制。主进程临时需要做一些不方便的任务的情况下,可以启动一个utility进程来代替主进程执行,主进程与utility进程之间通过IPC消息来通信。我写一个收集电脑硬件信息的例子来介绍如何使用utility进程。 首先我们需要继承UtilityProcessHostClient创建一个自己的类HardwareProber。我们在HardwareProber里面处理与utility进程的IPC通信。在HardwareProbe里面我们会通过UtilityProcessHost::Create创建一个UtilityProcessHost,通过UtilityProcessHost的Send方法,我们可以向utility进程发送IPC消息。我们不用管理UtilityProcessHost的生命周期,所以持有UtilityProcessHost的WeakPtr即可。 UtilityProcessHost提供了一些接口: SetExposedDir。在沙箱里暴露一个utility进程可以操作的目录。 DisableSandbox。禁用utility进程的沙箱。 ElevatePrivileges。提权utility进程。 SetEnv。设置utility进程的环境变量。 通常需要执行某个任务,然后启动一个utility进程。当任务完成,utility进程就退出。有时候我们需要做很多同样的事情,如果频繁的启动和退出utility进程,效率比较低。因此UtilityProcessHost还有个Batch模式,就是在一个utility进程里处理多个相同的任务。一般utility进程退出都是utility进程自己主动调用content::UtilityThread::Get()->ReleaseProcessIfNeeded()。如果在Batch模式下,那边则由主进程来控制utility进程的退出,需要调用StartBatchMode和EndBatchMode。 UtilityProcessHostClient还具有RefCountedThreadSafe属性。它的生命周期是当utility进程退出后,IPC断开了BrowserChildProcessHostImpl来销毁。所以我们也不用管理UtilityProcessHostClient对象生命周期。 主进程里面HardwareProber的IPC消息首先会发到utility进程的ChromeContentUtilityClient里面来。我们可以在ChromeContentUtilityClient里面处理消息,也可以继承UtilityMessageHandler创建一个HardwareProberHandler类来处理IPC消息。 HardwareProberHandler... Read More | Share it now!

Chromium installer介绍

mini_installer是Chromium的安装和升级系统的一部分。它的有两个主要作用: 从自身资源中抽取出chrome.packed.7z和setup.exe程序 调用setup.exe进行实际的安装操作 mini_installer很小 mini_installer之所以叫mini,是因为它真的很小。除去资源的大小,它本身大约只有5kb,而我们创建一个空的控制台的程序也有100多kb。 mini_installer做的这么小的原因是:Chromium的差量升级包实际上也是一个mini_installer。为了使差量包尽可能的小,所以mini_installer本身也要非常小。 mini_installer只是一个壳,本身并没有很复杂的逻辑,它是调用setup.exe做真正的安装和升级逻辑。另外它还没有链接CRT库。没有链接CRT库带来了一个副作用就是不能调用CRT库里面的函数,只能调用Windows... Read More | Share it now!

Chromium不再支持GDI渲染字体

因为Chromium不再支持XP/VISTA系统,顺便的Chromium从52开始强制使用DirectWrite渲染字体,也不再支持GDI渲染字体。 不过据我来看,目前Chromium使用DirectWrite渲染字体并不稳定,经常会导致崩溃,比如IDWriteFactory2接口不支持低于win8.1的系统,而Chromium代码对这个没有区分操作系统,因此会导致win7上DWrite初始化失败的问题。Chromium最新版60还没有解决DirectWrite崩溃的问题,代码里面仍然还有FontCache::CrashWithFontInfo用来收集字体崩溃的信息。 不过有很多人想让Chromium加回对GDI渲染字体的支持,在Chromium-dev里面发帖要求,见 https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/WzivQg8_drw ... Read More | Share it now!