天天看点

2013.03.19——— android 音视频编解码个人见解

http://www.chengxuyuans.com/Android/53765.html

1、android提供的音视频编码只有 AMR-NB(nb是窄频)和H.263

2、android虽然支持gif的解码,只能用mediaplay来播放,但是效果不好

3、android不支持flv的解码

4、AudioTrack只能播放pcm编码的数据,MediaPlayer可以播放MP3,AAC,WAV,OGG,MIDI等

   事实上,两种本质上是没啥区别的,MediaPlayer在播放音频时,在framework层还是会创建AudioTrack,

   把解码后的PCM数据传递给AudioTrack,最后由AudioFlinger进行混音,传递音频给硬件播放出来。

   利用AudioTrack播放只是跳过 Mediaplayer的解码部分而已。Mediaplayer的解码核心部分是基于OpenCORE 来实现的,

   支持通用的音视频和图像格式,codec使用的是OpenMAX接口来进行扩展。因此使用audiotrack播放mp3文件的话,要自己加入 一个音频解码器,如libmad。

   否则只能播放PCM数据,如大多数WAV格式的音频文件。

5、输出文件格式就相当于一个容器,具体采用什么编码需要指定编码格式。编码一样可能输出格式不一样,输出格式一样其编码方式可能不一样。

6、硬编码:通过调用Android系统自带的Camera录制视频,实际上是调用了底层的高清编码硬件模块,也即显卡,不使用CPU,速度快

   软编码:使用CPU进行编码,如常见C/C++代码,一般编译生成的二进制都是的,速度相对较慢。例如使用Android NDK编译H264生成so库,编写jni接口,再使用java调用so库。

7、视频数据有两种yuv和rgb,yuv是rgb大小的一般,所以一般用于数据传输,个人认为 视频文件格式经过解码后 都是以rgb来播放的,所谓的视频播放 就是一帧一帧图像

   例如,一个avi文件,经过文件格式解析,得到h264编码流,然后经过h264解码,得到yuv数据,然后转换为rgb,进行播放

8、以一个MP3播放器为例,从功能的角度就是将一个mp3格式的文件作为播放器的输入,将声音从播放设备输出。从实现的角度,MP3播放器经过了一下的阶段:MP3格式的文件解析、MP3编码流的解码、PCM输出的播放。