MediaPlayer播放远程网络视频
1、概念
mediaplayer类是控制音频、视频或流文件播放的控件。由于mediaplayer主要是用来播放音频的,所以在播放视频
时,没有提供图像输出界面,但是mediaplayer提供一个了setDisplay(SurfaceHolder)接口,这样就可以利用
mediaplayer在Android上自由控制视频播放。这里需要注意在设置setDisplay时,由于surfaceView创建的优先级比较
低,在mediaplayer开始之后,surfaceView还没创建出来,这样会出现有声音没有图像。
2、实现步骤
1)首先新建一个surfaceView对象,根据surfaceView对象得到SurfaceHolder对象,提供给Mediaplayer在调用setDisplay时使用;
2)surfaceHolder添加回调addCallback(MediaPlayer.Callback)
3)在回调方法surfaceCreated(SurfaceHolder holder)中创建Mediaplayer对象
4)新建好Mediaplayer对象后,设置监听、设置播放资源和准备播放:
a、setOnPreparedListener(OnPreparedListener) 设置Mediaplayer的准备好监听,在回调方法中启动播放器
b、setOnCompletionListener(OnCompletionListener) 设置Mediaplayer的视频播放完成监听,在回调方法中停止 和释放Mediaplayer
c、setDataSource() 这里Android提供了5种设置方法,setDataSource(FileDescriptor)这里的FileDescriptor表示文 件描述符(可以通过FileInputStream的getFDF()方法获取)、setDataSource(FileDescriptor, long, long)、 setDataSource(Context,Uri)、setDataSource(Context, Uri, Map<String, String>)、setDataSource(String, Map<String, String> )、setDataSource(String)方法
d、prepared()或preparedAsync() 这两个方法都是准备播放视频,前一个会报IOException异常
5)在回调方法onPrepared(MediaPlayer mp)中启动播放器Mediaplayer.start()
3、边播边下
mediaplayer在播放远程网络MP4视频时,远程服务器会以两种方式传输视频,一种流形式的视频,另一种非流形式
的视频,对流形式的视频而言,Android原生的Mediaplayer可以实现在线播放功能,但是对于非流形式的视频,就不
能播放,这样就得把视频下载到本地,再进行播放,但是这里有个缺陷,不能实现边播边下,为了实现这个功能,就
在下载视频文件时做处理。这里仿照网上的一个边播边下音乐播放器,把它搬过来,发现MP4视频文件比较特殊,它
的moov数据一般会放在整个文件最后,而我们在下载时都是从文件最开始顺序读取的,所以不能按照音频那样播放
MP4视频了,得想办法把MP4的moov数据先读取到文件。通过查找MP4文件格式资料,然后进行解析,当读取到的
boxType是mdat,标记当前流的位置,再跳过它的数据长度,在MP4文件中填mdat数据长度的空数据,等到是moov
数据读取完成后,返回标记位置,继续读取MP4的mdat数据,替换空白处
MP4文件格式解析资料:http://blog.sina.com.cn/s/blog_48f93b530100jz4x.html