转自 http://blog.sina.com.cn/foreverlovelost
测试各个服务器上的视频文件的时候,经常发现有些视频莫名其妙的播放不流畅,甚至是非常卡顿以至于播放不了,但是在本地播放这些文件非常流畅,将这些文件下载下来播放,并且将MPEG4Extractor中解析的log打上,发现一个规律,这些视频文件的树状结构的box中,moov这个字段都在文件的最末尾,也就是在真正视频数据的后面。
由于视频播放前首先需要使用extractor解析这个文件,其实解析就是解析moov这个属性的box,解析完moov这个box之后就不继续读取文件了,通过moovbox里面各个子box记录的各种表建立各个音视频数据在文件中的offset和size。
由于网络下载数据比较慢,而且Android里面读取网络数据的buffer缓冲和清空机制,如果经常需要在文件前后跳转读取时就比较低效率了,比如你现在读取文件末尾offset1除size1大小的数据,这个时候播放器会多读取一些存放在buffer中,如果这个时候又要跳到文件开始的某个offset2处读取size2大小的数据,播放器需要将先前存放在buffer中的数据清空,然后将offset2发给服务器,让服务器给播放器发offset2这个位置的数据,如果经常性这样跳转的话,就比较耗时和低效率了。
打开NuCacheSource中的log可以看出这个现象。
上面是自己分析多个这种问题后总结出来的,今天突然间在Androidsdk上找到了证据,终于找到了谷歌对于这种情况的说明,也即有一些类型的视频文件是不适宜做为流媒体播放的,以后在遇到这种问题,就可以理直气壮的写明原因了。
The video is streamed and its container is notvalid for progressive
playback i.e the video's index (e.g moov atom)is not at the start of the
file.
seeandroid.media.MediaPlayer.OnErrorListener
public static final intMEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;
if (framework_err ==MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK){
messageId =com.android.internal.R.string.VideoView_error_text_invalid_progressive_playback;
}