今天使用公司开发手机,调研一下当下很火的抖音客户端,其使用的视频编码类型。

在调研前,有个初步判断:

1.从抖音服务器推送到客户端的视频流要么是avc码流,要么是hevc码流(具体要视平台解码硬件支持情况,本地上传支持情况,云端再推来相应的码流)。

2.本地客户端,解码器选择有三个,手机平台提供硬件解码器、Android提供的解码器、抖音平台提供的解码器。

   2.1.其使用优先级为硬件解码器排首位,后面的选择则不太确定,视哪个解码效率更高使用哪个。

   2.2.有些手机不带相应的硬件解码器(例如,如果推来的是hevc的流,不是近几年出的手机的话,一般不带hevc硬件解码器),则必须使用软件解码方式。

          具体使用的是安卓提供的,还是使用抖音提供的,要看哪个解码速度更快。

3.有些视频做了保护而不能下载到本地,有办法获取视频吗?

   3.1.如果使用硬件解码器,则通过修改平台解码驱动源码,以替换平台解码库方式,可以拿到视频码流。

   3.2.如果走Android提供的DRM方式,对这种没用过,很可能无法拿到。

   3.3.如果走抖音提供的解码器,无法直接拿到码流,一种比较低效的方式是,解码后送平台显示模块,在显示模块拿yuv图(其实3.2也可以这么干)。

   3.4.另外一种方式是:拦截网卡收到的全部数据,根据hevc数据语法特征,对数据再进行再组装,但是这种非常费时费力。

4.平台带硬件解码器前提下,在java上层,解码是走MediaCodec方式还是走MediaPlayer方式?

   4.1.走MediaPlayer方式跟普通播放器没多大区别(一点区别是抖音不提供快进快退的seek功能)。

         因为MediaPlayer一般是播放本地视频使用,内部已经做了demux-decode-render很多细节功能,但是由于网络传来的流,这个需要抖音根据协议自己做音视频分离,因此可能不是走这种通路。但是也不好说,毕竟安卓也支持rtsp流播放。

   4.2.走MediaCodec的话,需要两个MediaCodec实例来分别解码音频和视频,然后java层获取到解码后的数据后分别送audio/video输出通路。

 

-----------------------------------------------------------------------------可爱的分割线-----------------------------------------------------------------------------------------

 

手机硬件情况:带avc和hevc硬件解码器。

测试结果:

1.播放了30多个短视频,一直出现平台的hevc解码log信息,因此目前节点上抖音视频都用上了h265(后来其他调查,发现不一定是265视频流,自己的苹果手机上传的视频,再下载下来,变成了264编码码流)。

2.只有一个手机,因自带硬件解码器,因此无法验证软解方式下,是使用安卓提供的还是抖音提供的。

3.有办法获得码流。因为看到无法“保存到本地”的视频,仍在使用平台硬件解码器解码。

4.从log中判断,使用了MediaCodec,未用MediaPlayer。

 

其他信息:

1.客户端的log路径在哪?用于出错时问题回溯。

logcat方式没找到(douyin、bytedance相关关键词),lib库中看到包含libalog.so,应该是log生成相关,由于去掉了符号表,只能用winhex看二进制数据,也没看到有用信息。

难道release版都把log关掉了?用户客户端出bug了,如何定位问题?

另外一种方式查找,如果本地写log文件,那么应该使用了一些fd,于是看到了:

 但是,不幸的是,下载这些log文件,看不到可识别的字符串信息,应该是log做过加密处理,不希望别人看到。

 

2.是否使用一些开源的东西?例如ffmpeg

使用了!通过其提供的库可以看到:

 使用了x264视频编码库、ffmpeg多媒体框架、fdk-aac音频编码库、libyuv图形转换库、tensorflow机器学习库等。

 

3.客户端包名:com.ss.android.ugc.aweme

21:35:14.776  4551  4551 D BluetoothMapAppObserver: The installed package is: com.ss.android.ugc.aweme

 

4.安装路径

08-29 21:34:59.502  4269  4313 D PackageManager: New package installed in /data/app/com.ss.android.ugc.aweme-mCkAz35nMlxyL_FLCfX72Q==

 

5.使用线程一览(太长就不贴全了):