视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。
基础知识详见:
https://blog.csdn.net/leixiaohua1020/article/details/18893769
视频播放的几种方式:
MediaPlayer+SurfaceView或者textureview
surfaceView和textureView区别:
应用程序的视频或者opengl内容往往是显示在一个特别的UI控件中:SurfaceView。SurfaceView的工作方式是创建一个置于应用窗口之后的新窗口。这种 方式的效率非常高,因为SurfaceView窗口刷新的时候不需要重绘应用程序的窗口(android普通窗口的视图绘制机制是一层一层的,任何一个子元素或者 是局部的刷新都会导致整个视图结构全部重绘一次,因此效率非常低下,不过满足普通应用界面的需求还是绰绰有余),但是SurfaceView也有一些非常 不便的限制。
因为SurfaceView的内容不在应用窗口上,所以不能使用变换(平移、缩放、旋转等)。也难以放在ListView或者ScrollView中,不能使用UI控件的一些特性比如View.setAlpha()。
为了解决这个问题 Android 4.0中引入了TextureView。
TextureView与SurfaceView相比,TextureView并没有创建一个单独的Surface用来绘制,这使得它可以像一般的View一样执行一些变换操作,设置透明度等。另外,Textureview必须在硬件加速开启的窗口中。
https://github.com/linsea/UniversalVideoView
videView
原生封装的MediaPlayer+SurfaceView,不支持自定义控制ui,同上面的方式一样,只支持3gp,mp4.
ijkplayer
很多大厂用的这个,支持拓展so库支持各种视频格式,各种编码。
https://github.com/jiajunhui/PlayerBase
https://github.com/Bilibili/ijkplayer
ExoPlayer
是构建在Android低水平媒体API之上的一个应用层媒体播放器。和Android内置的媒体播放器相比,ExoPlayer有许多优点。ExoPlayer支持内置的媒体播放器支持的所有格式外加自适应格式DASH和SmoothStreaming。ExoPlayer可以被高度定制和扩展以适应不同的使用场景。
ExoPlayer库的核心是ExoPlayer接口。ExoPlayer公开了传统的高水平媒体播放器的功能,例如媒体缓冲,播放,暂停和快进功能。ExoPlayer实现旨在对正在播放的媒体类型,存储方式和位置以及渲染方式做出一些假设(因此几乎没有限制)。ExoPlayer没有直接实现媒体文件的加载和渲染,而是把这些工作委托给了在创建播放器或者播放器准备好播放的时候注入的组件