zoukankan      html  css  js  c++  java
  • 视频编解码类型调查——抖音客户端

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

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

    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.使用线程一览(太长就不贴全了):

  • 相关阅读:
    .Net内存回收
    select rank() over
    Android中如何区分界面组件创建和销毁的类型
    Thread和Runnable的区别
    Intent对象若干数据项的含义总结
    libcurl用法
    Hadoop 使用Combiner提高Map/Reduce程序效率
    Struts2中的get、set方法作用:
    struts2 使用jsonplugin
    struts.custom.i18n.resources国际化详解(一)
  • 原文地址:https://www.cnblogs.com/Dreaming-in-Gottingen/p/13583826.html
Copyright © 2011-2022 走看看