【问题标题】:Writing .mp3 file directly from stream直接从流中写入 .mp3 文件
【发布时间】:2013-12-28 12:29:27
【问题描述】:

我正在尝试从流中记录样本并将 sn-ps 保存为 .mp3 文件。以下代码正确读取流并将数据保存到文件中。该文件在媒体播放器中播放,但没有标题等,因此当我尝试对 .mp3 文件执行其他操作(例如使用 LAME 将其转换为另一种格式)时,每次都会失败。有没有人有这种事情的经验?

以下是获取 .mp3 文件的工作示例。抱歉,如果您收到广告;收音机很烂。

import urllib2
from datetime import datetime
from datetime import timedelta

# Name of the file stream and how long to record a sample
URL = "http://4893.live.streamtheworld.com:80/KUFXFMAAC_SC"
RECORD_SECONDS = 30

# Open the file stream and write file
filename = 'python.mp3'
f=file(filename, 'wb')
url=urllib2.urlopen(URL)

# Basically a timer
t_start = datetime.now()
t_end = datetime.now()
t_end_old = t_end

# Record in chunks until
print "Recording..."
while t_end-t_start < timedelta(seconds=RECORD_SECONDS):
    f.write(url.read(1024))
    t_end = datetime.now()
# Or one big read?
#f.write(url.read(1024*517))


f.close()

这可能接近我想要做的:? encoding mp3 from a audio stream of PyTTS

【问题讨论】:

  • 现在,你得到的只是一个原始流(不会有任何标题)。所以理论上,你可以将文件命名为python.wavpython.wma,它可能会被正确读取。我不确定 mp3 是如何从字节码编码的,但您需要使用 mp3 shell 来“包装”字节码。
  • 作为后续,请查看PyMedia 为您创建 MP3。
  • 我无法让 pymedia 为这个应用程序工作。我尝试将扩展名更改为 .wav,但我仍然遇到同样的问题。
  • @RadicalEdward 对于它的价值,我已经以这种方式转储了许多流,并且在 FFMPEG 转换它们时从未遇到过问题。 FFMPEG非常容忍错误。有一个开关可以配置它的行为,但我不记得了。您也可以尝试不同的 FFmpeg 构建。

标签: python mp3 audio-streaming audio-recording encoder


【解决方案1】:

您需要阅读有关 mpeg 帧的信息 http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm 拍摄时您可能没有对齐帧,因此您的第一帧和最后一帧可能不完整。

一帧的开始是 11 个设置位,因此连续 11 个。所以你需要找到第一帧的开始并删除它之前的所有内容,然后找到最后一帧的开始并将其删除。或者您可以在从流中读取时执行此操作。您可以使用 binascii 来检查十六进制值。

【讨论】:

  • binascii.hexlify(url.read(1024))是你在说什么吗?
  • 是的,您要查找的十六进制数是 ffe,我会尽快发布示例。
  • 对不起,你想要的十六进制是fff,因为前12位是111111111111
  • 关于如何使用url.read(# byte's) 迭代位的任何建议?
  • @AronVietti 问题比这更糟。别忘了钻头水库!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多