视频解码硬解和软解的区别
硬解
- 字面上理解就是用硬件解码。通过显卡的视频加速功能对高清视频进行解码。可以理解为有一个专门的电路板来进行视频的解码工作,是依靠GPU。
- 调用GPU的专门模块编码来解码,减少CPU运算。显卡核心GPU拥有独特的计算方法,解码效率非常高,这样不但能够减轻CPU的负担,还有着低功耗,发热少等特点。
- 但是,由于硬解码起步比较晚,软件和驱动对他的支持度很低,基本上硬解码内置什么样的模块,就解码什么样的视频,面对网上各色各样的视频编码样式,兼容性不好。此外,硬解码的滤镜、字幕、画质方面都做的不够理想。
- 对于android设备,目前用得比较多的芯片就是高通、海思和联发科,这些芯片大都集成了很多的功能,CPU、GPU、DSP、ISP包括视频解码、音频解码等等
- 在Android中使用硬件解码直接使用MediaCodec就可以了,虽然MediaPlayer也是硬件解码,但是被封装得太死了,支持的协议很少。而MediaCodec就很好拓展,我们可以根据流媒体的协议和设备硬件本身来自定义硬件解码,代表播放器就是Google的ExoPlayer。
软解
- 字面上理解就是用软件解码。但是实际上还是要硬件支撑。这个硬件就是CPU。
- 在软解码过程中,需要对大量的视频信息进行运算,所以对CPU性能的要求非常高。尤其是对高清大码率的视频来说,巨大的运算量就会造成转换效率低,发热量高等问题。
- 我们最最常见的视频软解码开源库就是FFmpeg。目前基于FFmpeg的开源播放器有B站的ijkplayer
- 不过,软解码不需要过多的硬件支持,兼容性非常高,即使出现新的视频编码格式,只要安装好相应的解码器文件,就可以顺利播放。而且软解码拥有丰富的滤镜,字幕,画面处理优化等效果,只有你CPU够强悍,就能够实现更加出色的画面效果。
总结
- 在Android设备硬件支持的情况下优先使用Android设备的硬件解码,减少CPU的占用,更加省电。
- 在Android设备硬解不支持的情况下选择使用软解码,不管怎么样,视频至少能够播放,具有更好的适应性,但是增加了CPU的占用,更加费电。
软硬结合才是王道,根据实际情况合理选择
shape 可以动态设置
TextView textView = new TextView(this);
GradientDrawable drawable = new GradientDrawable();
drawable.setCornerRadius(5);
drawable.setStroke(1, Color.parseColor("#cccccc"));
drawable.setColor(Color.parseColor("#eeeeee"));
textView.setBackgroundDrawable(drawable);
TextView textView = new TextView(this);
GradientDrawable drawable = new GradientDrawable();
drawable.setCornerRadius(5);
drawable.setStroke(1, Color.parseColor("#cccccc"));
drawable.setColor(Color.parseColor("#eeeeee"));
textView.setBackgroundDrawable(drawable);
xfermode
设置画笔在图片堆叠时候的显示模式,共有16种:
具体的PorterDuff.Mode请看:
Mode值 | 说明 |
PorterDuff.Mode.CLEAR | 所绘制不会提交到画布上 |
PorterDuff.Mode.SRC | 显示上层绘制图片 |
PorterDuff.Mode.DST | 显示下层绘制图片 |
PorterDuff.Mode.SRC_OVE | 正常绘制显示,上下层绘制叠盖 |
PorterDuff.Mode.DST_OVER | 上下层都显示。下层居上显示 |
PorterDuff.Mode.SRC_IN | 取两层绘制交集。显示上层 |
PorterDuff.Mode.DST_IN | 取两层绘制交集。显示下层 |
PorterDuff.Mode.SRC_OUT | 取上层绘制非交集部分 |
PorterDuff.Mode.DST_OUT | 取下层绘制非交集部分 |
PorterDuff.Mode.SRC_ATOP | 取下层非交集部分与上层交集部分 |
PorterDuff.Mode.DST_ATOP | 取上层非交集部分与下层交集部分 |
PorterDuff.Mode.XOR | 现实非交集部分 |
PorterDuff.Mode.DARKEN | 交集部分颜色加深 |
PorterDuff.Mode.LIGHTEN | 交集部分颜色变亮 |
PorterDuff.Mode.MULTIPLY | 显示交集部分,颜色混合叠加 |
PorterDuff.Mode.SCREEN | 取两图层全部区域,交集部分变为透明色 |
TextView 分散对齐字体
- 自定义TextView的时候,可以用getTextSize(),getTypeface()等,获得在xml中设置的android:textStyle=“bold”,android:textSize="15sp"等属性
其他
- RecyclerView 子项item中含有EdiTtext复用问题
- setInputType(EditorInfo.TYPE_NUMBER_FLAG_DECIMAL)不生效的问题解决方法
- 富文本设置范围的时候,如果从头到尾的范围,需要在最后加一个字符,正常选空格
- RecyclerView在不需要动画的时候,可以通过下面的方法关掉动画
((SimpleItemAnimator) rv_content.getItemAnimator()).setSupportsChangeAnimations(false);
((SimpleItemAnimator) rv_content.getItemAnimator()).setSupportsChangeAnimations(false);
- RecyclerView 性能优化
将DatePicker和TimerPicker显示在同一个布局中的问题
- 单个组件太大,属性里大小不可调整设置,如果垂直排列到AlertDialog弹窗里,则单页无法显示全部内容
- 解决办法:
- 在DatePicker属性中增加android:datePickerMode=”spinner”和android:calendarViewShown=“false”(不显示日历)即可
- 在TimePicker属性中增加android:timePickerMode=”spinner”。