Потоковая передача скриншотов через WebRTC в виде видеопотока с iOS

Мы хотим передать экран (снимки экрана) браузеру с iPad. На данный момент мы делаем снимки экрана и отправляем их по каналу данных WebRTC, однако это требует большой пропускной способности.

Отправка 5 кадров в секунду с полным сжатием и масштабированием по-прежнему требует скорости загрузки около 1,5-2 МБ / с.

Нам нужно использовать некоторую форму кодирования видео, чтобы мы могли снизить требования к пропускной способности и позволить WebRTC обрабатывать управление потоком в зависимости от скорости соединения.

AVAssetWriter берет изображения и конвертирует их в файл .MOV, однако не позволяет нам получить из него поток.

Есть идеи для нас? На данный момент довольно застрял, все идеи оценены.

Благодарю за предположение, что это дубликат, однако это мне не очень помогает. У меня уже есть рабочее решение, но оно недостаточно хорошее.

Редактировать:

UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.7); //Scaling is slow, but that's not the problem. Network is


[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

NSData *data = UIImageJPEGRepresentation(image, 0.0); //Compress alot, 0.0 is max, 1.0 is least


NSString *base64Content = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

А затем я отправляю эти данные base64 по каналу данных WebRTC блоками по 16 КБ, как это предлагается в документации.

dc.send(...)

person Jakkra    schedule 20.05.2016    source источник
comment
Возможный дубликат совместного использования экрана в приложении iOS?   -  person Kevin    schedule 20.05.2016
comment
@Kevin Этот вопрос был закрыт и носил очень общий характер. Ответ только показывает, как сделать снимок экрана в файл. Этот вопрос имеет хорошее определение и объясняет, как они в настоящее время реализуют решение (захват экрана и отправка его по каналу данных).   -  person xdumaine    schedule 20.05.2016
comment
@xdumaine Это просто предложение. Кто знает, может, это поможет Джаккре. Пометка как дубликат также является удобным способом ссылки на связанную информацию в SO. Обратите внимание, как он добавляет? в конце концов, это не заявление.   -  person Kevin    schedule 21.05.2016
comment
@Kevin Спасибо, но, как сказал xdumaine, мне это не очень помогает. Уже есть рабочее решение, но оно недостаточно хорошее. Спасибо, в любом случае!   -  person Jakkra    schedule 21.05.2016
comment
@Jakkra Можете ли вы добавить свой соответствующий код? Мы не сможем помочь вам в оптимизации, если не знаем, как вы обрабатываете свои данные. Как делать скриншоты? Как вы их сжимаете и масштабируете? Как вы их упаковываете? Как их распаковать? Если бы вы могли опубликовать код для этих частей, возможно, мы могли бы рассказать вам, как его улучшить.   -  person Kevin    schedule 21.05.2016
comment
@kevin Я не хотел, чтобы ты принял это на свой счет. По моему опыту, когда люди помечают как повторяющиеся, возникает множество вопросов, которые можно быстро закрыть.   -  person xdumaine    schedule 21.05.2016
comment
@Kevin добавил код.   -  person Jakkra    schedule 21.05.2016
comment
@Jakkra Хорошо, нужно прекратить использовать base64, потому что он примерно на 30% больше, чем исходные данные.   -  person Kevin    schedule 21.05.2016
comment
@Kevin, спасибо, это, безусловно, улучшит наше текущее решение :) Однако исходная проблема все еще остается в силе.   -  person Jakkra    schedule 21.05.2016


Ответы (1)


Я бы сжал скриншоты с помощью кодировщика javascript, то есть MPEG, а затем перекодировал этот поток на стороне сервера в VP8 для WebRTC.

Однако он может не работать должным образом на старых устройствах iOS, например iPad 2010-2011 из-за нехватки ресурсов ЦП, поэтому даже если вы закодируете этот поток, он может быть прерывистым и не подходящим для плавного воспроизведения.

person Alex    schedule 24.05.2016