【发布时间】:2018-05-01 16:14:36
【问题描述】:
我想让iOS 设备作为源客户端将音频发送到icecast 服务器。我已成功在localhost 上设置icecast 服务器。现在,当我向服务器发送以下请求时,它会创建mountpoint,但仅针对audio 的第一个8 sec,audio 的总长度为25 sec。我知道这是因为我没有分块发送数据。以下是我的要求:
let requestString = "http://localhost:8000/"
let url = URL(string: requestString)
let mountPointName = "myMountPoint"
var request = URLRequest(url: url!)
request.httpMethod = "SOURCE /\(mountPointName) ICE/1.0"
request.addValue("SOURCE /mp3test ICE/1.0", forHTTPHeaderField: "SOURCE")
request.addValue("audio/ogg", forHTTPHeaderField: "Content-Type")
request.setValue("Basic c291cmNlOmhhY2ttZQ==", forHTTPHeaderField: "Authorization")
request.setValue("Server name", forHTTPHeaderField: "ice-name")
request.setValue("https://www.google.com", forHTTPHeaderField: "ice-url")
request.setValue("RockTest", forHTTPHeaderField: "ice-genre")
request.setValue("128", forHTTPHeaderField: "ice-bitrate")
request.setValue("0", forHTTPHeaderField: "ice-private")
request.setValue("1", forHTTPHeaderField: "ice-public")
request.setValue("Server description", forHTTPHeaderField: "ice-description")
request.setValue("samplerate=44100;bitrate=128;channels=2", forHTTPHeaderField: "ice-audio-info")
self.recurseivelySendRequest(request)
我的递归函数:
func recurseivelySendRequest(_ _request: URLRequest) {
var request = _request
do {
let fileURL = Bundle.main.url(forResource: "mount", withExtension: "ogg") let data = try Data(contentsOf: fileURL!)
let inputStream = InputStream(data: data)
request.httpBodyStream = inputStream
} catch let error {
print(error)
}
// let dataTask = URLSession.shared.uploadTask(withStreamedRequest: request)
// dataTask.resume()
let dataTask = URLSession.shared.dataTask(with: request) { (data, response, error) in
if (error != nil) {
print(error ?? "error = unknown")
return
}
print(response ?? "response = unknown")
do {
let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)
print(json)
} catch let error {
print(error)
let str = String.init(data: data!, encoding: String.Encoding.utf8)
print(str ?? "str = nil")
}
self.recurseivelySendRequest(request)
}
dataTask.resume()
}
上面代码的问题是它只发送audio 的一小部分,如果我不递归发送请求,mountpoint 不再存在并且似乎它正在替换未添加的数据。所以我想要的是创建一次mountpoint,然后将音频数据分块写入。
【问题讨论】:
-
你在那儿干什么?您的挂载点名为“mp3test”,您指示内容“audio/ogg”并发送指示 CBR 的标头?
-
@TBR 其实我是从this description复制过来的。
-
该描述与发送旧 MP3 内容(即“音频/mpeg”)一致。你改变了那个。你用的是什么编解码器?
-
哦,是的,我的错误是“音频/mpeg”...我正在尝试通过将本地存储的音频文件转换为
data来发送数据。我没有对其进行编码。 -
如果您声明了音频/ogg,但发送了其他内容,服务器会很快将您丢弃。我提出这个的原因之一。