Python流文件

时间:2014-06-09 09:11:42

标签: python stream

我想在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中它会出现“Broken pipe”错误。

我要做的是制作AirPlay的基本复制品,但我不知道出了什么问题。

2 个答案:

答案 0 :(得分:1)

看看这个 Playing remote audio files in Python? mp3格式是专为流媒体设计的,这使得一些事情比你想象的更简单。数据本质上是具有内置边界标记的音频帧流,而不是文件头后跟原始数据,请查看以下URL以获取更多信息。 Writing a Python Music Streamer

答案 1 :(得分:0)

好的,我在这里通过使用HTTP来使用VLC代码:

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一起工作(从未想过我会说这个)愚蠢的持久连接,这会引发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