Как транслировать видео с iPhone, действующего в качестве сервера?

я работаю над приложением для iOS, где один iPhone должен транслировать свои записи камеры на другой iPhone (чтобы все было просто, оба находятся в одной сети Wi-Fi).
Потоковая передача должна работать без физическое соединение (например, сервер, используемый для маршрутизации потока к клиентам). На самом деле,запись iPhone должен быть сервер который обслуживает другие iPhone (или более других устройств iOS в сети) с live поток.

Итак, что мне нужно сделать:

  1. получить живые фотографии с камеры
  2. при необходимости обработайте эти данные
  3. отправить кадр за кадром подключенным клиентам (TCP?)
  4. получить кадры на клиенте и отображать их в режиме реального времени

что у меня есть и что я застрял с:

  1. я уже решил проблему 1. Я использую AVCaptureSession что постоянно возвращается CMSampleBufferRef ' s (найдено здесь).

  2. я еще не уверен, что мне нужно делать с CMSampleBufferRef. Я знаю, как превратить его в CGImage или UIImage (спасибо большое блогпост Бенджамин Loulier это2), но я понятия не имею, что конкретно мне нужно отправить, и если мне нужно как-то кодировать кадры.
    Как упоминалось @jab в приведенном выше связанном ответе (этой) можно написать примеры в файл с одним или несколькими AVAssetWriter. Но опять же он говорит, что эти фрагменты видео 5 секунд должны быть загружены на сервер, который делает потоковый файл фильма из них (и этот фильм может быть передан на устройство iOS HTTP Live Streaming Я полагаю).

  3. как я уже указывал, мое приложение (т. е. устройство видеозахвата "сервер") имеет один или несколько клиентов, подключенных к нему, и должно отправлять им видеокадры в режиме реального времени.
    одна идея, которая пришла к мой ум должен использовать простой TCP соединение, при котором сервер отправляет каждый кадр в сериализованный формат для подключенных клиентов в цикле. Более конкретно: когда один буферизованный кадр успешно отправляется клиенту, сервер принимает самый последний кадр в качестве следующего для отправки.
    Итак,правильная ли это мысль? Или есть другой протокол, который гораздо лучше подходит для такого рода задач?
    помните: я хочу, чтобы это было просто (просто для меня, например, так, что мне не нужно изучать слишком много новых аспектов программирования) и быстро. Я уже знаю некоторые вещи о TCP, я писал серверы и клиенты с ним в школе в C, поэтому я бы предпочел применить знания, которые у меня есть сейчас, к этому проекту...

  4. и последнее, но не менее важное: получающий клиент:
    Я представляю, если я буду использовать TCP соединение, которое на стороне клиента я получаю кадр за кадром с сервера, отбрасывает байт чтения пакет в используемый формат (CMSampleBuffer, CGImage, UIImage) и просто отобразить его на CALayer или UIImageView, да? Эффект фильма будет получен, просто постоянно обновляя этот вид изображения.

пожалуйста, дайте мне некоторые идеи о том, как достичь этой цели. Это очень важно, потому что это часть моего школьного выпускного проекта... Любой пример кода также приветствуется ;-) или просто обратитесь ко мне на другой сайт, учебник, Stackoverflow-ответ, так далее.

если у вас есть какие-либо вопросы к этому, просто оставьте комментарий, и я обновлю сообщение.

2 ответов


  1. звуки ОК?

  2. видеокадры действительно большие. У вас будут проблемы с пропускной способностью потокового видео с одного устройства на другое. Вы можете сжать рамки как JPEGс помощью UIImageJPEGRepresentation С UIImage, но это вычислительно дорого на "сервере", и все же может не сделать их достаточно маленькими, чтобы поток хорошо. Вы также можете уменьшить частоту кадров и / или разрешение, отбросив кадры, уменьшив UIImageS, и возиться с параметры AVCaptureSession. Кроме того, вы можете отправлять небольшие (5-секундные) видео, которые аппаратно сжаты на сервере и намного проще обрабатывать в полосе пропускания, но, конечно, дадут вам 5-секундное отставание в потоке.

  3. Если вам может потребоваться iOS 7, я бы предложил попробовать MultipeerConnectivity.framework. Это не очень сложно настроить, и я считаю, что он поддерживает несколько клиентов. Определенно используйте UDP, а не TCP, если вы собираетесь свернуть свою собственную сеть - это учебник применение для UDP, и оно имеет более низкие накладные расходы.

  4. кадр за кадром, просто включите JPEGна UIImages и использовать UIImageView. Есть значительные вычисления, но я считаю, что вы все равно будете ограничены пропускной способностью, а не процессором. Если вы отправляете маленькие видео, вы можете использовать MPMoviePlayerController. Вероятно, будут небольшие сбои между каждым видео, поскольку оно "готовит" их к воспроизведению, что также приведет к необходимости 5,5 секунд или около того для воспроизведения каждого 5-секундного видео. Я бы не рекомендовал использовать HTTP Live Streaming, если вы не можете получить реальный сервер в миксе где-то. Или вы можете использовать ffmpeg pipeline -- feed видео и поп отдельных кадров - если вы можете / хотите скомпилировать ffmpeg для iOS.

Дайте мне знать, если вам нужно разъяснение по любой из этих точек. Это большая работа, но относительно простая.


Если вам нужно решение с полки, вы можете попробовать некоторые готовые потоковые библиотеки. У меня есть опыт angl streaming lib. Работает довольно хорошо с выходом RTMP на Wowza media server.