简单实现视频音频的边下边播

直接切入主题,要实现的功能是:
1、ios视频音频边缓存边播放,缓存时可以在已下载的部分拖拽进度条。
2、缓存到一半退出,再次播放同一地址的视频时,视频继续下载,并且缓存进度已经走到上一次下载的位置。
3、无论是下载到一半退出还是下载完退出,已缓存的数据都存到自己指定的一个路径。如果已下载完,下次播放时可以不再走网络,直接播放本地文件。
4、一个有总时间,缓冲进度,播放进度的sliderbar。
(具体效果看唱吧4.1版本以后的视频效果吧)
 
用到的几个类:
1、ASIHttpRequest
2、MPMoviePlayerController
3、HTTPServer(https://github.com/robbiehanson/CocoaHTTPServer)
 
灵感来源是这篇文章, http://hi.baidu.com/suifeng_89/item/603cb0b95bb796ff62388e88
实现步骤:
1、先开一个request去下载要播放的视频文件
2、在本地开一个http server,拼一个本地地址(http://127.0.0.1:xxxx/xxx.mp4),丢给MPMoviePlayerController播放。
3、本地的server当收到请求时去那个正在下载的文件中读数据即可。
 
断点下载全由ASIHttpRequest实现了,缓冲的效果用的是MPMoviePlayerController的,它自带了总时间,已缓冲的总时间,当前时间,整个播放的过程就用MPMoviePlayerController。sliderbar是自己写的,因为iOS自带的不支持缓冲进度,例子:(https://github.com/Zedenem/UICircularSlider),把圆的改成长长的不难吧。。
 
自己曾尝试过在iOS上用socket server实现本地服务器,各种失败。后来查到MPMoviePlayerController的请求机制是基于http断点下载那一套逻辑的,不像android的socket。HTTPServer已经支持各种断点下载上传。
只是有一点需要自己实现:当httpserver接受到MPMoviePlayerController的请求时,server要先返回一个请求包含了整个视频文件的大小。然后MPMoviePlayerController才会不断请求本地的服务器取数据。我的实现是这样的。当要比方某个视频文件的时候,先开启一个request去下载,当收到文件总大小的时候,存到本地的一个dictionary中,request继续下载,然后打开localserver,拼一个本地url给player,让他自动播放。当localserver收到请求时,根据要请求的文件去本地读文件的实际大小,返回给player,然后player就可以播放了。
 
HTTPServer自己已经实现了断点下载的逻辑,你可以给他设置一个DocumentRoot,进来的文件请求会直接到这个目录下读文件的数据,他默认的实现获得文件总大小的逻辑是直接用NSFileManager去取文件的总大小,而这里我们需要去自己存到本地的dictionary中读。
 
大约思路就是这样,不想写太多东西,因为实际自己写的代码真的很少。还是留个思路,真正的实现由大家自己研究,总之实现起来挺简单的,最终效果也很好,大家各种放心就好了。
 
后面遇到了几个问题小说一下
1、HTTPServer不支持iOS4,好像是用到了一个gcd相关的函数不支持,因为目前我们ios4的用户比较少了,ios7都出来了,就直接把ios4的用户抛弃了,这里也没有深究。
2、MPMoviePlayerController是直接可以播放mp3的,因为我们还需要播放音频,而且是同一个页面,如果全用MPMoviePlayerController是最好的,因为不需要切换播放器,虽然看起来有点拙。但后来发现点问题,就是播放音频的时候,有的mp3不能拖拽,当你更改音频的播放时间的时候,MPMoviePlayerController直接停止了,但有的音频是可以的,最后研究好像是mp3码率或者格式的问题,因为我们已经有很多mp3了,再替换之前的mp3不太现实,最后的实现就是音频用avplayer播,缓冲进度用MPMoviePlayerController的,你可以想象代码写的多么脏。。如果大家只做视频或者刚开始做的话,最好把这个问题研究一下,这里我也没有深究。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值