使用 Icecast 将 iOS 设备设为源客户端
Make iOS device as source client using Icecast
我想将 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
然后将音频数据分块写入。
我也关注了Icecast 2: protocol description, streaming to it using
我走错了路,最后我在 github 上找到了 iOS-Icecast-Client。它帮助我与 icecast-server
建立连接,并将录音机音频分块发送到服务器。正如我已经提到的,我能够在 localhost
.
上设置 icecast-server
在 AudioProcessor.m
文件中下载上述库后,有一行
ShoutOutputStream_Init("192.x.x.x", 8000, "/stream", "source", "hackme", 0);
其中 192.x.x.x
是您的 wifi ip,因为您不能在设备中使用 localhost
来连接它。还要确保您的系统和设备应该在同一个 wifi 连接上才能访问网络。
8000
是您在 icecast.xml
.
中定义的端口
/stream
是 icecast.xml
中定义的挂载点名称。
我花了几个小时得到 username
和 password
,它们也在 icecast.xml
的 authentication
标签中定义。我使用了默认的 source
和 hackme
.
0
是vorbis
(0)还是.mp3
(1)文件。
我终于让它工作了。非常感谢 gstream79 为我们提供了如此精彩的图书馆。
我想将 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
然后将音频数据分块写入。
我也关注了Icecast 2: protocol description, streaming to it using
我走错了路,最后我在 github 上找到了 iOS-Icecast-Client。它帮助我与 icecast-server
建立连接,并将录音机音频分块发送到服务器。正如我已经提到的,我能够在 localhost
.
icecast-server
在 AudioProcessor.m
文件中下载上述库后,有一行
ShoutOutputStream_Init("192.x.x.x", 8000, "/stream", "source", "hackme", 0);
其中 192.x.x.x
是您的 wifi ip,因为您不能在设备中使用 localhost
来连接它。还要确保您的系统和设备应该在同一个 wifi 连接上才能访问网络。
8000
是您在 icecast.xml
.
/stream
是 icecast.xml
中定义的挂载点名称。
我花了几个小时得到 username
和 password
,它们也在 icecast.xml
的 authentication
标签中定义。我使用了默认的 source
和 hackme
.
0
是vorbis
(0)还是.mp3
(1)文件。
我终于让它工作了。非常感谢 gstream79 为我们提供了如此精彩的图书馆。