Перейти к основному содержимому

JPEG-трансляция изображений

Запустите на устройстве режим JPEG-трансляции и отображайте каждое полное JPEG-изображение, полученное от SDK.

Предварительные условия

  • Устройство подключено, готово и соответствует протоколу LiveStreamingAPI.
  • Значение supportsJPEGImageLiveStreaming равно true.
  • Интерфейс способен декодировать и заменять изображения, не блокируя обратный вызов с данными.

Справочник API

Фреймворк

AIBuds.xcframework

Импорт

Swift
import AIBuds
import UIKit

Свойства

Swift
/// Whether JPEG image live streaming is supported
var supportsJPEGImageLiveStreaming: Bool { get }

Метод экземпляра

Swift
/// Start JPEG image live streaming
/// - Parameters:
///   - sessionStartCompletionHandler: Session start completion handler
///   - jpegDataReceivedHandler: JPEG data received handler
///   - sessionFinishHandler: Session finish handler
func startJPEGImageLiveStreaming(
    withSessionStartCompletionHandler sessionStartCompletionHandler:
        AIBudsLiveStreamingSessionStartCompletionHandler?,
    jpegDataReceivedHandler: AIBudsLiveStreamingJpegDataReceivedHandler?,
    sessionFinishHandler: AIBudsLiveStreamingSessionFinishHandler?
)

См. startJPEGImageLiveStreaming.

Значения обратных вызовов

ОбработчикЗначенияНазначение
sessionStartCompletionHandlersuccess, errorСообщает, удалось ли запустить сеанс трансляции.
jpegDataReceivedHandlerjpegDataПередаёт одно полное JPEG-изображение в виде Data / NSData.
sessionFinishHandlerisUserInitiatedStop, errorСообщает итог сеанса и указывает, была ли остановка инициирована пользователем.

Возвращаемое значение

Метод не возвращает значение напрямую. Медиа и события жизненного цикла передаются через обработчики.

Примеры использования

Swift
guard let streamingDevice = device as? LiveStreamingAPI,
    streamingDevice.supportsJPEGImageLiveStreaming
else { return }

streamingDevice.startJPEGImageLiveStreaming(
    withSessionStartCompletionHandler: { success, error in
        DispatchQueue.main.async {
            self.setStreamingActive(success)
            if let error { self.show(error) }
        }
    },
    jpegDataReceivedHandler: { jpegData in
        // Decode away from the UI update, then assign the image on the main queue.
        guard let image = UIImage(data: jpegData) else { return }
        DispatchQueue.main.async {
            self.imageView.image = image
        }
    },
    sessionFinishHandler: { userStopped, error in
        DispatchQueue.main.async {
            self.setStreamingActive(false)
            self.handleFinish(userStopped: userStopped, error: error)
        }
    }
)

Обработка ошибок

  • Отбрасывайте повреждённые JPEG-данные, не заменяя последнее корректное изображение.
  • Ошибка в sessionStartCompletionHandler означает, что сеанс запустить не удалось.
  • В sessionFinishHandler отличайте остановку пользователем от прерывания и обрабатывайте error, если он задан.
  • Не делайте выводов о потере кадров, частоте или гарантиях порядка сверх последовательности обратных вызовов SDK.

Рекомендации

  1. Не сохраняйте каждый JPEG-кадр: заменяйте отображаемое изображение или используйте ограниченный буфер.
  2. Выполняйте декодирование и обновление интерфейса быстро, чтобы не создавать очередь обратных вызовов.
  3. При запуске нового сеанса сбрасывайте счётчики кадров и состояние отображения.
  4. При выходе из функции вызывайте stopLiveStreaming(), а не просто скрывайте изображение.

Примечания

  • Публичный SDK не задаёт фиксированные разрешение JPEG или частоту кадров.
  • Для режима JPEG классы воспроизведения AIBudsLiveStream не требуются.
  • jpegDataReceivedHandler передаёт сжатые JPEG-данные, а не необработанные буферы пикселей.