Как транслировать видео с iPhone, действующего в качестве сервера?
я работаю над приложением для iOS, где один iPhone должен транслировать свои записи камеры на другой iPhone (чтобы все было просто, оба находятся в одной сети Wi-Fi).
Потоковая передача должна работать без физическое соединение (например, сервер, используемый для маршрутизации потока к клиентам). На самом деле,запись iPhone должен быть сервер который обслуживает другие iPhone (или более других устройств iOS в сети) с live поток.
Итак, что мне нужно сделать:
- получить живые фотографии с камеры
- при необходимости обработайте эти данные
- отправить кадр за кадром подключенным клиентам (TCP?)
- получить кадры на клиенте и отображать их в режиме реального времени
что у меня есть и что я застрял с:
я уже решил проблему 1. Я использую
AVCaptureSession
что постоянно возвращаетсяCMSampleBufferRef
' s (найдено здесь).я еще не уверен, что мне нужно делать с
CMSampleBufferRef
. Я знаю, как превратить его вCGImage
илиUIImage
(спасибо большое блогпост Бенджамин Loulier это2), но я понятия не имею, что конкретно мне нужно отправить, и если мне нужно как-то кодировать кадры.
Как упоминалось @jab в приведенном выше связанном ответе (этой) можно написать примеры в файл с одним или несколькимиAVAssetWriter
. Но опять же он говорит, что эти фрагменты видео 5 секунд должны быть загружены на сервер, который делает потоковый файл фильма из них (и этот фильм может быть передан на устройство iOSHTTP Live Streaming
Я полагаю).как я уже указывал, мое приложение (т. е. устройство видеозахвата "сервер") имеет один или несколько клиентов, подключенных к нему, и должно отправлять им видеокадры в режиме реального времени.
одна идея, которая пришла к мой ум должен использовать простойTCP
соединение, при котором сервер отправляет каждый кадр в сериализованный формат для подключенных клиентов в цикле. Более конкретно: когда один буферизованный кадр успешно отправляется клиенту, сервер принимает самый последний кадр в качестве следующего для отправки.
Итак,правильная ли это мысль? Или есть другой протокол, который гораздо лучше подходит для такого рода задач?
помните: я хочу, чтобы это было просто (просто для меня, например, так, что мне не нужно изучать слишком много новых аспектов программирования) и быстро. Я уже знаю некоторые вещи о TCP, я писал серверы и клиенты с ним в школе вC
, поэтому я бы предпочел применить знания, которые у меня есть сейчас, к этому проекту...и последнее, но не менее важное: получающий клиент:
Я представляю, если я буду использоватьTCP
соединение, которое на стороне клиента я получаю кадр за кадром с сервера, отбрасывает байт чтения пакет в используемый формат (CMSampleBuffer
,CGImage
,UIImage
) и просто отобразить его наCALayer
илиUIImageView
, да? Эффект фильма будет получен, просто постоянно обновляя этот вид изображения.
пожалуйста, дайте мне некоторые идеи о том, как достичь этой цели. Это очень важно, потому что это часть моего школьного выпускного проекта... Любой пример кода также приветствуется ;-) или просто обратитесь ко мне на другой сайт, учебник, Stackoverflow-ответ, так далее.
если у вас есть какие-либо вопросы к этому, просто оставьте комментарий, и я обновлю сообщение.
2 ответов
звуки ОК?
видеокадры действительно большие. У вас будут проблемы с пропускной способностью потокового видео с одного устройства на другое. Вы можете сжать рамки как
JPEG
с помощьюUIImageJPEGRepresentation
СUIImage
, но это вычислительно дорого на "сервере", и все же может не сделать их достаточно маленькими, чтобы поток хорошо. Вы также можете уменьшить частоту кадров и / или разрешение, отбросив кадры, уменьшивUIImage
S, и возиться с параметрыAVCaptureSession
. Кроме того, вы можете отправлять небольшие (5-секундные) видео, которые аппаратно сжаты на сервере и намного проще обрабатывать в полосе пропускания, но, конечно, дадут вам 5-секундное отставание в потоке.Если вам может потребоваться iOS 7, я бы предложил попробовать
MultipeerConnectivity.framework
. Это не очень сложно настроить, и я считаю, что он поддерживает несколько клиентов. Определенно используйте UDP, а не TCP, если вы собираетесь свернуть свою собственную сеть - это учебник применение для UDP, и оно имеет более низкие накладные расходы.кадр за кадром, просто включите
JPEG
наUIImage
s и использоватьUIImageView
. Есть значительные вычисления, но я считаю, что вы все равно будете ограничены пропускной способностью, а не процессором. Если вы отправляете маленькие видео, вы можете использоватьMPMoviePlayerController
. Вероятно, будут небольшие сбои между каждым видео, поскольку оно "готовит" их к воспроизведению, что также приведет к необходимости 5,5 секунд или около того для воспроизведения каждого 5-секундного видео. Я бы не рекомендовал использовать HTTP Live Streaming, если вы не можете получить реальный сервер в миксе где-то. Или вы можете использоватьffmpeg
pipeline -- feed видео и поп отдельных кадров - если вы можете / хотите скомпилироватьffmpeg
для iOS.
Дайте мне знать, если вам нужно разъяснение по любой из этих точек. Это большая работа, но относительно простая.
Если вам нужно решение с полки, вы можете попробовать некоторые готовые потоковые библиотеки. У меня есть опыт angl streaming lib. Работает довольно хорошо с выходом RTMP на Wowza media server.