当前位置: 首页 > 面试题库 >

编写Python Music Streamer

施翰学
2023-03-14
问题内容

我想在Python中实现一个服务器,该服务器通过HTTP流化MP3格式的音乐。我希望它播放音乐,以便客户端可以连接到流并开始收听当前正在播放的内容,就像广播电台一样。

以前,我已经使用SocketServer.TCPServer在Python中实现了自己的HTTP服务器(是的,我知道BaseHTTPServer存在,只是想自己编写一个微型HTTP堆栈),那么音乐流媒体在架构上会有什么不同?我需要在网络端和MP3端查看哪些库?


问题答案:

mp3格式是为流而设计的,这使某些事情比您预期的要简单。数据本质上是带有内置边界标记的音频帧流,而不是带有原始数据的文件头。这意味着一旦客户端希望接收音频数据,您就可以开始从现有mp3源中的任何点(无论是实时文件还是文件)开始向其发送字节,并且客户端将同步至其找到的下一帧并开始播放音频。好极了!

当然,您必须为客户提供一种建立连接的方法。事实标准是SHOUTcast(ICY)协议。这非常类似于HTTP,但是状态和标头字段恰好不同,以至于与Python的内置http服务器库不直接兼容。您也许可以使这些库为您完成一些工作,但是它们记录的接口不足以完成这些工作。您必须阅读他们的代码以了解如何使他们说SHOUTcast。

以下是一些入门指南:

http://forums.winamp.com/showthread.php?threadid=70403

http://forums.radiotoolbox.com/viewtopic.php?t=74

http://www.smackfu.com/stuff/programming/shoutcast.html

http://en.wikipedia.org/wiki/Shoutcast

我建议以单个mp3文件作为数据源,开始客户端-服务器连接的设置和播放,然后再处理诸如实时源,多种编码比特率,带内元数据和播放列表之类的问题。

播放列表通常是.pls或.m3u文件,本质上只是指向实时流URL的静态文本文件。它们并不困难,甚至也不是绝对必要的,因为许多(大多数?)mp3流客户端将接受根本没有播放列表的实时流URL。

至于建筑,这个领域是广阔的。您拥有与HTTP服务器一样多的选项。穿线了吗?工人流程?事件驱动?由你决定。对我来说,更有趣的问题是如何与服务多个输出流(播放器)的网络处理程序共享来自单个输入流(广播器)的数据。为了避免IPC和同步问题,我可能会从单线程事件驱动设计开始。在python
2中,像gevent这样的库将为您提供非常好的I /
O性能,
同时允许您以一种非常易懂的方式来构造代码。在python 3中,我更喜欢asyncio协程。



 类似资料:
  • 当你编写了一个可以用于多个软件包的特征测试时,最好用一个新宏把它苤装起来。下面是一些关于编写 Autoconf宏的要求(instructions)和指导(guidelines)。 宏定义 Autoconf宏是用宏AC—DEFUN定义的,该宏与m4的内置define宏相似。 除了定义一个宏,AC—DEFUN把某些用于限制宏调用顺序的代码添加到其中。 (参见 首要的宏 )。 一个Autoconf宏像下

  • 我们已经通过一些例子查看并编写了一些spec,现在是更进一步查看spec框架本身的时候了。确切地说,你在Atom中如何编写测试呢? Atom使用Jasmine作为spec框架。任何新的功能都要拥有specs来防止回归。 创建新的 spec Atom的spec和包的spec都要添加到它们各自的spec目录中。下面的例子为Atom核心创建了一个spec。 创建spec文件 spec文件必须以-spec

  • 本节将带着大家利用前面章节所学到的知识使用Python和PyInstalle自己的exp,在前面的章节,讲到了如何把一个python脚本编译成为一个可执行的PE文件,现在让我们利用前面学到的知识快速写一个windows工具脚本. 开始编码 大家其实会发现,很多恶意中间件最想干的一件事情就是获得被攻击系统的持久性(永久的潜伏在系统里面,永久性后门),像在windows里面最常见的一种方式就是被攻击系

  • 我正在使用优秀的库,希望更新到最新版本,为此我需要使用composer。 文件结构: Composer.json文件: 我试图像这样使用库: 问题是我得到了错误: 致命错误:在第132行的 /home/bookmark/public_html/ajax/action.php中找不到类'mikehaertl\wkhtmlto\Pdf' 这是我第一次使用作曲家,知道我做错了什么吗?

  • 如果现有的特征测试不能完成你所需要的工作,你就必须编写一个新的。这些宏是创建模块。它们为其它宏提供了检查各种 特征是否存在并且报告结果的方式。 本章包括一些建议和一些关于现有的测试的为什么要那样编写的原因。通过阅读现有的测试,你还可以学到许多关于编写 Autoconf测试的方法。如果在一个或多个Autoconf测试中出现了错误,这些信息可以帮助你理解它们意味着什么,这有助 于你找到最佳的解决问题的

  • 这一节介绍你可能遇到的在不同情况下如何分析和编写数据库迁移. 有关迁移的入门资料,请查看 the topic guide. 数据迁移和多数据库 在使用多个数据库时,需要解决是否针对某个特定数据库运行迁移。例如,你可能 只 想在某个特定数据库上运行迁移。 为此你可以在RunPython中通过查看schema_editor.connection.alias 属性来检查数据库连接别名: from dja

  • 14.1.1.编写AIDL 先定义Service的接口。如下可见,它与一般的Java接口十分相似。有CORBA经验的读者肯定可以认出AIDL与CORBA的IDL之间的渊源。 例 14.1. ILogService.aidl package com.marakana.logservice; // import com.marakana.logservice.Message; // interface

  • 由于你写的大部分 Redux 代码是函数,而且其中大部分是纯函数,所以很好测,不需要模拟。 准备工作 我们推荐使用 Jest) 作为测试引擎,需要注意的是 Jest 运行在 Node 环境中,因此你不能访问 DOM。 npm install --save-dev jest 如果想要和 Babel 一起使用,还需要安装 babel-jest npm install --save-dev babel-