我有一个1T的移动硬盘,里面存了一堆你懂的资源。这些东西还是用手机看比较好,毕竟电脑动静太大了,而且人来人往的,也挺不好意思的。每次想看都得拷到手机里,这太不方便了,于是想出了用电脑搭建一个流媒体服务器,通过连接入局域网的手机直接点播的需求。
开始考虑的是只用Django来进行读取视频文件返回给用户。这样只有文件下载完成之后才能播放,更不爽的是不能拖动进度条。通过一通搜索大法,发现Nginx可以作为一个流媒体服务器来使用,支持flv和mp4格式的视频。好了,不扯了,下面开始发车。
下载windows版的Nginx。
http://nginx.org/en/download.html
解压随便放个地方,修改配置文件nginx.conf,增加下面一几段。
location ~ \.mp4{
root H://;
}
我的视频都放在了H盘下,所以增加后缀为.mp4文件的根目录为H://。
这样就可以通过*http://127.0.0.1/文件的路径*
进行访问H盘下的mp4文件咯,在浏览器支持的情况下可以直接播放并且可以在未缓存完成的情况下拖动进度条哦。
能正常播放后,就要解决文件浏览的问题,我们不可能把硬盘下所有的文件路径都手动输入吧。Nginx有开启目录浏览的功能,加入下面的代码:
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
这样就可以在浏览器上查看文件内容了,而点击mp4文件也能播放了,是不是很开心呀!
到这里是不是怀疑这还关django什么事,直接用nginx就可以完成了呀?别急,这时候你会发现。。。点开所有中文的文件都会发生500错误,机智的你查看error.log,会发现刚才的请求发生了以下错误:
ailed (1113: No mapping for the Unicode character exists in the target multi-byte code page), client:
又是字符编码问题,这个问题有不少人提出过,但我也没有找到直接修改配置解决方法。
好了,这个不详表(我还没研究明白怎么回事,以后有空再回来补上),但是通过django请求过去的链接就能访问。
遍历文件视图代码
FILE_HOME_DIR = "H://"
MEDIA = [ ".mp4",]
os.chdir(FILE_HOME_DIR)
def file_list(request):
next = request.REQUEST.get("next", '')
path = "/".join(request.path.split("/")[2:])
#print os.listdir(FILE_HOME_DIR+".none/")
data = {"files":[], "dirs":[]}
child_path = FILE_HOME_DIR+path+next
data['cur_dir'] = path+next
for dir in os.listdir(child_path):
if os.path.isfile(child_path+"/"+dir):
if os.path.splitext(dir)[1] in MEDIA:
data['files'].append(dir)
else:
data['dirs'].append(dir)
return render(request,"player/index.html", data)
显示template代码
<ul>
{% for dir in dirs%}
<li >
{{ dir }} <a style="color: #462921;font-size: 16px;" href="/file/{{ cur_dir|safe }}/?next={{ dir|safe }}">进入a>
li>
{% endfor %}
{% for file in files%}
<li>
<span style="margin-right: 14px;">{{ file }}span><button><a href="/{{ cur_dir|safe }}/{{ file|safe }}" target="_blank">播放a>button>
li>
{% endfor %}
ul>
这里,我的Nginx监听的端口是80端口,而django开的端口是8000,还得修改下Nginx的配置。在nginx.conf再加上几句:
location /file {
proxy_pass http://127.0.0.1:8000/file;
}
以/file开头的地址由django来处理,而其他请求由nginx来处理。
这样就可以完成所有的事情了,尽情享受吧。