【问题标题】:Python stream filePython 流文件
【发布时间】:2014-07-29 19:16:49
【问题描述】:

我想在 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 的基本复制品,但我不知道出了什么问题。

【问题讨论】:

  • 为什么这个标签是http?您的代码中没有 HTTP 逻辑。

标签: python stream


【解决方案1】:

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

【讨论】:

  • 是的,但我想知道如何处理文件。我的意思是至少对于视频和照片,因为这就是 AirPlay 所做的。我只是想了解如何打开一个端口并将其重定向到本地源,我的意思是像中间本地源 -> Python -> Internet 中的一个人
【解决方案2】:

好的,我通过使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多