使用Icecast将iOS设备作为源客户端

时间:2018-04-27 06:52:49

标签: ios swift icecast

我想将iOS设备作为源客户端将音频发送到icecast服务器。我已成功在icecast上设置localhost服务器。现在,当我向服务器发送以下请求时,它会创建mountpoint,但仅针对8 sec的第一个audioaudio的总长度为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

1 个答案:

答案 0 :(得分:0)

我在错误的道路上终于在github上找到了iOS-Icecast-Client。它帮助我与icecast-server建立连接,并将记录器音频以块的形式发送到服务器。正如我已经提到的,我能够在icecast-server上设置localhost

AudioProcessor.m文件中下载上述库后,有一行

ShoutOutputStream_Init("192.x.x.x", 8000, "/stream", "source", "hackme", 0);

192.x.x.x是你的wifi ip,因为你无法在设备中使用localhost来连接它。还要确保您的系统和设备应该在同一个wifi连接上才能到达网络。

8000是您在icecast.xml中定义的端口。

/streamicecast.xml中定义的挂载点名称。

这里我花了几个小时来获取usernamepassword这些也在authentication的{​​{1}}标记中定义。我使用了默认的icecast.xmlsource

hackme0(0)还是vorbis(1)文件。

最后我开始工作了。非常感谢gstream79为我们提供了如此精彩的图书馆。