从 Django 在服务器上播放音频文件

问题描述 投票:0回答:1

我有一个 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)
python django raspberry-pi
1个回答
0
投票

根据我被问到的一些问题,我意识到我使用了 BASE_DIR 而不是 MEDIA_ROOT 作为剪辑的目录。 这解决了开发计算机上的问题,但是当与 Apache 一起使用时,它仍然无法工作,直到我将

www-data
用户添加到
audio
pulse
pulse-access
组。

© www.soinside.com 2019 - 2024. All rights reserved.