树莓派论坛

 找回密码
 立即注册

[系统与软件] 将 R-Pi 打造成一个大屏幕的服务器

lupino 发表于 2012-10-31 19:30:55 | 显示全部楼层 |阅读模式
R-Pi 的 hdmi 输出,用来看视频是件不错的事情。
试曾想过我们在手机或者平板上看到一张美丽的图片,视频,然后想在高清电视,上播放出来。
有个很简单的方法。在 R-Pi 上开启 http 服务,通过局域网,由手机或者平板,提交信息给 R-Pi然后就可以了。
下面以网络视频为例:
1、首先安装一些基本的软件和软件包:
  1. # apt-get install mplayer
  2. # easy_install bottle
  3. # easy_install beautifulsoup4
  4. # easy_install requests
  5. # easy_install mplayer.py
复制代码
2、导入基本的模块。
  1. from bottle import Bottle, request, response
  2. import mplayer, requests
  3. from bs4 import BeautifulSoup
  4. import os, re
  5. import json
复制代码
3、初始化:
  1. app = Bottle()
  2. player = None
复制代码

4、解析视频地址:
  1. def parse_video(url, format='nomal'):
  2.     browser = requests.session()
  3.     browser.config['base_headers']['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Ubuntu/12.04 Chromium/20.0.1132.47 Chrome/20.0.1132.47 Safari/536.11'
  4.     r = browser.get('http://www.flvcd.com/parse.php?kw=%s&flag=one&format=%s'%(url, format))
  5.     r.encoding = 'GBK'
  6.     html = BeautifulSoup(r.text)
  7.     mform = html.find('form', {'name':'mform', 'method':'post'})
  8.     if mform:
  9.         name = mform.find('input', {'name':'name'}).get('value')
  10.         info = mform.find('input', {'name':'inf'}).get('value')
  11.         urls = [u for u in re.findall(r'<u>(.+)', info, re.I) if u]
  12.         return urls
  13.     return None
复制代码
5、播放视频:
  1. @app.post('/play')
  2. def play():
  3.     global player
  4.     data = request.forms.get('json', None)
  5.     if data is None:
  6.         return {'err':'403', 'msg':'request error'}
  7.     print(data)
  8.     data = json.loads(data)
  9.     files = data.get('files', [])
  10.     url = data.get('url')
  11.     last = data.get('start', 0)
  12.     fullscreen = data.get('fullscreen', False)
  13.     volume = data.get('volume')
  14.     if url:
  15.         format = data.get('format', 'nomal')
  16.         files = parse_video(url, format)
  17.     if files is None or len(files)==0:
  18.         return {'err':'403', 'msg':'request error'}
  19.     if player is None or not player.is_alive():
  20.         player = mplayer.Player()
  21.     if fullscreen:
  22.         player.fullscreen = bool(fullscreen)
  23.     if volume:
  24.         player.volume = float(volume)
  25.     for fn in files:
  26.         player.loadfile(fn, last)
  27.         last += 1
  28.     return {'last': last}
复制代码

6、暂停:
  1. @app.post('/pause')
  2. def pause():
  3.     if player and player.is_alive():
  4.         player.pause()
  5.         return {'paused':player.paused}
  6.     else:
  7.         return {'err':'403', 'msg':'player is quit'}
  8. @app.get('/paused')
  9. def paused():
  10.     if player and player.is_alive():
  11.         return {'paused':player.paused}
  12.     else:
  13.         return {'err':'403', 'msg':'player is quit'}
复制代码
7、退出
  1. @app.post('/quit')def quit():
  2.    global player
  3.     if player and player.is_alive():
  4.         player.quit()
  5.         player = None
  6.     return {'msg':'quit'}
复制代码
8、全屏
  1. @app.post('/fullscreen')
  2. def fullscreen(is_set=True):
  3.     if player and player.is_alive():
  4.         if is_set:
  5.             player.fullscreen = not player.fullscreen
  6.         return {'fullscreen':player.fullscreen}
  7.     return {'err':'403', 'msg':'player is quit'}
  8. @app.get('/fullscreen')
  9. def _fullscreen():
  10.     return fullscreen(False)
复制代码
9、声音
  1. @app.post('/volume')
  2. def volume(is_set=True):
  3.     if player and player.is_alive():
  4.         if is_set:
  5.             volume = request.forms.get('value', 100.0)
  6.             player.volume = float(volume)
  7.         return {'volume':player.volume}
  8.     return {'err':'403', 'msg':'player is quit'}
  9. @app.get('/volume')
  10. def _volume():
  11.     return volume(False)
复制代码

10、定位
  1. @app.post('/seek')
  2. def seek():
  3.     if player and player.is_alive():
  4.         value = request.forms.get('value', 0)
  5.         type = request.forms.get('type', 0)
  6.         player.seek(float(value), int(type))
  7.         return {'length':player.length, 'position':player.percent_pos}
  8.     return {'err':'403', 'msg':'player is quit'}
  9. @app.post('/pt_step')
  10. def pt_step():
  11.     if player and player.is_alive():
  12.         value = request.forms.get('value', 1)
  13.         force = request.forms.get('force', 0)
  14.         if force:
  15.             player.pt_step(int(value), int(force))
  16.         else:
  17.             player.pt_step(int(value))
  18.         return {'filename':player.filename}
  19.     else:
  20.         return {'err':'403', 'msg':'player is quit'}
复制代码

11、状态
  1. @app.get('/status')
  2. def status():
  3.     if player and player.is_alive():
  4.         return {'filename':player.filename, 'position':player.percent_pos, 'length':player.length}
  5.     else:
  6.         return {'err':'403', 'msg':'player is quit'}
复制代码

12、静音
  1. @app.post('/mute')
  2. def mute():
  3.     if player and player.is_alive():
  4.         player.mute = not player.mute
  5.         return {'mute':player.mute}
  6.     else:
  7.         return {'err':'403', 'msg':'player is quit'}
复制代码
13、main
  1. if __name__ == '__main__':
  2.     from bottle import run
  3.     run(app)
复制代码
14、将以上代码保存为 app.py
15、运行:
  1. $ python app.py
复制代码

评分

参与人数 1 +11 收起 理由
树老大 + 11 强人啊,好帖必须顶

查看全部评分

lupino  楼主| 发表于 2012-10-31 19:38:42 | 显示全部楼层
播放视频:
  1. import requests
  2. import json
  3. def api(uri):
  4.     return 'http://127.0.0.1:8080' + uri
  5. data = {
  6.         'url':'http://v.youku.com/v_show/id_XNDU3NjM0NzMy.html',# require
  7.         'files', [], # require
  8.         'start':0, # 0 为立即播放
  9.         'format': 'nomal', # nomal, super
  10.         'fullscreen': True,
  11.         'volume': 90
  12.         } # files/url, 必须有一个,url > files
  13. r = requests.post(api('/play'), data={'json':json.dumps(data)})
  14. print(r.json)
复制代码
查看是否全屏:
  1. r = requests.get(api('/fullscreen'))
  2. print(r.json)
复制代码
改变全屏状态:
  1. r = requests.post(api('/fullscreen'))
  2. print(r.json)
复制代码
查看音量:
  1. r = requests.get(api('/volume'))
  2. print(r.json)
复制代码
修改音量:
  1. r = requests.post(api('/volume'), data={'value':50})
  2. print(r.json)
复制代码
查看是否暂停:
  1. r = requests.get(api('/paused'))
  2. print(r.json)
复制代码
修改暂停状态:
  1. r = requests.post(api('/pause'))
  2. print(r.json)
复制代码
定位:
  1. r = requests.post(api('/seek'), data={
  2.             'value':20,
  3.             'type':0 # 可选,0 是一个相对定位+/- <value>(默认值)。
  4.                      #      1 是定位<value>%在电影里。
  5.                      #      2 是寻求一个绝对位置的<value>秒。
  6.         })
  7. print(r.json)
复制代码
下一个/上一个视频:
  1. r = requests.post(api('/pt_step'), data={
  2.             'value':1 # 1 为下一个,-1 上一个
  3.             'force':0 # 可选 默认为 0
  4.         })
  5. print(r.json)
复制代码

静音:
  1. r = requests.post(api('/mute'))
  2. print(r.json)
复制代码

查看状态:
  1. r = requests.get(api('/status'))
  2. print(r.json)
复制代码
退出:
  1. r = requests.post(api('/quit'))
  2. print(r.json)
复制代码
lupino  楼主| 发表于 2012-10-31 19:40:31 | 显示全部楼层
倒时候开发个 手机客户端,这样就一个真正的大屏幕啦!
ctr54188 发表于 2012-10-31 20:03:51 | 显示全部楼层
好深奥 支持一下!
树老大 发表于 2012-10-31 20:08:39 | 显示全部楼层
强人啊,好帖必须顶
deny1524 发表于 2012-11-1 09:11:15 | 显示全部楼层
有没有C语言版本的,没学过python的路过帮顶
liweitianux 发表于 2012-11-1 10:15:46 | 显示全部楼层
没图不够爽啊
cscscheng 发表于 2012-11-1 11:00:56 | 显示全部楼层
不知道兄台有没有测试过..mplayer在pi上根本不能用的
通用播放器不支持硬件加速的话..解码速度在3-4FPS左右..
znetor 发表于 2012-11-1 11:30:10 | 显示全部楼层
抓youjizz.com 的数据 实时更新小 电影
rsap_wu 发表于 2012-11-1 16:32:10 | 显示全部楼层
没看懂楼主要干嘛
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版 | Archiver | 树莓派论坛 ( 粤ICP备15075382号-1 )