Python 流式文件
我想在Python中流式传输一个文件(mp3格式)。我写了服务器的代码(但是不管用):
import socket
HOST = ''
PORT = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
s.bind((HOST, PORT))
print 'Socket bind complete'
s.listen(1)
print 'Socket now listening'
conn, addr = s.accept()
data = open("song.mp3", "rb")
data = data.read()
conn.sendall(data)
我还没有为它写客户端,因为我想让它能在VLC、Chrome和其他音乐播放器上工作。当我在VLC中尝试时,它给了我一个“连接被对方重置”的错误,而在Chrome中则出现了“管道破裂”的错误。
我想做的是制作一个简单的AirPlay复制品,但我不知道哪里出了问题。
2 个回答
1
看看这个 在Python中播放远程音频文件? mp3格式是为了流媒体播放而设计的,这让一些事情变得比你想象的要简单。mp3数据实际上是一串音频帧,里面有内置的边界标记,而不是一个文件头后面跟着原始数据。如果想了解更多信息,可以查看以下链接。 编写一个Python音乐流播放器
0
好的,我用VLC通过HTTP让它工作了,这里是代码:
import socket
filePath = "/storage/sdcard0/Music/song.mp3"
fileData = open(filePath, "rb").read()
host = ''
port = 8808
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HTTPString = "HTTP/1.1 200 OK\r\nConnection: Keep-Alive\r\nContent-Type: audio/mpeg\r\n\r\n" + fileData
s.bind((host, port))
s.listen(1)
conn, addr = s.accept()
conn.sendall(HTTPString)
更新:我让它在Chrome上也能工作了(我从没想过我会这么说),Chrome的持久连接真是让人头疼,它会引发SIGPIPE错误,所以我就选择忽略这个错误:
import socket
filePath = "/storage/sdcard0/Music/Madonna - Ray Of Light.mp3"
fileData = open(filePath, "rb").read()
host = ''
port = 8808
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HTTPString = "HTTP/1.1 200 OK\r\nConnection: Keep-Alive\r\nContent-Type: audio/mpeg\r\n\r\n" + fileData
s.bind((host, port))
s.listen(10)
while 1:
try:
conn, addr = s.accept()
conn.sendall(HTTPString)
except socket.error, e:
pass