Как создавать приложения SwiftUI для iOS на базе gstreamer — часть 1

Прежде чем мы начнем, код живет здесь

Я благоговею перед gstreamer с тех пор, как обнаружил его. Этим летом я возился со Swift и SwiftUI, и я хотел сделать небольшой забавный побочный проект, который объединил бы эти технологии. Идея заключалась в том — должно быть, название выдало ее — приложение для iOS, которое я мог бы использовать для потоковой передачи моих личных IP-камер по RTSP. До сих пор я использовал gstreamer, используя C/C++, а также его привязки к Python. Вопрос был в том, могу ли я заставить его хорошо работать со Swift в iOS?

Проблемы были не за горами

На сайте gstreamer есть пакеты для iOS и macOS. Итак, это решило 50% того, чего я хотел достичь.

Но когда я просмотрел разделы руководства по установке и использованию этих пакетов, к своему ужасу, я обнаружил, что все они написаны на Objective-C. Также они использовали UIKit в качестве фреймворка для рендеринга, а я очень хотел использовать SwiftUI.

Я не разработчик iOS, и до сих пор я благополучно ориентировался в своих «мастерских», не изучая старый фреймворк UIKit.

Итак, я столкнулся со своими демонами и провел несколько недель, изучая Objective-C (его синтаксис — самый непонятный из всех, что я когда-либо изучал!) и UIKit, а затем учебные пособия, чтобы понять, как использовать gstreamer в iOS. Затем я нашел способ сделать то же самое в родном Swift и SwiftUI (и без использования Objective-C и UIKit, ну почти!).

Где есть проблема, там и решение

Я задокументировал процесс, вот он.

  1. Настройка gstreamer в XCode. Вероятно, это заняло большую часть моего времени. В игре было три языка — Swift, Objective C и vanilla C. Как только я понял, как они взаимодействуют, я смог успешно собрать сборку. Все остальное было просто правильной логикой. Эта часть подробно описана в отдельном посте здесь.
  2. Написание версии того, что я хотел, на Objective-C и UIKit. Возможно, мне не нужно было этого делать, но я все равно сделал это просто ради удовольствия. Из SwiftUI основным моментом было изучение подхода к раскадровке. Поскольку это был всего лишь побочный продукт, я не буду вдаваться в подробности.
  3. Написание версии Swift и SwiftUI примера приложения RTSP для iOS на основе gstreamer. Я подробно описал это в отдельной записи в блоге здесь [подлежит уточнению] и код для тех же жизней здесь.

Надеюсь, это поможет кому-то!