Android视频播放器mediaplayer

来源:互联网 发布:三星智能电视直播软件 编辑:程序博客网 时间:2024/05/01 22:44

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


0 0
原创粉丝点击