我有一个 Raspberry Pi,我已将其连接到门铃传感器,因此当人们进入建筑物时它会发出不同的声音。现在,我刚刚制作了一个简短的脚本来播放目录中任何内容的声音,并且效果很好。
我决定,如果我设置一个 Web 服务器,上传声音和组织播放顺序可能会更容易,并且由于我倾向于将 Django 用于所有 Web 服务器,所以我认为我可以让它工作。我知道对于这么小的钉子来说,这是一把相当大的锤子,但我经常使用它,所以它对我来说很容易使用。
当我将这段代码放入 Django InteractiveConsole 中时,它运行得很好。 当我尝试从视图中的 PUT 请求调用它时,它不会播放声音,但也不会抛出任何错误。我的电脑和树莓派都是这样。
>>> import vlc
>>> media_player = vlc.MediaPlayer()
>>> media = vlc.Media("/home/pi/chime/media/clips/clip1.mp3")
>>> media_player.set_media(media)
>>> media_player.play()
是否有什么东西可以阻止此类调用在 django 视图中运行? 有办法解决吗?
编辑:Django 代码示例
class ClipsList(View):
template_name = "clips/clip_list.html"
# Ensure we have a CSRF cooke set
@method_decorator(ensure_csrf_cookie)
def get(self, request):
ctx = {
'object_list': Clip.objects.all().order_by('order'),
}
return render(self.request, self.template_name, context=ctx)
# Process POST AJAX Request
def post(self, request):
if request.headers.get('x-requested-with') == 'XMLHttpRequest':
try:
# Parse the JSON payload
data = json.loads(request.body)[0]
# Loop over our list order. The id equals the question id. Update the order and save
for idx, row in enumerate(data):
pq = Clip.objects.get(pk=row['id'])
pq.order = idx + 1
pq.save()
except KeyError:
HttpResponse(status="500", content="Malformed Data!")
return JsonResponse({"success": True}, status=200)
else:
return JsonResponse({"success": False}, status=400)
def put(self, request, pk):
if request.headers.get('x-requested-with') == 'XMLHttpRequest':
try:
data = json.loads(request.body)
clip = Clip.objects.get(pk=pk)
media_player = vlc.MediaPlayer()
media = vlc.Media(os.path.join(settings.BASE_DIR, str(clip.file)))
media_player.set_media(media)
media_player.play()
sleep(3)
media_player.stop()
except KeyError:
HttpResponse(status="500", content="Malformed Data!")
return JsonResponse({"success": True}, status=200)
else:
return JsonResponse({"success": False}, status=400)
根据我被问到的一些问题,我意识到我使用了 BASE_DIR 而不是 MEDIA_ROOT 作为剪辑的目录。 这解决了开发计算机上的问题,但是当与 Apache 一起使用时,它仍然无法工作,直到我将
www-data
用户添加到 audio
、pulse
和 pulse-access
组。