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

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

Запустите на устройстве режим JPEG-трансляции и отображайте каждое полное JPEG-изображение, полученное от SDK. Совместимые потоки level-2 также могут передавать аудио Opus и необязательные декодированные PCM-данные.

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

  • Устройство подключено, готово и соответствует протоколу 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
///   - opusDataReceivedHandler: Opus audio data received handler (only called for level-2 Ogg/MJPEG+Opus streams)
///   - sessionFinishHandler: Session finish handler
func startJPEGImageLiveStreaming(
    withSessionStartCompletionHandler sessionStartCompletionHandler: AIBudsLiveStreamingSessionStartCompletionHandler?,
    jpegDataReceivedHandler: AIBudsLiveStreamingJpegDataReceivedHandler?,
    opusDataReceivedHandler: AIBudsLiveStreamingOpusAudioDataReceivedHandler?,
    sessionFinishHandler: AIBudsLiveStreamingSessionFinishHandler?
)

См. startJPEGImageLiveStreaming.

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

ОбработчикЗначенияНазначение
sessionStartCompletionHandlersuccess, errorСообщает, удалось ли запустить сеанс трансляции.
jpegDataReceivedHandlerjpegDataПередаёт одно полное JPEG-изображение в виде Data / NSData.
opusDataReceivedHandleropusData, decodedPcmAudioDataПередаёт исходное аудио Opus и необязательный декодированный PCM в совместимых потоках level-2.
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
        }
    },
    opusDataReceivedHandler: { opusData, decodedPcmAudioData in
        guard let decodedPcmAudioData, !decodedPcmAudioData.isEmpty else { return }
        self.consumePCM(decodedPcmAudioData)
    },
    sessionFinishHandler: { userStopped, error in
        DispatchQueue.main.async {
            self.setStreamingActive(false)
            self.handleFinish(userStopped: userStopped, error: error)
        }
    }
)

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

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

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

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

Примечания​

  • Публичный SDK не задаёт фиксированные разрешение JPEG или частоту кадров.
  • Для режима JPEG классы воспроизведения AIBudsLiveStream не требуются.
  • jpegDataReceivedHandler передаёт сжатые JPEG-данные, а не необработанные буферы пикселей.
  • Публикация RTMP использует отдельный жизненный цикл AIBudsLiveStream.LiveStreamer. Настройте режим raw feed через configure(outputURL:config:), затем только после запуска трансляции передавайте JPEG-кадры через pushJpegFrame(_:), а непустой декодированный PCM — через pushPcmAudio(_:).