Сделать iOS-устройство в качестве исходного клиента с помощью Icecast - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу сделать iOS устройство в качестве исходного клиента для отправки аудио на icecast сервер. Я успешно установил сервер icecast на localhost. Прямо сейчас, когда я отправляю запрос на сервер ниже, он создает mountpoint, но только для первых 8 sec из audio, общая длина 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: описание протокола, потоковая передача на него с использованием

1 Ответ

0 голосов
/ 01 мая 2018

Я был на неверном пути, наконец, я нашел iOS-Icecast-Client на github. Это помогает мне установить соединение с 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 в устройстве для его подключения. Также убедитесь, что ваша система и устройство должны быть подключены к одному и тому же Wi-Fi для доступа к сети.

8000 - ваш порт, определенный в icecast.xml.

/stream - это имя точки монтирования, определенное в icecast.xml.

И вот, где я потратил несколько часов, чтобы получить username и password, они также определены в теге authentication в icecast.xml. Я использовал по умолчанию source и hackme.

0 - это файл vorbis (0) или .mp3 (1).

Наконец-то я все заработал. И большое спасибо gstream79 за предоставление нам такой замечательной библиотеки.

...