服务器操做系统:windows 点播服务器:Nginx 转码和生成清单:ffmpeg 手机客户端:ExoPlayer SDKhtml
Nginx和ffmpeg都是跨平台的,应该也能够在linux上搭建出来。 搭建视频点播和直播系统使用的协议不同,视频点播网站多数是基于http协议,而直播协议不少,好比rtsp和rtmp,其中rtmp是Adobe的私有协议。 视频直播服务器可使用Live555,VLC(不仅是播放器,也能够直播),DarwinStreamingSrvr5.5.5(Apple开源,只有5.5.5版本)不少软件实现,多数都是开源跨平台,也比较好用,客户端若是是cs形式,那选择vlc仍是不错的,若是是bs形式,感受上videojs还不错。 视频点播服务器我选择使用Nginx搭建,如何搭建后面讲解,另外性能和并发上还没测试过。单独点播一个文件好比*.ts/.mp4都是配置一下就能够实现,在vlc中也能正常播放。我在Android手机中播放器选择了google的ExoPlayer,ExoPlayer是开源的而且支持HLS,Demo中的HLS示例都是Apple的.m3u8格式,上面简单配置ExoPlayer播放不了, 因此我选择基于Nginx搭建一个能够点播m3u8格式的服务器,*.m3u8文件自己就是个节目清单。java
首先下载Nginx,网址:http://nginx.org/en/download.html 生成*.m3u8清单须要切片,开源有好用的是ffmpeg,下载ffmpeg网址:https://ffmpeg.org/download.htmllinux
解压Nginx并配置,在html目录下建立一个文件夹hls,而后修改nginx.conf文件,修改后的内容以下:android
location / { root html; index index.html index.htm; location ~ .flv { flv; } location ~ .mp4 { mp4; } #location ~* \.mp4$ { # root /movies/; #} location /hls { # Serve HLS fragments types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } #root /hls; add_header Cache-Control no-cache; } }
而后还须要修改mime.types文件,在application/zip zip;后加入nginx
application/x-mpegURL m3u8; application/vnd.apple.mpegurl m3u8;
在video/x-msvideo avi;后加入git
video/MP2T ts;
启动Nginx,若是没有错误的话服务器应该搭建好了,可是如今尚未播放的内容。找一个*.mp4文件,而后解压刚下载的ffmpeg,用管理员身份启动命令行窗口,进入ffmpeg的bin目录下执行:github
ffmpeg -i *mp4 -hls_time 5 -hls_list_size 0 -c:v libx264 -c:a aac -strict -2 -f hls output.m3u8
这个时间可能会有点长,命令执行完后就把那些文件放到nginx的/html/hls目录下。Ffmpeg的一些参数介绍一下(网上抄来的): -hls_time n: 设置每片的长度,默认值为2。单位为秒 -hls_list_size n:设置播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5 -hls_wrap n:设置多少片以后开始覆盖,若是设置为0则不会覆盖,默认值为0.这个选项可以避免在磁盘上存储过多的片,并且可以限制写入磁盘的最多的片的数量 -hls_start_number n:设置播放列表中sequence number的值为number,默认值为0 注意:播放列表的sequence number 对每一个segment来讲都必须是惟一的,并且它不能和片的文件名(当使用wrap选项时,文件名有可能会重复使用)混淆。windows
若是是*.ts文件你可能须要下面这样,具体我也没用过,有问题就搜一下吧。服务器
ffmpeg -i *.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts
生成ts文件:并发
A. ffmpeg -y -i <in file> -vcodec copy -acodec copy -vbsf h264_mp4toannexb <output file> B.. /segmenter -i out.ts -n 10 -p segmenter_test -m test.m3u8 -u
如今可使用vlc测试一下了:http://127.0.0.1/hls/output.m3u8
网站:http://wear.techbrood.com/guide/topics/media/exoplayer.html 源码:https://github.com/google/ExoPlayer/ 一些参考能够在github里搜索:https://github.com/search?utf8=%E2%9C%93&q=exoplayer+hls
源码导入到eclipse可能有点问题,查看一下mainfest里面权限什么的,修改一下Samples.java里的HLS播放地址,加入http://127.0.0.1/hls/output.m3u8 播放以后可能没有全屏的功能,我用的方法是修改playeractivity横屏和全屏显示。
<activity android:name=".PlayerActivity" android:launchMode="singleTask" android:screenOrientation="landscape" android:label="@string/app_name" > </activity>
在onCreate(Bundle savedInstanceState)中的setContentView(R.layout.player_activity)方法前加入下面两行代码:
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
如今run一下app能够看到全屏的播放效果了(我这个图是手机截屏,其实全屏播放时没有上面的蓝色状态栏)。
仍是挺简单的吧?其实研究服务器搭建和Exoplayer问题,查了不少资料,仍是花了我一周时间的。